Comment lier deux tables en SQL
L'interrogation de données provenant de plusieurs tables est très courante lorsqu'on travaille avec des bases de données relationnelles. Ce n'est pas difficile si vous savez comment utiliser les opérateurs SQL dédiés à cette tâche. Dans cet article, vous apprendrez comment lier deux tables en utilisant WHERE et l'opérateur spécial JOIN, et vous verrez comment filtrer les lignes dans le jeu de résultats.
Si vous souhaitez vous entraîner à lier des tables en SQL, consultez notre cours interactif Les jointures en SQL. Il propose plus de 90 exercices pratiques sur différents types de JOIN. Pour d'autres cours pratiques SQL, consultez notre article La pratique du SQL.
Comment interroger une seule table
Tout d'abord, un petit rappel sur la façon de sélectionner des données dans une seule table. Considérons la table suivante, product
:
id | name | price |
---|---|---|
1 | Smartwatch Erin | 234.00 |
2 | Smartwatch Sun | 455.00 |
3 | Smartband Eli | 300.00 |
4 | Smartband White | 124.00 |
Pour sélectionner les données de toutes les colonnes et de toutes les lignes de cette table, vous pouvez utiliser la requête :
SELECT id, name , price FROM product; |
Dans cette requête simple, les noms des colonnes dont vous voulez extraire les données sont énumérés après SELECT
. Suivent le mot-clé FROM
et le nom de la table dans laquelle les données sont stockées.
Vous pouvez également filtrer les lignes pour ne renvoyer que les enregistrements qui correspondent aux critères donnés. Jetez un coup d'œil au code SQL suivant :
SELECT name , price FROM product WHERE price < 250.00; |
Dans ce cas, le jeu de résultats ne comprend que deux lignes avec les colonnes nom et price
:
name | price |
---|---|
Smartwatch Erin | 234.00 |
Smartband White | 124.00 |
Les colonnes sont énumérées après SELECT
, puis le mot-clé FROM
permet de spécifier la table à partir de laquelle vous récupérez les données. À la fin de la requête, le mot-clé WHERE
est suivi de la condition de filtrage. Dans cet exemple, la condition compare la valeur de la colonne price
à 250.00. La requête renvoie les détails d'un produit uniquement si le prix de ce produit est inférieur à 250,00.
Interroger des données provenant de plusieurs tables à l'aide de WHERE
Les bases de données relationnelles sont constituées de plusieurs tables qui se réfèrent les unes aux autres. Les lignes d'une table font référence à des lignes spécifiques d'une autre table, qui sont reliées par une ou plusieurs colonnes d'identification. Nous allons maintenant voir comment lier les données d'une table à celles d'une autre table.
Considérez les deux tables suivantes , product
et category
dans une base de données sur les produits de l'entrepôt :
product
id | product_name | price | category_id |
---|---|---|---|
1 | smartwatch | 235.00 | 2 |
2 | bricks | 26.70 | 3 |
3 | lamp | 128.00 | 2 |
4 | sofa | 3200.00 | 1 |
5 | desk | 1350.00 | 1 |
6 | power strip | 29.00 | 2 |
category
id | category_name |
---|---|
1 | furniture |
2 | electronics |
3 | toys |
Disons que vous avez besoin de certains détails de cette base de données de l'entrepôt, comme le nom des produits, le prix et leurs catégories respectives. Vous pouvez lier les lignes de la table product
avec les lignes de la table category
à l'aide d'une clause WHERE. Jetez un coup d'œil à la requête ci-dessous :
SELECT product.product_name, product.price, category.category_name FROM product, category WHERE product.category_id = category.id ; |
Voici l'ensemble des résultats :
product_name | price | category_name |
---|---|---|
smartwatch | 235.00 | electronics |
bricks | 26.70 | toys |
lamp | 128.00 | electronics |
sofa | 3200.00 | furniture |
desk | 1350.00 | furniture |
power strip | 29.00 | electronics |
Dans cette requête, SELECT
répertorie les colonnes des deux tables : product_name
et price
de la table product
et category_name
de la table category
table. Chaque nom de colonne est précédé du nom de la table correspondante, séparé par un point.
Ensuite, les noms des tables sont énumérés après le mot-clé FROM
, séparés par des virgules.
La dernière partie de cette requête est un WHERE
, avec une condition qui spécifie comment lier les lignes des deux tables. Ici, les valeurs de la colonne category_id
de la table product
correspondent aux valeurs de la colonne id de la table category
et les lignes sont liées lorsque les valeurs sont égales (product.category_id = category.id
). La montre intelligente de la table product
a un identifiant de catégorie de 2. La même valeur dans la colonne id
de la table category
pointe vers "jouets" comme indiqué en bleu ci-dessus.
Si des colonnes portent le même nom dans les deux tables, elles doivent être distinguées lorsque vous les nommez dans SELECT
. Pour ce faire, vous nommez la table, suivie d'un point puis du nom de la colonne. Dans notre exemple, cependant, les tables ont des noms de colonnes différents qui n'ont rien en commun. Nous pouvons utiliser uniquement les noms de colonnes dans SELECT
sans préciser de quelles tables ils proviennent, comme dans la requête ci-dessous :
SELECT product_name, price, category_name FROM product, category WHERE product.category_id = category.id ; |
L'utilisation de WHERE
est un moyen d'interroger des données provenant de plusieurs tables. Il s'agit d'une ancienne norme SQL ; bien qu'elle soit toujours disponible, elle est rarement utilisée. Dans la section suivante, nous allons examiner une autre méthode.
Interrogation de données à partir de plusieurs tables à l'aide de JOIN
Aujourd'hui, la méthode la plus courante pour lier des données provenant de plusieurs tables consiste à utiliser l'opérateur spécial JOIN
, également connu sous le nom de INNER JOIN
. Pour voir comment cela fonctionne, nous allons utiliser les deux mêmes tables de la base de données de l'entrepôt, que vous trouverez ci-dessous pour plus de commodité.
product
id | name | price | category_id |
---|---|---|---|
1 | smart watch | 235.00 | 2 |
2 | bricks | 26.70 | 3 |
3 | lamp | 128.00 | 2 |
4 | sofa | 3200.00 | 1 |
5 | desk | 1350.00 | 1 |
6 | power strip | 29.00 | 2 |
category
id | name |
---|---|
1 | furniture |
2 | electronics |
3 | toys |
Regardez la requête suivante, qui attribue la catégorie de la table category
à chaque nom de produit dans la table product
.
SELECT product. name AS product_name, category. name AS category_name FROM product JOIN category ON product.category_id=category.id; |
La jointure est effectuée par l'opérateur JOIN
. Dans la clause FROM
, le nom de la première table (product
) est suivi d'un mot-clé JOIN
puis du nom de la deuxième table (category
). Il est ensuite suivi du mot-clé ON et de la condition permettant de lier les lignes des différentes tables. Le nom de la catégorie est attribué sur la base de la colonne id
de la table category
, qui est équivalente à category_id dans la table product (product.category_id=category.id).
Voici l'ensemble des résultats :
product_name | category_name |
---|---|
smart watch | electronics |
bricks | toys |
lamp | electronics |
sofa | furniture |
desk | furniture |
power strip | electronics |
La montre intelligente a la valeur 2 sur category_id
. Dans la colonne id de la table category
, la valeur 2 est associée à electronics, la montre intelligente est donc affectée à electronics.
L'utilisation de l'opérateur JOIN
est la méthode la plus courante pour lier plusieurs tables dans une base de données. Dans l'article "Guide illustré du SQL INNER JOIN", j'en dis plus sur cet opérateur. L'article "SQL INNER JOIN expliqué en termes simples" approfondit également ce sujet. Comme mentionné précédemment, l'opérateur INNER JOIN
est équivalent à JOIN
; vous pouvez les utiliser de manière interchangeable.
Sélectionner des données dans des tables à l'aide de JOIN et WHERE
L'utilisation des opérateurs JOIN
pour extraire des données de plusieurs tables permet également de filtrer plus facilement l'ensemble des résultats. Examinez la requête suivante, qui est une variante de la requête précédente et repose sur les mêmes données :
SELECT product. name AS product_name, category. name AS category_name FROM product JOIN category ON product.category_id=category.id WHERE category. name != ’toys’; |
Voici le résultat :
product_name | category_name |
---|---|
smart watch | electronics |
lamp | electronics |
sofa | furniture |
desk | furniture |
power strip | electronics |
La première partie de cette requête est la même que la précédente. Dans cette requête, cependant, les produits de la catégorie "jouets" sont exclus. Nous filtrons les lignes du jeu de résultats en utilisant une clause WHERE
pour vérifier si la catégorie est autre que "jouets" (category.name != ’toys’
).
Pour plus d'informations sur les JOIN en SQL, je vous invite à consulter notre cours pratique "Comment utiliser les JOIN ? Les jointures en SQL", à lire l'article "Comment pratiquer les jointures en SQL" ou à regarder la vidéo "SQL JOIN Basics" de la série "We Learn SQL".
Il existe également d'autres opérateurs JOIN
. En plus de JOIN
ou INNER JOIN
, il existe des opérateurs LEFT JOIN
, RIGHT JOIN
et FULL JOIN
. Pour en savoir plus, consultez la vidéo "Les jointures en SQL pour les débutants". Pour plus de pratique du SQL, consultez notre article La pratique du SQL.
Lier des tables en SQL
Nous avons vu comment vous pouvez récupérer des détails complets sur des objets en reliant plusieurs tables qui se réfèrent les unes aux autres dans une base de données relationnelle. Pour ce faire, vous pouvez utiliser WHERE
ou JOIN
. Pour en savoir plus sur les différences entre ces méthodes, je vous recommande un article très intéressant intitulé "Quelle est la différence entre avoir plusieurs tables dans FROM et utiliser JOIN ?".
Je ne vous ai donné qu'un aperçu de ce sujet ici, alors continuez à apprendre !