PostgreSQL - JOINT

Le PostgreSQL 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.

Les types de jointure dans PostgreSQL sont -

  • Le CROSS JOIN
  • L'INTER JOIN
  • La jointure externe gauche
  • LA BONNE JOINTURE EXTÉRIEURE
  • LA JOINTURE EXTÉRIEURE COMPLÈTE

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 la liste des enregistrements disponibles dans la table COMPANY -

id | name  | age | address   | salary | join_date
----+-------+-----+-----------+--------+-----------
  1 | Paul  |  32 | California|  20000 | 2001-07-13
  3 | Teddy |  23 | Norway    |  20000 |
  4 | Mark  |  25 | Rich-Mond |  65000 | 2007-12-13
  5 | David |  27 | Texas     |  85000 | 2007-12-13
  2 | Allen |  25 | Texas     |        | 2007-12-13
  8 | Paul  |  24 | Houston   |  20000 | 2005-07-13
  9 | James |  44 | Norway    |   5000 | 2005-07-13
 10 | James |  45 | Texas     |   5000 | 2005-07-13

Une autre table est DEPARTMENT, a 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

Un 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 des colonnes x et y, la table résultante aura des colonnes x + y. Dans la mesure où les CROSS JOINs 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, nous pouvons écrire un CROSS JOIN comme suit -

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

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

emp_id| name  |  dept
------|-------|--------------
    1 | Paul  | IT Billing
    1 | Teddy | IT Billing
    1 | Mark  | IT Billing
    1 | David | IT Billing
    1 | Allen | IT Billing
    1 | Paul  | IT Billing
    1 | James | IT Billing
    1 | James | IT Billing
    2 | Paul  | Engineering
    2 | Teddy | Engineering
    2 | Mark  | Engineering
    2 | David | Engineering
    2 | Allen | Engineering
    2 | Paul  | Engineering
    2 | James | Engineering
    2 | James | Engineering
    7 | Paul  | Finance
    7 | Teddy | Finance
    7 | Mark  | Finance
    7 | David | Finance
    7 | Allen | Finance
    7 | Paul  | Finance
    7 | James | Finance
    7 | James | Finance

L'INTER JOIN

Un 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 table1 et table2 sont combinées dans une ligne de résultat.

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

Voici la syntaxe de INNER JOIN -

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;

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

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

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

emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering

La jointure externe gauche

OUTER JOIN est une extension de INNER JOIN. La norme SQL définit trois types de jointures externes: GAUCHE, DROITE et COMPLETE et PostgreSQL les prend en charge toutes.

En cas de jointure externe gauche, une jointure interne est effectuée en premier. Ensuite, pour chaque ligne de la table T1 qui ne satisfait pas la condition de jointure avec une ligne de la table T2, une ligne jointe est ajoutée avec des valeurs nulles dans les colonnes de T2. Ainsi, la table jointe a toujours au moins une ligne pour chaque ligne dans T1.

Voici la syntaxe de LEFT OUTER JOIN -

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

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

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

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

emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |

LA BONNE JOINTURE EXTÉRIEURE

Tout d'abord, une jointure interne est effectuée. Ensuite, pour chaque ligne de la table T2 qui ne satisfait pas la condition de jointure avec une ligne de la table T1, une ligne jointe est ajoutée avec des valeurs nulles dans les colonnes de T1. C'est l'inverse d'une jointure gauche; le tableau des résultats aura toujours une ligne pour chaque ligne dans T2.

Voici la syntaxe de RIGHT OUTER JOIN -

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

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

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

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

emp_id | name  | dept
--------+-------+--------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance

LA JOINTURE EXTÉRIEURE COMPLÈTE

Tout d'abord, une jointure interne est effectuée. Ensuite, pour chaque ligne de la table T1 qui ne satisfait pas la condition de jointure avec une ligne de la table T2, une ligne jointe est ajoutée avec des valeurs nulles dans les colonnes de T2. De plus, pour chaque ligne de T2 qui ne satisfait pas la condition de jointure avec une ligne de T1, une ligne jointe avec des valeurs nulles dans les colonnes de T1 est ajoutée.

Voici la syntaxe de FULL OUTER JOIN -

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

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

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

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

emp_id | name  | dept
--------+-------+---------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |