OpenClassrooms becomes an accredited US university.
Discover what this means for youTable of contents
- Part 1
Initiez-vous à la modélisation relationnelle
Tirez un maximum de ce cours
Organisez vos données selon la modélisation relationnelle
Prenez en main une base de données
Identifiez les lignes de votre table avec votre clé primaire
Mettez en relation plusieurs tables avec des clés étrangères
Identifiez les types d'associations entre vos tables
Quiz: S'initier à la modélisation relationnelle
- Part 2
Construisez des requêtes SQL simples
Affichez les données pertinentes avec SELECT
Filtrez vos lignes avec WHERE
Récupérez des données issues de plusieurs tables avec FROM
Liez des tables avec une jointure interne
Maîtrisez les jointures externes et naturelles
Identifiez toujours vos potentielles clés primaires
Quiz: Construire des requêtes SQL simples
- Part 3
Appliquez d'autres fonctionnalités à vos requêtes SQL
Maîtrisez les jointures externes et naturelles
#Définissez une jointure externe
Lorsque vous écrivez une jointure interne entre 2 tables, certaines lignes de la première ou de la seconde table peuvent être absentes du résultat de votre jointure. Voyons dans cette vidéo quelle en est la cause, et comment y remédier :
Dans la table entity , il y a des sociétés dont on ne connaît pas l'adresse. Pour ces sociétés, la valeur de id_address sera vide. En informatique, et notamment en SQL, une valeur vide est appelée valeur nulle, notée NULL :
Id | Name | id_address |
0 | BigData Crunchers Ltd. | 10000000 |
1000000004 | Dewberries, Garlics &Bittercress Limited | NULL |
1000000007 | Snakeberries, Bittercress& Maples Corporation | NULL |
Mais au chapitre précédent, on avait utilisé cette condition de jointure : entity.id_address = address.id_address . Ici, si entity.id_address est nul, alors ça ne va plus marcher !
Exactement ! En effet address.id_address est la clé primaire de la table address . Comme c'est une clé primaire, elle ne peut pas contenir de valeurs nulles. Or, comme ici entity.id_address sera nul pour certaines sociétés, alors la condition de jointure ne sera pas satisfaite pour ces lignes, c'est-à-dire pour les sociétés qui n'ont pas d'adresse. Comme cette condition de jointure est en fait une condition de filtrage, ces lignes seront écartées…
Pour garder toutes les lignes de entity , même celles qui n'ont pas trouvé de correspondance dans la table address , on va utiliser une jointure externe à gauche (on considère que entity est à gauche car c'est la 1e table à être citée dans la requête) :
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 toutes les sociétés :
SELECT *
FROM entity
FULL OUTER JOIN address ON entity.id_address = address.id_address;
Au chapitre précédent, on avait dit que quand on fait une jointure interne d'une clé étrangère d'une table A vers la clé primaire d'une table B , le résultat contient au plus autant de lignes que la table A .
Pourquoi “au plus”? Car pour une jointure interne, certaines lignes pouvaient être ignorées si elles ne trouvaient pas de correspondances dans l'autre table.
Mais avec la jointure externe, on garde les lignes qui n'ont pas de correspondance ; le résultat aura donc exactement autant de lignes que la table A .
type | depuis | vers | nombre de lignes |
Jointure interne | depuis une clé étrangère d'une table A (table de gauche) | vers une potentielle clé primaire d'une table B (table de droite) | au plus autant de lignes que la table A |
Jointure externe gauche |
|
| exactement autant de lignes que la table A |
#Découvrez la jointure naturelle
Il arrive parfois que dans une condition de jointure, les colonnes des clés étrangères et clés primaires aient les mêmes noms. Dans ce cas, on peut simplifier l'écriture de la requête. C'est ce que nous allons voir dans cette vidéo.
Voici la requête correspondante :
SELECT
e.id AS id_entity,
e.name AS nom_societe,
e.id_address AS 'e.id_address',
a.id_address AS 'a.id_address',
a.address,
a.countries
FROM
entity e
NATURAL JOIN
address a ;
#À vous de jouer

#Contexte
Explorer des données, c’est aussi vérifier leur qualité : sont-elles fiables, sont-elles cohérentes ? Dans un souci de cohérence, vous décidez de vérifier si certaines adresses ne sont pas liées à des sociétés. Si c’est le cas, alors pourquoi se retrouvent-elles dans la base de données ? Ce sera une question à élucider.
#Consignes
La requête de la précédente vidéo effectue une jointure externe gauche, afin de garder toutes les lignes de entity qui n'ont pas de correspondance :
SELECT
e.id AS id_entity,
e.name AS nom_societe,
e.id_address AS 'e.id_address',
a.id_address AS 'a.id_address',
a.address,
a.countries
FROM
entity e
LEFT JOIN
address a ON e.id_address = a.id_address ;
Transformez cette requête pour garder les adresses qui n'ont pas de société (plus besoin par contre de garder les sociétés sans adresse).
#Vérifiez votre travail
Voici la requête que vous devez obtenir :
SELECT
e.id AS id_entity,
e.name AS nom_societe,
e.id_address AS 'e.id_address',
a.id_address AS 'a.id_address',
a.address,
a.countries
FROM
address a
LEFT JOIN
entity e ON e.id_address = a.id_address ;
Il y a en effet beaucoup d’adresses qui ne correspondent pas à des sociétés de entity . Mais en y regardant d’un peu plus près, on voit que la table intermediary a elle aussi une clé étrangère référençant la table address . Les adresses qui ne correspondent pas à une société correspondent donc probablement à des intermédiaires !
#En résumé
Pour garder toutes les informations de l'une des tables (ou des 2 tables), il faut utiliser une jointure externe.
Une jointure externe à gauche garde toutes les lignes de la table de gauche.
Rappel de syntaxes :
jointure externe gauche :
LEFT OUTER JOINjointure externe droite :
RIGHT OUTER JOINjointure externe totale :
FULL OUTER JOIN
Maintenant que vous êtes un as dans l'art de manier les jointures, il est temps de prendre un peu de recul sur tout ce que nous avons appris jusqu'à maintenant.
- Up to 100% of your training program funded
- Flexible start date
- Career-focused projects
- Individual mentoring