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;