- 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 INNER
a 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 JOIN
z books
I languages
, więc zamiast przeglądać bezsensowne language_id
wartość 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
Dodaj komentarz