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 desPets
table est une clé étrangère dePetTypeId
desPetTypes
table (qui est la clé primaire de cette table). - Le
OwnerId
colonne desPets
table est une clé étrangère deOwnerId
colonne desOwners
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)