Database
 sql >> Base de données >  >> RDS >> Database

Joindre 3 tables en SQL

En SQL, vous pouvez joindre trois tables ou plus en ajoutant une autre jointure après la première.

Vous pouvez également exécuter des jointures imbriquées en spécifiant une jointure comme condition de jointure pour une autre.

Syntaxe

La manière la plus courante de joindre trois tables ressemble à ceci :

SELECT *
FROM Table1 
INNER JOIN Table2
    ON Condition
INNER JOIN Table3
    ON Condition; 

Cela utilise une jointure interne, mais vous pouvez spécifier le type de jointure souhaité comme pour toute autre jointure. Vous pouvez également combiner les types de jointure si nécessaire (exemple ci-dessous).

Vous pouvez également utiliser des jointures imbriquées en spécifiant une jointure comme condition de jointure pour une autre jointure. Comme ceci :

SELECT *
FROM Table1 
JOIN (Table2
            JOIN Table3
            ON Condition)
ON Condition; 

Exemple de données :les 3 tableaux

Supposons que nous ayons les trois tables suivantes.

Les Customers tableau :

+--------------+-----------+---------------------- --+----------------+| ID client | NomClient | IdCitéPostale | Numéro de téléphone ||--------------+-----------------+--------------- ------------------|| 1 | Homer McKenzie | 19586 | (308) 555-0100 || 2 | Marge Pratt | 33475 | (406) 555-0100 || 3 | Vlad Bernanke | NUL | (480) 555-0100 || 4 | Bart Pitt | 21692 | (316) 555-0100 || 5 | Lisa McQueen | 12748 | (212) 555-0100 || 6 | Steve Simpson | 17054 | (701) 555-0100 || 7 | Vinn Allen | 12152 | (423) 555-0100 || 8 | Veejay Smith | 3673 | (303) 555-0100 || 9 | Kasey Chin | 23805 | (201) 555-0100 || 10 | Borat Lee | 37403 | (701) 555-0100 |+----------------------+------------+---------- ------+----------------+(10 lignes concernées)

Les Cities tableau :

+----------+----------------+------------------ -+--------------+| ID de ville | NomVille | ÉtatProvinceId | Habitants ||----------+----------------+------------------- +---------------------|| 3673 | Arc Mar | 6 | 866 || 12152 | affranchissement | 44 | NUL || 12748 | Gasport | 33 | 1248 || 21692 | Pavillon de médecine | 17 | 2009 || 26483 | Vallée des Peuples | 3 | 428 || 33475 | Sylvanite | 27 | 103 || 17054 | Jesse | 35 | 25 || 19586 | Lisco | 28 | NUL || 37403 | Wimbledon | 35 | 216 |+----------+----------------+--------------------------- +--------------+(9 lignes concernées)

Les StateProvinces tableau :

+--------------+---------------------+---- -----------------+-------------+--------------+| ÉtatProvinceId | StateProvinceCode | StateProvinceName | ID pays | Population ||--------------+---------------------+----- ----------------+-------------+--------------|| 3 | AZ | Arizona | 230 | 6891688 || 6 | CO | Colorado | 230 | 5698265 || 17 | KS | Kansas | 230 | 2893957 || 28 | NE | Nebraska | 230 | 1943256 || 31 | New Jersey | New-Jersey | 230 | 8899339 || 33 | NY | New-York | 230 | 20437172 || 35 | ND | Dakota du Nord | 230 | 723393 || 44 | TN | Tennessee | 230 | 6495978 |+-------------+---------------------+----- ----------------+-------------+-------------+(8 lignes concernées )

Exemple 1 – Jointure interne 3 tables

Le type de jointure le plus populaire est la jointure interne, nous allons donc commencer par cela.

Voici un exemple de jointure des trois tables ci-dessus avec deux jointures internes.

SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
INNER JOIN Customers cu  
ON cu.PostalCityId = ci.CityId; 

Résultat :

+---------------------+----------------+------- ---------+| StateProvinceName | NomVille | NomClient ||---------------------+----------------+-------- --------|| Nebraska | Lisco | Homer McKenzie || Kansas | Pavillon de médecine | Bart Pitt || New-York | Gasport | Lisa McQueen || Dakota du Nord | Jesse | Steve Simpson || Tennessee | affranchissement | Vinn Allen || Colorado | Arc Mar | Veejay Smith || Dakota du Nord | Wimbledon | Borat Lee |+----------------------+----------------+------- ---------+(7 lignes concernées)

Exemple 2 - Combinaison de types de jointure

Vous pouvez combiner les types de jointure lorsque vous joignez trois tables ou plus.

Voici un exemple de combinaison d'une jointure interne avec une jointure gauche.

SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
LEFT JOIN Customers cu  
ON cu.PostalCityId = ci.CityId; 

Résultat :

---------------------+----------------+-------- --------+| StateProvinceName | NomVille | NomClient ||---------------------+----------------+-------- --------|| Colorado | Arc Mar | Veejay Smith || Tennessee | affranchissement | Vinn Allen || New-York | Gasport | Lisa McQueen || Kansas | Pavillon de médecine | Bart Pitt || Arizona | Vallée des Peuples | NUL || Dakota du Nord | Jesse | Steve Simpson || Nebraska | Lisco | Homer McKenzie || Dakota du Nord | Wimbledon | Borat Lee |+----------------------+----------------+------- ---------+(8 lignes concernées)

Dans ce cas, nous avons une ville (Peeples Valley) qui n'a pas encore de clients.

La raison pour laquelle nous pouvons maintenant voir ces informations est que la jointure gauche renvoie des lignes contenant des données dans la table de gauche, même s'il n'y a pas de lignes correspondantes dans la table de gauche.

L'exemple précédent qui combinait deux jointures internes n'a pas renvoyé cette ligne, car les jointures internes suppriment les lignes sans correspondance des deux tables. Il ne renvoie des lignes que lorsqu'il existe au moins une ligne dans les deux tables qui correspond à la condition de jointure.

Nouveaux exemples de données – 3 tableaux différents

Pour les exemples restants, nous utiliserons les tableaux suivants.

Les PetTypes tableau :

+---------------------+-----------+| IDTypeAnimal | TypeAnimal ||-------------+-----------|| 1 | Oiseau || 2 | Chat || 3 | Chien || 4 | Lapin |+-------------+-----------+(4 lignes concernées)

Les Pets tableau :

+---------+-------------+-----------+---------- -+------------+| ID animal | IDTypeAnimal | Identifiant du propriétaire | NomAnimal | Date de naissance ||---------+------------+-----------+----------- +--------------------|| 1 | 2 | 3 | Moelleux | 2020-11-20 || 2 | 3 | 3 | Récupérer | 2019-08-16 || 3 | 2 | 2 | gratter | 2018-10-01 || 4 | 3 | 3 | remuer | 2020-03-15 || 5 | 1 | 1 | Tweeter | 2020-11-28 || 6 | 3 | 4 | Moelleux | 2020-09-17 || 7 | 3 | 2 | Écorce | NUL || 8 | 2 | 4 | Miaou | NULL |+---------+-------------+-----------+----------- +--------------------+(8 lignes concernées)

Les Owners tableau :

+-----------+-------------+------------+------- ---------+-------------------+| Identifiant du propriétaire | Prénom | Nom | Téléphone | E-mail ||-----------+-------------+------------+-------- --------+-------------------|| 1 | Homère | Connery | (308) 555-0100 | [email protected] || 2 | Bart | Pitt | (231) 465-3497 | [email protected] || 3 | Nancy | Simpson | (489) 591-0408 | NUL || 4 | Boris | Atout | (349) 611-8908 | NUL || 5 | Boisé | Eastwood | (308) 555-0112 | [email protected] |+-----------+-------------+------------+---- ------------+-------------------+

Notez que :

  • Le PetTypeId colonne des Pets table est une clé étrangère de PetTypeId des PetTypes table (qui est la clé primaire de cette table).
  • Le OwnerId colonne des Pets table est une clé étrangère de OwnerId colonne des Owners tableau.

Exemple 3 – Joindre à gauche 3 tables

Faisons une jointure à trois tables en utilisant deux jointures à gauche.

Voici un exemple d'exécution de deux jointures gauches sur ces tables.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o LEFT JOIN Pets p
    ON p.OwnerId = o.OwnerId
LEFT JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId; 

Résultat :

+-----------+-----------+-----------+| NomAnimal | TypeAnimal | Propriétaire ||-----------+-----------+----------------|| Tweeter | Oiseau | Homer Connery || gratter | Chat | Bart Pitt || Écorce | Chien | Bart Pitt || Moelleux | Chat | Nancy Simpson || Récupérer | Chien | Nancy Simpson || remuer | Chien | Nancy Simpson || Moelleux | Chien | Boris Trump || Miaou | Chat | Boris Trump || NUL | NUL | Woody Eastwood |+-----------+-----------+----------------+(9 rangs concernés) 

Ici, nous avons un propriétaire d'animal qui n'a pas d'animal. Nous pouvons vérifier cela en regardant le Pets.OwnerId colonne, et voyant qu'il n'y a pas de valeur qui corresponde au OwnerId de Woody Eastwood dans le Owners tableau.

Exemple 4 – Joindre à droite 3 tables

La jointure droite est l'opposée de la jointure gauche. Voici un exemple utilisant les trois mêmes tables.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o 
    ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId; 

Résultat :

+-----------+-----------+---------------+| NomAnimal | TypeAnimal | Propriétaire ||-----------+-----------+---------------|| Tweeter | Oiseau | Homer Connery || Moelleux | Chat | Nancy Simpson || gratter | Chat | Bart Pitt || Miaou | Chat | Boris Trump || Récupérer | Chien | Nancy Simpson || remuer | Chien | Nancy Simpson || Moelleux | Chien | Boris Trump || Écorce | Chien | Bart Pitt || NUL | Lapin | |+-----------+-----------+---------------+(9 lignes concernées)

Cette fois, nous avons un type d'animal de compagnie supplémentaire (Rabbit ), mais pas le propriétaire supplémentaire. En effet, les jointures à droite renvoient des lignes contenant des données dans la table de droite, même s'il n'y a pas de lignes correspondantes dans la table de gauche.

Au fait, la raison pour laquelle le dernier PetOwner n'est pas NULL (comme le dernier PetName est) parce que c'est le résultat d'une concaténation de chaînes. J'ai utilisé le T-SQL CONCAT() fonction pour concaténer les noms et prénoms du propriétaire.

Exemple 5 – Jointure complète de 3 tables

La jointure complète revient à avoir une jointure gauche et droite en une seule. Il renvoie toutes les lignes, tant qu'il y a des données correspondantes dans l'une des tables.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
    ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId; 

Résultat :

+-----------+-----------+-----------+| NomAnimal | TypeAnimal | Propriétaire ||-----------+-----------+----------------|| Tweeter | Oiseau | Homer Connery || gratter | Chat | Bart Pitt || Écorce | Chien | Bart Pitt || Moelleux | Chat | Nancy Simpson || Récupérer | Chien | Nancy Simpson || remuer | Chien | Nancy Simpson || Moelleux | Chien | Boris Trump || Miaou | Chat | Boris Trump || NUL | NUL | Woody Eastwood || NUL | Lapin | |+-----------+-----------+----------------+(10 lignes concernées) 

Cette fois, nous obtenons une combinaison des résultats obtenus dans les deux exemples précédents.

Exemple 6 – Jointures imbriquées

Comme mentionné, vous pouvez également faire des jointures imbriquées.

Voici un exemple de jointure imbriquée.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o 
LEFT JOIN    (Pets p
        LEFT JOIN PetTypes pt
        ON p.PetTypeId = pt.PetTypeId)
ON p.OwnerId = o.OwnerId; 

Résultat :

+-----------+-----------+-----------+| NomAnimal | TypeAnimal | Propriétaire ||-----------+-----------+----------------|| Tweeter | Oiseau | Homer Connery || gratter | Chat | Bart Pitt || Écorce | Chien | Bart Pitt || Moelleux | Chat | Nancy Simpson || Récupérer | Chien | Nancy Simpson || remuer | Chien | Nancy Simpson || Moelleux | Chien | Boris Trump || Miaou | Chat | Boris Trump || NUL | NUL | Woody Eastwood |+-----------+-----------+----------------+(9 rangs concernés)