SQLite Join

La clauseJoinde SQLite est utilisée pour combiner des enregistrements de tables dans deux ou plusieurs bases de données. JOIN est un moyen de combiner des champs de deux tables au moyen de valeurs communes.

SQL définit trois principaux types de jointures :

  • Jointure croisée - CROSS JOIN

  • Jointure interne - INNER JOIN

  • Jointure externe - OUTER JOIN

Avant de continuer, supposons qu'il existe deux tables, COMPANY et DEPARTMENT. Nous avons déjà vu les instructions INSERT utilisées pour remplir la table COMPANY. Supposons maintenant que la liste des enregistrements dans la table COMPANY est la suivante :

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

L'autre table est DEPARTMENT, définie comme suit :

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

Ci-dessous se trouvent les 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 d'enregistrements dans la table DEPARTMENT :

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

Jointure croisée - CROSS JOIN

Un CROSS JOIN associe chaque ligne de la première table à chaque ligne de la seconde table. Si les deux tables d'entrée ont respectivement x et y lignes, la table de résultat a x*y lignes. Étant donné qu'un CROSS JOIN peut potentiellement produire des tables très volumineuses, il doit être utilisé avec prudence, uniquement lorsque cela est approprié.

L'opération d'une jointure croisée renvoie le produit cartésien de toutes les lignes de données des deux tables jointes. Le nombre de lignes de données renvoyées est égal au nombre de lignes de données de la première table qui satisfont aux conditions de la requête multiplié par le nombre de lignes de données de la seconde table qui satisfont aux conditions de la requête.

Ci-dessous se trouve la syntaxe pour CROSS JOIN :

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

D'après les tables ci-dessus, nous pouvons é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        Engineerin
7           Paul        Finance
1           Allen       IT Billing
2           Allen       Engineerin
7           Allen       Finance
1           Teddy       IT Billing
2           Teddy       Engineerin
7           Teddy       Finance
1           Mark        IT Billing
2           Mark        Engineerin
7           Mark        Finance
1           David       IT Billing
2           David       Engineerin
7           David       Finance
1           Kim         IT Billing
2           Kim         Engineerin
7           Kim         Finance
1           James       IT Billing
2           James       Engineerin
7           James       Finance

Jointure interne - INNER JOIN

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

INNER JOIN est le type de jointure le plus courant et est le type de jointure par défaut. Le mot-clé INNER est facultatif.

Ci-dessous se trouve la syntaxe pour INNER JOIN :

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

Pour éviter la redondance et garder une formulation plus courte, vous pouvez utiliserUSINGexpression pour déclarer la condition INNER JOIN. Cette expression spécifie une liste d'une ou plusieurs colonnes :

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

NATURAL JOIN est similaire àJOIN...USING, sauf qu'il teste automatiquement l'égalité entre les valeurs de chaque colonne qui existe dans les deux tables :

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

D'après les tables ci-dessus, nous pouvons é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       Engineerin
7           James       Finance

Jointure externe - OUTER JOIN

OUTER JOIN est une extension de INNER JOIN. Bien que le standard SQL définisse trois types de jointures externes : LEFT, RIGHT et FULL, SQLite ne prend en charge queLEFT OUTER JOIN。

La façon dont OUTER JOIN déclare les conditions est la même que pour INNER JOIN, en utilisant les mots-clés ON, USING ou NATURAL. La table de résultats initiale est calculée de la même manière. Une fois le calcul de la jointure principale terminé, OUTER JOIN fusionne toutes les lignes non jointes d'une ou des deux tables, en utilisant des valeurs NULL pour les colonnes de jointure externe, et les ajoute à la table de résultats.

Voici la syntaxe pour LEFT OUTER JOIN :

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

Pour éviter les redondances et raccourcir la formulation, vous pouvez utiliser l'expressionUSINGpour déclarer la condition OUTER JOIN. Cette expression spécifie une liste d'une ou plusieurs colonnes :

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

D'après les tables ci-dessus, nous pouvons écrire un OUTER JOIN 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       Engineerin
            Teddy
            Mark
            David
            Kim
7           James       Finance
Autres extensions