FRFAM.COM >> Famille >> Technologie &Innovation >> Informatique

Maîtriser les jointures SQL : interroger plusieurs tables MySQL en une seule requête

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.

Initialiser l'exemple de base de données

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.

Jointure par défaut (INNER JOIN)

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 :

  • Cinq colonnes sont sélectionnées : trois de la table clients et deux de commandes.
  • Les alias "c" et "o" simplifient la syntaxe.
  • o.customer_id = c.id définit la condition de jointure.

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.

Jointures LEFT

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.

Jointures RIGHT

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.

Plusieurs jointures dans une requête

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.

Évitez les sous-requêtes avec IN

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;

Gagnez du temps avec les jointures SQL

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 !


[]