Ce document à pour but d'aider dans l'établissement de jointures concrètes.
On reprendra les exemples du TP - Jointures pour vous aider à mieux comprendre les exercices, et la correction.
Une jointure permet de relier deux tables, qui ont une relation d'appartenance.
En effet, une entreprise possède des salariés. On peut donc faire une jointure OneToMany (Un pour Plusieurs) entre les deux tables.
Cela va permettre d'obtenir les colonnes des entreprises et les colonnes des salariés dans une même table.
On fait une jointure si on a besoin de colonnes de plusieurs tables.
Dès que vous voyez un trait entre deux tables : une jointure est possible.
Ici, il y a 5 jointures disponibles :
- groupes - musiciens
- musiciens - instruments
- groupes - albums
- albums - sons
- sons - musiciens
Il y a trois types de champs :
-
Une clé primaire : souvent nommée
id
, chaque valeur est unique dans la table. -
Les champs clé étrangère : ils se finissent souvent par
_id
, commegroupe_id
par exemple. -
Les autres champs, qui ne servent pas pour créer une jointure.
Il existe une jointure pour chaque clé étrangère.
Pour les exemples, nous allons nous interesser à la jointure 'groupes - musiciens'.
Commencez par la partie FROM
de la requête, on reviendra à la partie SELECT
plus tard.
On écrit d'abord FROM
, puis la première table de notre jointure. On pense à bien spécifier le schéma de la table.
Dans notre cas, notre schéma est jointures
. Le nom de la première table est groupes
. On écrit donc :
FROM jointures.groupes
On ajoute un alias à cette table avec AS
. Cet alias sera souvent la ou les premières lettres du nom de la table.
FROM jointures.groupes AS g
En dehors de cette ligne, on remplace la table groupes
avec la lettre g.
On écrit ensuite JOIN
, puis la deuxième table de notre jointure. On n'oublie pas de bien spécifier le schéma de la table.
Dans notre cas, notre schéma est jointures
. Le nom de la deuxième table est musiciens
. On écrit donc :
FROM jointures.groupes AS g
JOIN jointures.musiciens
Ici aussi, on va donner un alias à cette table avec AS
. On donne ici l'alias m
:
FROM jointure.groupes AS g
JOIN jointures.musiciens AS m
En dehors de cette ligne, on remplace la table musiciens
avec la lettre m.
On détermine la clé étrangère de la jonction (voir plus haut).
Ici, il s'agit du champs groupe_id
de la table musiciens
.
Puisque qu'on utilise un alias pour la table musiciens
, on peut accéder a ce champ avec m.groupe_id
.
On commence à écrire la partie ON
de la requête.
FROM jointure.groupes AS g
JOIN jointures.musiciens AS m
ON m.groupe_id
On détermine ensuite la clé primaire approppriée (voir plus haut). Il faut que la clé étrangère et la clé primaire soient de tables différentes.
C'est pour cette raison que la clé primaire, dans cet exemple, est groupes.id
.
Puisque qu'on utilise un alias pour la table groupes
, on peut accéder a ce champ avec g.id
.
On finit la partie ON
de la requête.
FROM jointure.groupes AS g
JOIN jointures.musiciens AS m
ON m.groupe_id = g.id
On a fait clé étrangère = clé primaire
La jointure est finie
Dans la partie SELECT
de la requête, on met le nom des colonnes que l'on suouhaite récupérer.
Attention à bien préciser l'alias de la table de chaque colonne.
Si on souhaite obtenir la colonne nom
de la table groupes
, on obtient :
SELECT g.nom
FROM jointure.groupes AS g
JOIN jointures.musiciens AS m
ON m.groupe_id = g.id
On peut aussi donner des alias aux colonnes dans le SELECT
, pour pouvoir différencier des colonnes ayant le même libellé.
Par exemple, on donne nom_de_groupe
et nom_du_musicien
commes alias.
SELECT g.nom AS nom_de_groupe, m.nom AS nom_du_musicien
FROM jointure.groupes AS g
JOIN jointures.musiciens AS m
ON m.groupe_id = g.id
De la même manière, si on souhaite utiliser un filtre WHERE
, on utilise toujours les alias
SELECT g.nom AS nom_de_groupe, m.nom AS nom_du_musicien
FROM jointure.groupes AS g
JOIN jointures.musiciens AS m
ON m.groupe_id = g.id
WHERE g.date_creation < '2008-01-01'
On sélectionne ici le nom des groupes, et les noms des musiciens, dans les groupes ayant été crées avant 2008.