- Qu'est-ce qu'une jointure interne ?
- Qu'est-ce qu'une jointure externe ?
- Exécution de jointures externes à l'aide du symbole (+)
Comme pratiquement toutes les bases de données relationnelles, Oracle permet de générer des requêtes qui combinent ou JOIN
lignes de deux tables ou plus pour créer le jeu de résultats final. Bien qu'il existe de nombreux types des jointures réalisables, les plus courantes sont les INNER JOIN
et le OUTER JOIN
.
Dans ce didacticiel, nous allons brièvement explorer la différence entre le INNER
et OUTER JOIN
puis examinez la méthode abrégée fournie par Oracle pour effectuer des OUTER JOINS
en utilisant spécifiquement le +
symbole de l'opérateur.
Qu'est-ce qu'une jointure interne ?
Une INNER JOIN
dans une base de données relationnelle est simplement la jointure de deux ou plusieurs tables dans lesquelles le résultat ne contiendra que des données qui satisfont à toutes les conditions de jointure .
Par exemple, nous avons ici une library
de base schéma avec deux tables :books
et languages
. Les languages
table est juste une liste de noms de langues possibles et un id
de langue unique :
SELECT * FROM library.languages;
id name
1 English
2 French
3 German
4 Mandarin
5 Spanish
6 Arabic
7 Japanese
8 Russian
9 Greek
10 Italian
Pendant ce temps, nos books
la table a un language_id
ligne qui pour la plupart des livres, mais pas tous, contient simplement le language_id
associé à la langue de publication originale du livre :
SELECT * FROM
books
ORDER BY
id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language_id
1 In Search of Lost Time Marcel Proust 1913 2
2 Ulysses James Joyce 1922 1
3 Don Quixote Miguel de Cervantes 1605 5
4 Moby Dick Herman Melville 1851 1
5 Hamlet William Shakespeare 1601 (null)
6 War and Peace Leo Tolstoy 1869 8
7 The Odyssey Homer -700 9
8 The Great Gatsby F. Scott Fitzgerald 1925 1
9 The Divine Comedy Dante Alighieri 1472 10
10 Madame Bovary Gustave Flaubert 1857 2
Dans de nombreux cas, nous pouvons souhaiter effectuer un INNER JOIN
des books
et languages
tables donc plutôt que de voir le language_id
dénué de sens valeur de chaque livre, nous pouvons en fait voir le language name
à la place.
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b
INNER JOIN
library.languages l
ON
b.language_id = l.id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language
1 In Search of Lost Time Marcel Proust 1913 French
2 Ulysses James Joyce 1922 English
3 Don Quixote Miguel de Cervantes 1605 Spanish
4 Moby Dick Herman Melville 1851 English
6 War and Peace Leo Tolstoy 1869 Russian
7 The Odyssey Homer -700 Greek
8 The Great Gatsby F. Scott Fitzgerald 1925 English
9 The Divine Comedy Dante Alighieri 1472 Italian
10 Madame Bovary Gustave Flaubert 1857 French
11 The Brothers Karamazov Fyodor Dostoyevsky 1880 Russian
Ce qu'il est important de noter ici, c'est que notre ensemble de résultats était légèrement différent dans les deux requêtes ci-dessus. Dans le premier, nous avons simplement listé les premiers 10
livres, mais dans le INNER JOIN
requête, nous renvoyons uniquement les résultats qui remplissent toutes les conditions des deux tables. Pour cette raison, la fiche de Hamlet
(qui a un language_id
valeur de null
ou vide) est ignoré et non renvoyé dans le résultat de notre INNER JOIN
.
Qu'est-ce qu'une jointure externe ?
Au lieu de renvoyer exclusivement des résultats qui satisfont à toutes les conditions de jointure d'un INNER JOIN
, un OUTER JOIN
renvoie non seulement les résultats qui satisfont toutes les conditions, mais aussi renvoie les lignes d'une table qui n'ont pas satisfait à la condition. La table choisie pour ce "contournement" des exigences conditionnelles est déterminée par la directionnalité ou "côté" de la jointure, généralement appelée LEFT
ou RIGHT
jointures externes.
Lors de la définition d'un côté de votre OUTER JOIN
, vous spécifiez quelle table renverra toujours sa ligne même si l'élément opposé table de l'autre côté de la jointure a manquant ou null
valeurs dans le cadre de la condition de jointure.
Par conséquent, si nous effectuons le même JOIN
de base comme ci-dessus pour récupérer des books
et language names
, nous savons que nos books
table doit toujours renvoyer des données, donc notre JOIN
le côté doit "pointer vers" nos books
table, rendant ainsi les languages
tablez le OUTER
tableau que nous y attachons.
Pour ce faire, nous changeons simplement :
books b INNER JOIN library.languages l
… à ceci :
books b LEFT OUTER JOIN library.languages l
Ainsi, l'ensemble de la requête et du résultat semble presque identique au INNER JOIN
sauf cette modification mineure :
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b
LEFT OUTER JOIN
library.languages l
ON
b.language_id = l.id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language
1 In Search of Lost Time Marcel Proust 1913 French
2 Ulysses James Joyce 1922 English
3 Don Quixote Miguel de Cervantes 1605 Spanish
4 Moby Dick Herman Melville 1851 English
5 Hamlet William Shakespeare 1601 (null)
6 War and Peace Leo Tolstoy 1869 Russian
7 The Odyssey Homer -700 Greek
8 The Great Gatsby F. Scott Fitzgerald 1925 English
9 The Divine Comedy Dante Alighieri 1472 Italian
10 Madame Bovary Gustave Flaubert 1857 French
Comme prévu, en utilisant un LEFT OUTER JOIN
au lieu du précédent INNER JOIN
, nous obtenons le meilleur des deux mondes :nous ne sautons aucun books
enregistrements (tels que Hamlet
) simplement parce que le language_id
la valeur est null
pour cet enregistrement, mais pour tous les enregistrements où language_id
existe, nous obtenons le language name
bien formaté obtenu à partir de nos languages
tableau.
Exécution de jointures externes à l'aide du symbole (+)
Comme indiqué dans la documentation officielle, Oracle fournit un outer join operator
spécial (le +
symbole) qui est un raccourci pour effectuer OUTER JOINS
.
En pratique, le +
le symbole est placé directement au conditionnel et du côté de la table optionnelle (celle qui est autorisée à contenir vide ou null
valeurs dans le conditionnel).
Par conséquent, nous pouvons à nouveau réécrire notre LEFT OUTER JOIN
ci-dessus instruction utilisant le +
opérateur comme ceci :
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b,
library.languages l
WHERE
l.id (+)= b.language_id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
Les résultats sont les mêmes que le standard LEFT OUTER JOIN
exemple ci-dessus, nous ne les inclurons donc pas ici. Cependant, il y a un aspect critique à noter à propos de la syntaxe utilisant le +
opérateur pour OUTER JOINS
.
Le +
l'opérateur doit être à gauche du conditionnel (à gauche des égaux =
signe). Par conséquent, dans ce cas, parce que nous voulons nous assurer que nos languages
table est la table facultative qui peut retourner null
valeurs lors de cette comparaison, nous avons permuté l'ordre des tables dans ce conditionnel, donc languages
est à gauche (et est facultatif) tandis que books
est à droite.
Enfin, à cause de cette réorganisation des côtés du tableau au conditionnel lors de l'utilisation du +
, il est important de réaliser que ce qui précède est simplement un raccourci pour un RIGHT OUTER JOIN
. Cela signifie que cet extrait de requête :
FROM
books b,
library.languages l
WHERE
l.id (+)= b.language_id
…est effectivement identique à ceci :
FROM
library.languages l
RIGHT OUTER JOIN
books b
ON
b.language_id = l.id