L'un des plus grands avantages de l'utilisation de bases de données relationnelles telles que MySQL est que sa structure relationnelle vous permet de stocker et d'interroger facilement des informations sur plusieurs tables.
Explorons comment récupérer exactement les données que vous voulez à partir de plusieurs tables de base de données, et les différentes jointures disponibles qui vous permettent d'extraire les résultats exacts que vous voulez.
Ce n'est pas obligatoire, mais si vous souhaitez suivre les exemples de cet article, vous pouvez initialiser un exemple de base de données localement avec les commandes de terminal ci-dessous :
clone git https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampledb
mysql> SELECT COUNT(*) FROM clients ;
Vous devriez obtenir un résultat indiquant qu'il y a 2 000 lignes dans les clients tableau.
La jointure par défaut utilisée dans les bases de données MySQL s'appelle la jointure INNER et est la plus courante et la plus simple. Cette jointure renvoie tous les enregistrements pour lesquels il existe des enregistrements correspondants dans les deux tables et rejette tous les autres enregistrements.
Par exemple, si vous souhaitez voir le prénom et le nom du client, ainsi que le montant et la date de la commande pour toutes les commandes supérieures à 1 000 USD, vous pouvez utiliser l'instruction SQL suivante :
SÉLECTIONNER
c.id, c.first_name, c.last_name, o.amount, o.created_at
À PARTIR DE
clients c, commandes o
OÙ
o.customer_id =c.id AND o.amount>=1000 ;
Quelques remarques concernant la requête ci-dessus :
Vous trouverez ci-dessous une manière différente et techniquement plus correcte d'un point de vue syntaxique d'écrire la même requête :
SÉLECTIONNER
c.id, c.first_name, c.last_name, o.amount, o.created_at
À PARTIR DE
clients c Commandes INNER JOIN o
AU
id_client =c.id
OÙ
o.montant>=1000 ;
La requête ci-dessus a tendance à être un peu plus facile à lire car vous pouvez facilement voir la jointure entre la table des clients et celle des commandes. Cependant, à toutes fins utiles, ces deux requêtes sont identiques et produiront exactement les mêmes enregistrements.
Les jointures à gauche renverront tous les enregistrements de la table de gauche qui correspondent également aux enregistrements de la table de droite et rejetteront tous les autres enregistrements. Par exemple, si vous souhaitez afficher le montant total des ventes pour chaque produit de la base de données, vous pouvez essayer d'utiliser une requête telle que :
SÉLECTIONNER
p.name, sum(item.amount) AS tamount
À PARTIR DE
commandes_items article LEFT JOIN produits p
AU
item.product_id =p.id
GROUP BY item.product_id ORDER BY tamount DESC
Cela se traduit par une belle vue à deux colonnes montrant le nom du produit avec le montant total des ventes et fonctionne comme prévu. La requête a parcouru tous les produits de la table orders_items, les a joints aux enregistrements de la table products et a renvoyé le montant total des ventes de chacun.
En utilisant l'exemple ci-dessus, notez que la requête ci-dessus n'a renvoyé que 19 enregistrements alors qu'il y a un total de 22 produits dans la base de données. En effet, la requête a commencé par la table orders_items et l'a jointe à gauche à la table products, et comme certains produits n'ont jamais été commandés, aucun enregistrement de ces produits n'existe dans la table orders_items.
Que se passe-t-il si vous souhaitez obtenir une liste de tous les produits avec les montants des ventes, y compris les produits qui n'ont pas été commandés ? Essayez une jointure droite avec la requête suivante :
SÉLECTIONNER
p.name, sum(item.amount) AS tamount
À PARTIR DE
commandes_items article RIGHT JOIN produits p
AU
item.product_id =p.id
GROUP BY p.id ORDER BY tamount DESC
C'est mieux, et la requête renvoie maintenant les 22 produits complets, trois d'entre eux ayant un montant de null . En effet, au lieu d'utiliser orders_items comme table principale qui se joint à la table products, la jointure droite inverse la commande et joint la table products à la table orders_items.
Parfois, vous avez besoin de joindre trois tables ou plus pour obtenir un ensemble spécifique de résultats.
Par exemple, vous souhaitez peut-être obtenir une liste de tous les clients qui ont acheté le four à micro-ondes (identifiant du produit n° 1), y compris leur nom et la date de la commande. Cela nécessite un SELECT sur trois tables, ce qui peut être fait en utilisant deux jointures avec la requête suivante :
SÉLECTIONNER
c.first_name, c.last_name, o.amount, o.created_at
À PARTIR DE
clients c Commandes INNER JOIN o
AU
c.id =o.customer_id INNER JOIN order_items article
AU
item.order_id =o.id
OÙ
item.product_id =1 ORDER BY o.created_at ;
Cette requête renvoie les 426 commandes du micro-onde et fonctionne comme prévu. Il associe d'abord tous les clients à leurs commandes respectives, puis effectue d'autres requêtes qui résultent en faisant correspondre toutes les commandes uniquement à celles de la table orders_items qui contiennent le produit micro-ondes (id # 1).
En passant, évitez à tout prix d'utiliser des sous-requêtes avec vos requêtes SQL telles que :
SELECT first_name,last_name FROM clients WHERE id IN (SELECT customer_id FROM commandes WHERE statut ='approuvé' AND montant <100);
Les requêtes telles que ci-dessus sont très inefficaces, utilisent un grand nombre de ressources et doivent être évitées autant que possible. Au lieu de cela, utilisez les jointures appropriées comme indiqué dans les sections ci-dessus. Par exemple, la requête ci-dessus doit être réécrite comme :
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 a, espérons-le, vous montrer la puissance des bases de données relationnelles telles que MySQL et comment créer des requêtes SQL qui récupèrent les enregistrements de plusieurs tables dans une requête à l'aide de jointures, vous permettant de récupérer les résultats exacts souhaités.
Vous avez appris trois jointures différentes dans SQL, comment aliaser les noms de colonne et de table, utiliser plusieurs jointures dans une requête et pourquoi vous devriez éviter les sous-requêtes. Ne vous démenez plus jamais à essayer de compiler manuellement différents ensembles de données en un seul et commencez à utiliser des jointures pour impressionner vos collègues de travail et gagner du temps.