Union/except
Pour clôturer ce chapitre et ce cours, nous allons voir les cousins de la jointure : les unions et les désunions (si on peut traduire ça comme ça).
UNION
Même si le mot jointure fait penser à l’union, ces deux concepts sont très différents. En effet, la jointure modifie les attributs d’une table et donc modifie les objets (tuples, lignes, observations). C’est donc toute la classe qui se trouve modifiée.
A l’opposé, l’union réunit des objets de la même classe. La table garde donc la même structure, les mêmes attributs et absorbe de nouveaux objets.
Nous pouvons dire que la jointure est horizontale et l’union est verticale :
JOIN
: A1 + B1
UNION
: A1
+
A2
Cependant, si UNION
réunit des objets de la même classe, il faut absolument que les deux tables à unir possèdes exactement les mêmes attributs et dans le même ordre, les mêmes types et les mêmes formats, ou bien il faut sélectionner uniquement les attributs en commun qui ont les mêmes types.
SELECT <colonnes_table1>
FROM <table1>
UNION
SELECT <colonnes_table2>
FROM <table2> ;
Exemple
Imaginons que nous ayons 8 tables, chacune correspondant à une station de Barcelone :
Notre objectif est d’unir ces tables ensemble pour retrouver notre table complète de base ‘air_quality’.
SELECT * FROM ciutadella
UNION SELECT * FROM eixample
UNION SELECT * FROM gracia
UNION SELECT * FROM observ_fabra
UNION SELECT * FROM palau_reial
UNION SELECT * FROM poblenou
UNION SELECT * FROM sants
UNION SELECT * FROM vall_hebron
ORDER BY id;
NB : il existe deux types d’union : UNION
et UNION ALL
. Les deux fonctionnements sont les mêmes, à la différence que s’il existe des lignes communes entre les deux tables, UNION
supprime les doublons alors que UNION ALL
garde les doublons.
EXCEPT
La clause EXCEPT
est exactement comme la clause UNION
, mais comme vous l’avez compris, elle n’ajoute pas d’objet, elle les soustrait.
NB : EXCEPT
est la syntaxe propre à PostgreSQL, dans d’autres SGDB vous pourrez trouver MINUS
(MySQL, Oracle), qui est son équivalent.
EXCEPT
: A1
–
A2
Comme pour UNION
, EXCEPT
ne fonctionne qu’avec des tables qui ont exactement les mêmes structures, les mêmes attributs, types et formats.
SELECT <colonnes_table1>
FROM <table1>
EXCEPT
SELECT <colonnes_table2>
FROM <table2> ;
Exemple
Reprenons l’exemple de nos 8 tables où chacune correspond à une station de Barcelone. Imaginons que nous voulons retirer toutes les données sur les stations ‘Barcelona – Gracia’ et ‘Barcelona – Sants’ de la table ‘air_quality’ :
Nous devons donc soustraire les tables ‘gracia’ et ‘sants’ de la table ‘air_quality’.
SELECT * FROM air_quality
EXCEPT SELECT * FROM gracia
EXCEPT SELECT * FROM sants
ORDER BY id;