• co to jest połączenie wewnętrzne?
  • co to jest złącze zewnętrzne?
    • Wykonywanie złączeń zewnętrznych za pomocą symbolu ( + )

podobnie jak praktycznie wszystkie relacyjne bazy danych, Oracle umożliwia generowanie zapytań, które łączą lubJOIN wiersze z dwóch lub więcej tabel w celu utworzenia zestawu wyników końcowych., Chociaż istnieje wiele typów połączeń, które można wykonać, najczęstsze są INNER JOIN I OUTER JOIN.

w tym samouczku krótko przyjrzymy się różnicy między INNERa OUTER JOIN, a następnie zbadamy skróconą metodę, którą Oracle zapewnia do wykonywania OUTER JOINS, używając w szczególności symbolu operatora +.

Co to jest łącznik wewnętrzny?,

AnINNER JOIN w relacyjnej bazie danych jest po prostu połączeniem dwóch lub więcej tabel, w których wynik będzie zawierał tylko dane spełniające wszystkie warunki łączenia.

na przykład mamy tutaj podstawowy schemat library zawierający dwie tabele: books I languages.,

tymczasem naszabooks tabela malanguage_id wiersz, który dla większości, ale nie wszystkich, książek zawiera po prostulanguage_id powiązany z oryginalnym opublikowanym językiem książki:

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

w wielu przypadkach możemy chcieć wykonać INNER JOINz booksI languages, więc zamiast przeglądać bezsensowne language_idwartość każdej książki, możemy rzeczywiście zobaczyć language name zamiast tego.,

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

najważniejsze jest to, że nasz zestaw wyników był nieco inny w powyższych dwóch zapytaniach. W pierwszym po prostu wymieniliśmy pierwsze książki10, ale w zapytaniu INNER JOIN zwracamy tylko wyniki, które spełniają wszystkie warunki z obu tabel. Z tego powodu rekord Hamlet (który ma language_id wartość null lub PUSTY) jest ignorowany i nie zwracany w wyniku naszego INNER JOIN.,

Co to jest złącze zewnętrzne?

zamiast zwracać wyłącznie wyniki, które spełniają wszystkie warunki połączenia an INNER JOIN, an OUTER JOIN zwraca nie tylko wyniki, które spełniają wszystkie warunki, ale także wiersze z jednej tabeli, które nie spełniły tego warunku. Tabela, która jest wybrana dla tego „obejścia” wymagań warunkowych, jest określana przez kierunkowość lub” stronę ” połączenia, zwykle określane jako LEFT lub RIGHT połączenia zewnętrzne.,

definiując stronę do twojegoOUTER JOIN, określasz, która tabela zawsze zwróci swój wiersz, nawet jeśli przeciwstawna tabela po drugiej stronie połączenia ma brakujące wartości lubnull jako część warunku połączenia.,

dlatego, jeśli wykonamy tę samą podstawową JOIN jak powyżej, aby pobrać books I language names, wiemy, że nasza books tabela powinna zawsze zwracać dane, więc nasza JOIN strona powinna „wskazywać na” naszą books tabelę, dzięki czemu languages tabelę OUTER tabelę, którą do niej dołączamy.,

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

zgodnie z oczekiwaniami, używającLEFT OUTER JOIN zamiast poprzedniegoINNER JOIN, otrzymujemy najlepsze z obu światów: nie pomijamy żadnychbooks rekordy (takie jakHamlet) po prostu dlatego, żelanguage_id wartość jestnull dla tego rekordu, ale dla wszystkich rekordów, gdzielanguage_id istnieje, otrzymujemy ładnie sformatowanąlanguage name uzyskaną z naszej tabelilanguages.,

Wykonywanie złączeń zewnętrznych za pomocą symbolu ( + )

jak wskazano w oficjalnej dokumentacji, Oracle udostępnia specjalny symbolouter join operator (symbol+), który jest skrótem do wykonywaniaOUTER JOINS.

w praktyce symbol+ jest umieszczany bezpośrednio w instrukcji warunkowej i po stronie opcjonalnej tabeli (tej, która może zawierać puste lub null wartości w ramach warunkowej).,

dlatego możemy ponownie przepisać powyższeLEFT OUTER JOIN wyrażenie używając+ operator w ten sposób:

wyniki są takie same jak w powyższym przykładzieLEFT OUTER JOIN, więc nie będziemy ich tutaj umieszczać. Jest jednak jeden krytyczny aspekt, który należy zwrócić uwagę na składnię przy użyciu operatora + dla OUTER JOINS.

operator+ musi znajdować się po lewej stronie znaku warunkowego (po lewej stronie znaku=)., Dlatego w tym przypadku, ponieważ chcemy zapewnić, że nasza tabela languages jest opcjonalną tabelą, która może zwracać null wartości podczas tego porównania, zamieniliśmy kolejność tabel w tym warunkowym, więc languages jest po lewej stronie (i jest opcjonalne), podczas gdy books jest po prawej stronie.

wreszcie, z powodu zmiany kolejności boków tabeli w trybie warunkowym przy użyciu operatora+, ważne jest, aby zdać sobie sprawę, że powyższe jest po prostu skrótem RIGHT OUTER JOIN., Oznacza to, że ten fragment zapytania:

FROM books b, library.languages lWHERE l.id (+)= b.language_id

…jest faktycznie identyczny z tym:

FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id