Retour à la liste des articles Articles
8 minutes de lecture

Comment joindre des tables en SQL sans utiliser les JOINs

Voici comment vous pouvez combiner des tables sans le mot-clé JOIN sans le mot-clé JOIN.

Il semble que cela ne devrait pas être possible : joindre des tables en SQL sans utiliser le mot-clé JOIN. Mais l'utilisation du mot-clé JOIN n'est pas la seule façon de joindre des tables en SQL.

Cet article vous montrera deux méthodes supplémentaires pour joindre des tables. Aucune d'entre elles ne nécessite le mot-clé JOIN pour fonctionner. Ces méthodes sont les suivantes

  1. L'utilisation d'une virgule entre les noms de tables dans la clause FROM et la spécification de la condition de jointure dans une clause de type WHERE
  2. Utilisation de UNION/UNION ALL.

Je suppose que vous connaissez le fonctionnement de JOIN. Si vous en avez besoin, voici un rappel sur la façon de joindre des tables à l'aide de JOINs.

La première méthode : FROM et WHERE

Syntaxe

La syntaxe de cette méthode de jonction de tables sans utiliser JOINs est la suivante :

SELECT *
FROM , 
WHERE 

Vous pouvez remplacer le mot-clé JOIN par une virgule dans la clause FROM. Que faites-vous ensuite ? Il n'y a pas de mot-clé ON pour indiquer la condition de jonction, comme c'est le cas lorsque vous utilisez JOIN, par exemple, sur quelles deux colonnes vous voulez joindre les tables. Dans cette méthode, vous utilisez simplement une clause WHERE pour le faire.

Cette méthode fait exactement la même chose que :

SELECT *
FROM <table1> JOIN <table2>
ON <condition>

Voyons comment elle fonctionne en pratique.

Exemple

Dans cet exemple, j'ai besoin de trouver le nom de l'artiste, les albums qu'il/elle a enregistrés, et les années dans lesquelles ils ont été enregistrés, pour chaque artiste.

Pour vous montrer comment cette méthode fonctionne, je vais utiliser deux tableaux. La première est artist:

idartist_name
1Paul Simon
2Marvin Gaye
3Bettye LaVette
4Joni Mitchell
5Sly and the Family Stone

Il s'agit d'un tableau simple contenant plusieurs de mes musiciens préférés.

L'autre table , albumressemble à ceci :

idalbum_nameyear_recordedartist_id
1Dance to the Music19685
2Small Talk19745
3Stranger to Stranger20161
4I've Got My Own Hell to Raise20053
5Blues19714
6Court and Spark19744
7A Tribute to the Great Nat "King" Cole19652
8Graceland19861
9Still Crazy After All These Years19751
10In the Blue Light20181
11There's a Riot Goin' On19715
12The Scene of the Crime20073
13Mingus19794
14What's Going On19712
15Here, My Dear19782

Ce sont les albums enregistrés par les musiciens de la première table.

Requête

La requête pour joindre ces tables sans le mot-clé JOIN ressemble à ceci :

SELECT
    artist_name,
    album_name,
    year_recorded
FROM artist, album
WHERE artist.id = album.artist_id;

D'abord, je spécifie les colonnes que je veux voir dans mon résultat : artist_name, album_name, et year_recorded. Elles proviennent soit de artist ou de album. Je joins ces deux tables simplement en les énumérant dans la clause FROM et en les séparant par une virgule.

La clause WHERE est généralement utilisée pour filtrer les résultats. Je peux l'utiliser pour filtrer ce résultat afin qu'il affiche toutes les données pour lesquelles la colonne id de la table artist est égale à la colonne artist_id du tableau album. Vous pouvez voir que la condition dans WHERE dans cette requête est la même qu'après le mot-clé ON lorsque vous utilisez JOIN: artist.id = album.artist_id.

La requête équivalente avec un mot-clé JOIN est la suivante :

SELECT 	artist_name,
		album_name,
		year_recorded
FROM artist
JOIN album
ON artist.id = album.artist_id;

Résultat

Ces deux requêtes renvoient le même résultat :

artist_namealbum_nameyear_recorded
Paul SimonIn the Blue Light2018
Paul SimonStill Crazy After All These Years1975
Paul SimonGraceland1986
Paul SimonStranger to Stranger2016
Marvin GayeHere, My Dear1978
Marvin GayeWhat's Going On1971
Marvin GayeA Tribute to the Great Nat "King" Cole1965
Bettye LaVetteThe Scene of the Crime2007
Bettye LaVetteI've Got My Own Hell to Raise2005
Joni MitchellMingus1979
Joni MitchellCourt and Spark1974
Joni MitchellBlues1971
Sly and the Family StoneThere's a Riot Goin' On1971
Sly and the Family StoneSmall Talk1974
Sly and the Family StoneDance to the Music1968

Vous voyez que le résultat combine les données des deux tables initiales. Je peux maintenant voir, par exemple, que Paul Simon a enregistré l'album "In the Blue Light" en 2018. Si vous n'avez pas confiance en ma requête, vous pouvez toujours consulter Wikipedia !

Cette méthode utilise une colonne commune pour joindre les tables. Rappelez-vous que vous pouvez également joindre des tables qui n'ont pas de colonne commune.

La deuxième méthode : UNION/UNION ALL

Syntaxe

SELECT
    ,
    ,
    …
FROM 

UNION / UNION ALL

SELECT
    ,
    ,
    …
FROM 

Les instructions UNION et UNION ALL sont utilisées pour coller ensemble le résultat de la première requête avec celui de la seconde. Il suffit d'écrire deux déclarations SELECT et d'écrire UNION ou UNION ALL entre les deux. Mais quelle est la différence entre ces deux mots-clés SQL ? Rappel :

  • UNION supprime les lignes en double de la requête et ne les affiche qu'une seule fois.
  • UNION ALL affiche toutes les lignes des deux tables, quel que soit le nombre de doublons.

Pour que UNION et UNION ALL fonctionnent, toutes les colonnes des deux instructions SELECT doivent correspondre. Cela signifie que le nombre de colonnes sélectionnées doit être le même et que les types de données de ces colonnes doivent être les mêmes.

Ces deux opérateurs sont appelés opérateurs de jeu. Lisez cet article pour en savoir plus sur ces opérateurs et d'autres opérateurs de set.

Exemple

Nous avons également deux tables dans cet exemple. La première est nommée customer:

idfirst_namelast_name
1JimmyHellas
2FrancoisJambony
3RenataTraviata
4CarmenNaburana
5SteveInicks
6ElviraSamson
7AlpaCino
8RosaSparks
9BernardineSane
10BertRandrussell

Elle contient la liste de mes clients.

La deuxième table est supplier:

idfirst_namelast_name
1ArpadPolanski
2BillyVan Persie
3SteveInicks
4Jean-ClaudeZaandam
5EminaArkayeva
6BoMilosz
7JanWrangler
8HeinrichStroopwafel
9HerringoStarr
10JosephineMatijevic
11AlpaCino
12FlintWestwood
13DesPaulmond
14WilmaJackson
15KatrinVerson
16BertRandrussell
17CarmenNaburana
18JimmyTulp
19LuisWolf
20MirandaFanucci

Si vous examinez ces tableaux d'un peu plus près, vous verrez que certaines personnes figurent dans les deux tableaux. Par exemple, regardez Steve Inicks - cela signifie que Steve est, avec d'autres, à la fois mon client (il achète certains services à mon entreprise) et mon fournisseur (il me fournit certains services).

Voyons maintenant à quoi cela ressemble lorsque je joins ces tables avec UNION ou UNION ALL.

Requête : UNION

Cette méthode de combinaison de tables sans utiliser le mot-clé JOIN se traduit par la requête suivante :

SELECT 	
    first_name,
    last_name
FROM customer

UNION

SELECT	
    first_name,
    last_name
FROM supplier;

La première instruction SELECT sélectionne les colonnes first_name et last_name dans la table customer. La deuxième instruction SELECT fait la même chose mais à partir de la table supplier. J'utilise UNION pour joindre les résultats de ces deux requêtes. Cela fonctionne : il y a deux colonnes dans les deux instructions SELECT, et elles sont du même type de données. Elles portent même le même nom, bien que cela ne soit pas nécessaire pour que la requête fonctionne.

Résultat : UNION

En exécutant la requête, vous obtenez ceci :

first_namelast_name
AlpaArpad
CinoBilly
JosephineMatijevic
LuisWolf
Jean-ClaudeZaandam
SteveInicks
BillyVan Persie
EminaArkayeva
MirandaFanucci
BoMilosz
JimmyHellas
FrancoisJambony
RosaSparks
KatrinVerson
JanWrangler
BernardineSane
HeinrichStroopwafel
ElviraSamson
RenataTraviata
JimmyTulp
WilmaJackson
ArpadPolanski
BertRandrussell
DesPaulmond
FlintWestwood
CarmenNaburana
HerringoStarr

Comme je l'ai mentionné, c'est une combinaison de toutes les données des deux tables.

Vérifions les doublons. J'ai mentionné que Steve Inicks figure dans les deux déclarations customer et supplier et . Dans le résultat de la requête, vous ne le trouvez qu'une seule fois. J'ai marqué la ligne où il se trouve.

Voyons en quoi cela est différent de UNION ALL.

Requête : UNION ALL

Dans ce cas, la requête est la suivante :

SELECT
    first_name,
    last_name
FROM customer

UNION ALL

SELECT
    first_name,
    last_name
FROM supplier;

Comme vous pouvez le voir, ce n'est pas très différent. En fait, il s'agit de la même requête, sauf qu'elle comporte UNION ALL au lieu de UNION.

Cependant, les résultats sont différents. Voyons cela de plus près.

Résultat : UNION ALL

Le résultat de la requête est :

first_namelast_name
JimmyHellas
FrancoisJambony
RenataTraviata
CarmenNaburana
SteveInicks
ElviraSamson
AlpaCino
RosaSparks
BernardineSane
BertRandrussell
ArpadPolanski
BillyVan Persie
SteveInicks
Jean-ClaudeZaandam
EminaArkayeva
BoMilosz
JanWrangler
HeinrichStroopwafel
HerringoStarr
JosephineMatijevic
AlpaCino
FlintWestwood
DesPaulmond
WilmaJackson
KatrinVerson
BertRandrussell
CarmenNaburana
JimmyTulp
LuisWolf
MirandaFanucci

Sachant que Steve Inicks apparaît à la fois comme client et comme fournisseur, vérifions combien de fois il apparaît dans le résultat. Il y est deux fois, les deux fois marquées en bleu. J'ai également marqué trois autres personnes qui apparaissent deux fois : Alpa Cino, Bert Randrussell et Carmen Naburana.

Voici un autre exemple d'utilisation de UNION et UNION ALL...

Oui, les tables peuvent être jointes sans le mot-clé JOIN

Comme vous venez de le voir, il n'est pas toujours nécessaire d'utiliser le mot-clé JOIN pour combiner deux tables en SQL.

Vous pouvez le remplacer par une virgule dans la clause FROM puis indiquer votre condition de jonction dans la clause WHERE.

L'autre méthode consiste à écrire deux instructions SELECT. Le résultat de chacune d'elles étant une table, il suffit d'utiliser UNION ou UNION ALL pour combiner les deux. N'oubliez pas que cette méthode ne fonctionne que si vos instructions SELECT comportent le même nombre de colonnes et les mêmes types de données.

Utilisez UNION lorsque vous ne souhaitez pas afficher les doublons et UNION ALL lorsque vous souhaitez les afficher.

Apprenez toutes les méthodes possibles pour joindre des tables en SQL

Plus vous connaissez de façons de joindre des tables en SQL, mieux c'est. Avec ces deux méthodes et le JOIN, joindre des tables devient plus facile. Les résultats de vos requêtes sont plus proches de ce dont vous avez besoin, et vous tirez un meilleur parti de SQL.

Le fait de connaître plusieurs façons de joindre des tables vous permet également de secouer un peu votre code. Il peut être ennuyeux d'écrire tout de la même façon tout le temps. Mais surtout, chacune de ces trois méthodes est utile dans différentes situations.

Vous pouvez apprendre toutes ces méthodes de jonction de tableaux dans notre cours SQL pour les débutants . Il ne s'agit que d'une première étape vers la maîtrise de Le SQL de A à Z. Vous avez également besoin de beaucoup de pratique pour maîtriser la jonction de tableaux. Le mieux est peut-être de choisir au moins une option en ligne dans notre liste de dix.