jeudi 31 janvier 2019

L'art et la manière du JOIN en SQL

En SQL, rien de plus simple et de plus compliquée à la fois que l'association de 2 tables.
Au début de mon apprentissage SQL, je ne connaissais que l'association de type:
    SELECT * FROM A,B WHERE C1=C2;

Comme Monsieur Jourdain, je faisais des jointures sans le savoir. J'étais à cette époque un homme inconscient de la terrible complexité de l'association de 2 tables.  Depuis j'ai découvert la syntaxe suivante (massivement utilisée actuellement):
  SELECT * FROM A LEFT JOIN B ON C1=C2;
C'est en étudiant ces "OUTER, INNER FULL, RIGH, LEFT JOIN and co" que j'ai pu apprécier la douce complexité d'un produit de matrice.

Plutôt qu'un long discours, voici 2 copies d'écrans permettant de faire un état de l'art des jointures SQL:

Le pré-requis pour comprendre ces différentes jointures, est la notion de "NULL", qui désigne une valeur (une cellule) qui ne peut être renseignée (déterminée) lors d'une jointure. Si vous voyez "null" suite à un SELECT, cela signifie qu'une valeur n'a pas pu être renseignée. Dans le cas d'une jointure à gauche par exemple (LEFT JOIN), cela signifie certainement qu'une ligne à gauche n'a pas trouvée de correspondance à droite (selon le critère ON spécifié). A noté que suite à de simple INSERT, on peut éventuellement créée des lignes avec des valeurs "null". La notion "null" est une notion centrale dans la logique SQL, essentielle bien au delà des jointures.


Voici la version texte (testée avec SQL Server 2012) :
DECLARE @T1 TABLE ( A int , B varchar(2) );
DECLARE @T2 TABLE ( C int , D varchar(2) );

INSERT INTO @T1
VALUES
(1,'a'),
(2,'b'),
(3,'c'),
(4,'d');

INSERT INTO @T2
VALUES
(1,'f'),
(1,'g'),
(4,'h'),
(5,'i');

SELECT * FROM @T1
    FULL OUTER JOIN @T2 ON A=C;

SELECT * FROM @T1
    RIGHT JOIN @T2 ON A=C;

SELECT * FROM @T1
    LEFT JOIN @T2 ON A=C;

SELECT * FROM @T1, @T2;

SELECT * FROM @T1, @T2
 WHERE A=C;

SELECT * FROM @T1
    FULL JOIN @T2 ON A=C
    WHERE A is null OR C IS NULL;