- Qu’est-ce qu’une jointure interne?
- qu’est Ce qu’une Jointure Externe?
- effectuer des jointures externes en utilisant le symbole ( + )
comme pratiquement toutes les bases de données relationnelles, Oracle permet de générer des requêtes qui combinent ouJOIN
lignes de deux tables ou plus pour créer le jeu de résultats final., Bien qu’il existe de nombreux types de jointures qui peuvent être effectuées, les plus courantes sont INNER JOIN
et OUTER JOIN
.
dans ce tutoriel, nous allons brièvement explorer la différence entre INNER
Et OUTER JOIN
, puis examiner la méthode abrégée fournie par Oracle pour effectuer OUTER JOINS
en utilisant spécifiquement le +
symbole opérateur.
Qu’est une Jointure Interne?,
unINNER JOIN
dans une base de données relationnelle est simplement la jointure de deux tables ou plus dans lesquelles le résultat ne contiendra que des données qui satisfont toutes les conditions de jointure.
Par exemple, ici nous avons une base library
schéma avec deux tables: books
et languages
.,>
pendant ce temps, notre books
table a un language_id
ligne qui, pour la plupart, mais pas tous, des livres contient simplement la balise language_id
associé à l’origine des langues de publication du livre:
SELECT * FROM booksORDER BY idFETCH FIRST 10 ROWS ONLY;id title author year_published language_id1 In Search of Lost Time Marcel Proust 1913 22 Ulysses James Joyce 1922 13 Don Quixote Miguel de Cervantes 1605 54 Moby Dick Herman Melville 1851 15 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 87 The Odyssey Homer -700 98 The Great Gatsby F. Scott Fitzgerald 1925 19 The Divine Comedy Dante Alighieri 1472 1010 Madame Bovary Gustave Flaubert 1857 2
Dans de nombreux cas, on peut souhaiter effectuer un INNER JOIN
de la books
et languages
tables donc, plutôt que de considérer le sens language_id
valeur de chaque livre, on peut voir le language name
à la place.,
SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bINNER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French11 The Brothers Karamazov Fyodor Dostoyevsky 1880 Russian
Ce qui est essentiel ici est de noter que notre jeu de résultats est légèrement différente dans les deux requêtes. Dans le premier, nous avons simplement répertorié les premiers livres 10
, mais dans la requête INNER JOIN
, nous ne renvoyons que des résultats qui répondent à toutes les conditions des deux tables. Pour cette raison, le dossier de la Hamlet
(qui a un language_id
valeur null
ou vide) est ignoré et n’est pas retourné dans la suite de notre INNER JOIN
.,
Qu’est une Jointure Externe?
Au lieu de renvoyer exclusivement des résultats qui satisfont toutes les conditions de jointure d’unINNER JOIN
, unOUTER JOIN
renvoie non seulement des résultats qui satisfont toutes les conditions, mais renvoie également des lignes d’une table qui ne satisfont pas la condition. La table choisie pour ce » contournement « des exigences conditionnelles est déterminée par la directivité ou le” côté »de la jointure, généralement appelée LEFT
ou RIGHT
jointures externes.,
lorsque vous définissez un côté de votreOUTER JOIN
, vous spécifiez quelle table retournera toujours sa ligne même si la table adverse de l’autre côté de la jointure a des valeurs manquantes ounull
dans le cadre de la condition de jointure.,
Donc, si on effectue la même base JOIN
comme ci-dessus pour récupérer books
et language names
, nous savons que notre books
table doit toujours renvoyer des données, donc, notre JOIN
côté doit « pointer vers” notre books
le tableau, ce qui rend le languages
table de la balise OUTER
table nous sommes attachés à elle.,> sauf que modification mineure:
SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bLEFT OUTER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English5 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French
Comme prévu, à l’aide d’un LEFT OUTER JOIN
au lieu de INNER JOIN
, nous obtenons le meilleur des deux mondes: Nous ne sommes pas en ignorant tout books
enregistrements (Hamlet
) tout simplement parce que le language_id
valeur null
pour cet enregistrement, mais pour tous les enregistrements où language_id
existe, nous obtenons le bien formaté language name
obtenue à partir de notre languages
tableau.,
effectuer des jointures externes en utilisant le symbole ( + )
comme indiqué dans la documentation officielle, Oracle fournit unouter join operator
(le+
symbole) qui est raccourci pour effectuerOUTER JOINS
.
en pratique, le symbole+
est placé directement dans l’instruction conditionnelle et sur le côté de la table facultative (celle qui est autorisée à contenir des valeurs vides ounull
dans le conditionnel).,
Par conséquent, nous pouvons à nouveau réécrire notre instructionLEFT OUTER JOIN
ci-dessus en utilisant l’opérateur+
comme ceci:
Les résultats sont les mêmes que l’exemple standardLEFT OUTER JOIN
ci-dessus, nous ne les inclurons donc pas ici. Cependant, il y a un aspect critique à remarquer sur la syntaxe en utilisant l’opérateur +
pour OUTER JOINS
.
Le +
opérateur doit être sur le côté gauche de la conditionnelle (à gauche du signe égal, =
signe)., Par conséquent, dans ce cas, parce que nous voulons nous assurer que notre languages
table est la table facultative qui peut renvoyer null
valeurs lors de cette comparaison, nous avons échangé l’ordre des tables dans cette conditionnelle, donc languages
est sur la gauche b3a14042ca »> est sur la droite.
enfin, en raison de cette réorganisation des côtés de la table dans le conditionnel lors de l’utilisation de l’opérateur+
, il est important de réaliser que ce qui précède est simplement un raccourci pour unRIGHT OUTER JOIN
., Cela signifie que cet extrait de la requête:
FROM books b, library.languages lWHERE l.id (+)= b.language_id
…est effectivement identique à ceci:
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
Laisser un commentaire