SQLite - JOINT

SQLite JoinsLa clause est utilisée pour combiner les enregistrements de deux ou plusieurs tables dans une base de données. Un JOIN est un moyen de combiner des champs de deux tables en utilisant des valeurs communes à chacune.

SQL définit trois principaux types de jointures -

  • Le CROSS JOIN
  • L'INTER JOIN
  • LA JOINTURE EXTÉRIEURE

Avant de continuer, considérons deux tableaux ENTREPRISE et DÉPARTEMENT. Nous avons déjà vu des instructions INSERT pour remplir la table COMPANY. Supposons donc simplement que la liste des enregistrements disponibles dans la table COMPANY -

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Un autre tableau est DEPARTMENT avec la définition suivante -

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

Voici la liste des instructions INSERT pour remplir la table DEPARTMENT -

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );

Enfin, nous avons la liste suivante des enregistrements disponibles dans la table DEPARTMENT -

ID          DEPT        EMP_ID
----------  ----------  ----------
1           IT Billing  1
2           Engineering 2
3           Finance     7

Le CROSS JOIN

CROSS JOIN correspond à chaque ligne de la première table avec chaque ligne de la deuxième table. Si les tables d'entrée ont respectivement une ligne x et y, la table résultante aura une ligne x * y. Comme les CROSS JOIN ont le potentiel de générer des tables extrêmement volumineuses, il faut veiller à ne les utiliser que lorsque cela est approprié.

Voici la syntaxe de CROSS JOIN -

SELECT ... FROM table1 CROSS JOIN table2 ...

Sur la base des tableaux ci-dessus, vous pouvez écrire un CROSS JOIN comme suit -

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

La requête ci-dessus produira le résultat suivant -

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Paul        Engineering
7           Paul        Finance
1           Allen       IT Billing
2           Allen       Engineering
7           Allen       Finance
1           Teddy       IT Billing
2           Teddy       Engineering
7           Teddy       Finance
1           Mark        IT Billing
2           Mark        Engineering
7           Mark        Finance
1           David       IT Billing
2           David       Engineering
7           David       Finance
1           Kim         IT Billing
2           Kim         Engineering
7           Kim         Finance
1           James       IT Billing
2           James       Engineering
7           James       Finance

L'INTER JOIN

INNER JOIN crée une nouvelle table de résultats en combinant les valeurs de colonne de deux tables (table1 et table2) en fonction du prédicat de jointure. La requête compare chaque ligne de table1 avec chaque ligne de table2 pour trouver toutes les paires de lignes qui satisfont le prédicat de jointure. Lorsque le prédicat de jointure est satisfait, les valeurs de colonne pour chaque paire correspondante de lignes de A et B sont combinées dans une ligne de résultat.

Une jointure intérieure est le type de jointure le plus courant et par défaut. Vous pouvez éventuellement utiliser le mot-clé INNER.

Voici la syntaxe de INNER JOIN -

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...

Pour éviter la redondance et garder le phrasé plus court, les conditions INNER JOIN peuvent être déclarées avec un USINGexpression. Cette expression spécifie une liste d'une ou plusieurs colonnes.

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...

UNE JOINTURE NATURELLE est similaire à une JOIN...USING, seulement il teste automatiquement l'égalité entre les valeurs de chaque colonne qui existe dans les deux tables -

SELECT ... FROM table1 NATURAL JOIN table2...

Sur la base des tableaux ci-dessus, vous pouvez écrire un INNER JOIN comme suit -

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La requête ci-dessus produira le résultat suivant -

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineering
7           James       Finance

LA JOINTURE EXTÉRIEURE

OUTER JOIN est une extension de INNER JOIN. Bien que la norme SQL définisse trois types de jointures externes: GAUCHE, DROITE et FULL, SQLite ne prend en charge que lesLEFT OUTER JOIN.

Les OUTER JOINs ont une condition identique aux INNER JOINs, exprimée à l'aide d'un mot clé ON, USING ou NATURAL. Le tableau des résultats initiaux est calculé de la même manière. Une fois que la jointure principale est calculée, une jointure externe prendra toutes les lignes non jointes d'une ou des deux tables, les remplira avec des valeurs NULL et les ajoutera à la table résultante.

Voici la syntaxe de LEFT OUTER JOIN -

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

Pour éviter la redondance et garder le phrasé plus court, les conditions OUTER JOIN peuvent être déclarées avec une expression USING. Cette expression spécifie une liste d'une ou plusieurs colonnes.

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...

Sur la base des tables ci-dessus, vous pouvez écrire une jointure interne comme suit -

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La requête ci-dessus produira le résultat suivant -

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineering
            Teddy
            Mark
            David
            Kim
7           James       Finance