• 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