L'un des principaux atouts des bases de données relationnelles comme MySQL réside dans leur structure qui permet de stocker et d'interroger facilement des données réparties sur plusieurs tables.
Découvrez comment extraire précisément les informations souhaitées à partir de multiples tables grâce aux jointures SQL, et explorez les différents types de jointures pour obtenir les résultats attendus.
Non obligatoire, mais pour reproduire les exemples de cet article, initialisez une base de données locale avec ces commandes terminal :
git clone https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql < magasin.sql
sudo mysql sampledb
mysql> SELECT COUNT(*) FROM clients;Vous devriez obtenir un résultat indiquant 2 000 lignes dans la table clients.
La jointure INNER est la plus courante et simple en MySQL. Elle retourne uniquement les enregistrements ayant des correspondances dans les deux tables.
Par exemple, pour afficher le prénom et nom du client, ainsi que le montant et la date des commandes supérieures à 1 000 USD :
SELECT
c.id, c.first_name, c.last_name, o.amount, o.created_at
FROM
clients c
INNER JOIN commandes o ON o.customer_id = c.id
WHERE
o.amount >= 1000;Remarques sur cette requête :
Une syntaxe équivalente et plus lisible :
SELECT
c.id, c.first_name, c.last_name, o.amount, o.created_at
FROM
clients c
INNER JOIN commandes o ON o.customer_id = c.id
WHERE
o.amount >= 1000;Ces deux formes produisent les mêmes résultats.
Les jointures LEFT retournent tous les enregistrements de la table de gauche, avec les correspondances de la table de droite (NULL si aucune).
Pour le montant total des ventes par produit :
SELECT
p.name, SUM(item.amount) AS tamount
FROM
commandes_items item
LEFT JOIN produits p ON item.product_id = p.id
GROUP BY item.product_id
ORDER BY tamount DESC;Cela affiche le nom du produit et le total des ventes.
La requête précédente ne retourne que 19 produits sur 22, car certains n'ont pas été commandés.
Pour inclure tous les produits (avec NULL pour les non commandés) :
SELECT
p.name, SUM(item.amount) AS tamount
FROM
commandes_items item
RIGHT JOIN produits p ON item.product_id = p.id
GROUP BY p.id
ORDER BY tamount DESC;Vous obtenez les 22 produits, dont trois avec NULL.
Pour joindre trois tables ou plus, enchaînez les jointures.
Exemple : clients ayant acheté le micro-ondes (product_id = 1) :
SELECT
c.first_name, c.last_name, o.amount, o.created_at
FROM
clients c
INNER JOIN commandes o ON c.id = o.customer_id
INNER JOIN commandes_items item ON item.order_id = o.id
WHERE
item.product_id = 1
ORDER BY o.created_at;Cela retourne les 426 commandes concernées.
Les sous-requêtes comme celle-ci sont inefficaces :
SELECT first_name, last_name FROM clients WHERE id IN (SELECT customer_id FROM commandes WHERE status = 'approved' AND amount < 100);Préférez les jointures :
SELECT c.first_name, c.last_name
FROM clients c
LEFT JOIN commandes o ON o.customer_id = c.id
WHERE o.status = 'approved' AND o.amount < 100;Cet article démontre la puissance des jointures SQL en MySQL pour extraire des données de plusieurs tables efficacement. Vous maîtrisez désormais INNER, LEFT, RIGHT JOIN, les alias, les jointures multiples et l'évitement des sous-requêtes. Impressionnez vos collègues et optimisez vos requêtes !