Dans la leçon précédente, nous avons posé le concept de base des jointures pour récupérer des données liées. Le type de jointure le plus courant et le plus utilisé est l'INNER JOIN. Dans cette leçon, nous allons détailler sa logique, sa syntaxe et ses usages pratiques.
Un INNER JOIN combine les lignes de deux tables uniquement lorsqu'il existe une valeur correspondante dans les deux tables selon une condition donnée. Si une ligne de la Table A n'a pas de correspondance dans la Table B, elle est exclue du résultat. Idem pour les lignes de la Table B sans correspondance dans la Table A.
C'est l'intersection de deux ensembles de données.
Visualisation :
Table A (customer) Table B (payment)
+----+----------+ +----+----------+
| id | nom | | id | montant |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | 10.00 | (Correspondance !)
| 2 | Bob | | 1 | 15.00 | (Correspondance !)
| 3 | Charlie | | 4 | 20.00 | (Pas de correspondance pour Charlie ou ID 4)
+----+----------+ +----+----------+
Charlie est exclu car il n'a pas de paiement, et le paiement avec customer_id 4 est exclu car il n'y a pas de client avec cet ID.
La syntaxe standard :
SELECT
table1.colonne1,
table2.colonne2
FROM
table1
INNER JOIN
table2 ON table1.colonne_commune = table2.colonne_commune;
INNER JOIN : indique qu'on ne veut que les lignes correspondantes.ON : définit la condition de correspondance (souvent la clé primaire d'une table et la clé étrangère de l'autre).Remarque : Dans la plupart des bases SQL (MySQL, PostgreSQL, SQL Server), le mot-clé
INNERest optionnel.JOINetINNER JOINdonnent le même résultat.
La table city contient un country_id qui référence la table country. Pour voir le nom de la ville et du pays :
SELECT
ci.city,
co.country
FROM
city AS ci
INNER JOIN
country AS co ON ci.country_id = co.country_id;
Cette requête ne retourne que les villes liées à un pays valide.
Pour trouver où chaque membre du personnel habite, on joint staff et address :
SELECT
s.first_name,
s.last_name,
a.address,
a.district
FROM
staff AS s
INNER JOIN
address AS a ON s.address_id = a.address_id;
On peut chaîner plusieurs INNER JOIN pour rassembler des infos de plusieurs tables. Par exemple, pour voir dans quels films un acteur a joué, il faut trois tables : actor, film, et la table de liaison film_actor.
SELECT
a.first_name,
a.last_name,
f.title
FROM
actor AS a
INNER JOIN
film_actor AS fa ON a.actor_id = fa.actor_id
INNER JOIN
film AS f ON fa.film_id = f.film_id
LIMIT 10;
Comment ça fonctionne :
actor et film_actor via actor_id.film via film_id.INNER JOIN successifs.AS ci, AS co) rend les jointures complexes plus lisibles.