• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 20/10/2020

Joignez dans tous les sens avec JOIN !

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Le point sur notre investigation

Pour l'instant, nous avons juste retrouvé notre mystérieuse société Big Data Crunchers Ltd. dans la table entity. Prochaine étape : retrouver son adresse !

Nous irons même plus loin : nous chercherons également les intermédiaires qui ont aidé à créer Big Data Crunchers Ltd. Ces intermédiaires peuvent être aussi bien des personnes que des sociétés (banques, cabinets d'avocats, etc.)

La jointure interne

Notre objectif : "coller" les tables entity et intermediary pour obtenir une table dans laquelle les lignes contiennent les informations sur les sociétés, avec pour chacune d'entre elles leur adresse. En SQL, il y a deux manières principales d'écrire des jointures :

La première méthode : avec FROM et WHERE

Vous vous souvenez du chapitre Liez des relations grâce aux jointures ? J'y expliquais dans le chapitre Voir la jointure autrement qu'une jointure était en fait l'enchaînement d'un produit cartésien et d'une restriction.

Je commence donc par effectuer le produit cartésien des deux tables...

SELECT * FROM entity, address ;

... auquel j'ajoute la condition de restriction :

SELECT * FROM entity, address WHERE entity.id_address = address.id_address ;

Voilà, notre jointure est faite !

La seconde méthode : avec JOIN et ON

La seconde méthode introduit les nouveaux mots clés JOIN et ON :

SELECT *
FROM entity
JOIN address ON entity.id_address = address.id_address ;

Joindre sur plusieurs colonnes

Si votre clé étrangère contient 2 attributs (ou plus), alors il faut  utiliser AND. Prenons l'exemple d'une table t1 ayant une clé étrangère de 2 attributs : fk1 et fk2. Cette clé étrangère référence la table t2, dont la clé primaire est elle aussi composée de 2 attributs : pk1 et pk2 :

-- Première méthode :
SELECT * FROM t1, t2 WHERE (t1.fk1 = t2.pk1 AND t1.fk2 = t2.pk2);
-- Seconde méthode :
SELECT * FROM t1 JOIN t2 ON (t1.fk1 = t2.pk1 AND t1.fk2 = t2.pk2);

Bien joué !

Nous avons atteint notre objectif : coller nos deux tables. Dans le résultat, il nous faut maintenant retrouver Big Data Crunchers Ltd. Pour cela, une petite restriction s'impose. On l'ajoute dans le WHERE. Comme il y a déjà une condition, on utilise AND :

SELECT *
FROM entity, address
WHERE entity.id_address = address.id_address
AND entity.name = 'Big Data Crunchers Ltd.';

Joindre avec une table d'association

Retrouvons maintenant les intermédiaires qui ont participé à la création de la société Big Data Crunchers Ltd !

Précédemment, nous avions vu qu'une table d'association servait à modéliser un lien de cardinalité plusieurs à plusieurs entre deux objets. C'est le cas du lien qui unit entity et intermediary, car plusieurs intermédiaires peuvent créer une société, et un unique intermédiaire peut créer plusieurs sociétés. Ainsi, il y a une table qui porte le nom de assoc_inter_entity, contenant entre autres :

  • une colonne entity, clé étrangère qui référence la table entity,

  • une colonne intermediary, clé étrangère qui référence la table intermediary.

Il nous faut donc faire une jointure sur 3 tables, comme ceci :

SELECT
i.id as intermediary_id,
i.name as intermediary_name,
e.id as entity_id,
e.name as entity_name,
e.status as entity_status
FROM
intermediary i,
assoc_inter_entity a,
entity e
WHERE
a.entity = e.id
AND a.inter = i.id
AND e.name = 'Big Data Crunchers Ltd.' ;

Nous spécifions les 3 tables dans le FROM. Dans le WHERE, nous donnons les deux conditions de jointure, ainsi que le nom de notre société.

Aller plus loin : les jointures externes

Vous vous souvenez des jointures externes ? Elles permettent de garder des lignes qui auraient été ignorées lors d'une jointure interne. Si nous souhaitons obtenir une table avec toutes les sociétés de entity avec leur adresse, sans oublier les sociétés dont l'adresse est inconnue, alors il nous faut une jointure externe à gauche.

SELECT *
FROM entity
LEFT OUTER JOIN address ON entity.id_address = address.id_address;

Si au contraire, nous voulons garder toutes les adresses (qu'elles correspondent à une société ou non), il faut alors faire une jointure externe à droite :

SELECT *
FROM entity
RIGHT OUTER JOIN address ON entity.id_address = address.id_address;

Vous me voyez venir...? Oui ! Il ne me reste plus qu'à vous donner la syntaxe de la jointure entière ! Celle-ci nous permet de garder à la fois toutes les adresses et à la fois toutes les sociétés :

SELECT *
FROM entity
FULL OUTER JOIN address ON entity.id_address = address.id_address;

Aller plus loin : la jointure naturelle

Dans le chapitre Liez des relations grâce aux jointures, j’expliquais le concept de la jointure naturelle. Voici comment l'implémenter en SQL :

SELECT * FROM entity NATURAL JOIN address ;

En résumé

  • Il y a deux méthodes pour effectuer une jointure :

    • avec le FROM et le WHERE

    • avec JOIN etON

  • Lorsque nous avons affaire à une table d'association, alors il faut joindre 3 tables entre elles !

  • Pour simplifier des requêtes, nous pouvons utiliser des alias.

Exemple de certificat de réussite
Exemple de certificat de réussite