- co je to vnitřní spojení?
- co je vnější spojení?
- Provedení Vnější Spojení Pomocí (+) Symbol
Jako prakticky všechny relační databáze, Oracle umožňuje dotazy, které mají být generovány, které kombinují nebo JOIN
řádky ze dvou nebo více tabulek, které chcete vytvořit konečný výsledek nastavit., Zatímco existuje mnoho typů spojení, které lze provést, nejběžnější jsou INNER JOIN
a OUTER JOIN
.
V tomto tutoriálu, budeme stručně zkoumat rozdíl mezi INNER
OUTER JOIN
a pak zkoumat zkratka metoda Oracle poskytuje pro provádění OUTER JOINS
konkrétně pomocí +
operátor symbol.
co je vnitřní spojení?,
INNER JOIN
v relační databázi je prostě spojení dvou nebo více tabulek ve kterém bude výsledek obsahovat pouze údaje, které splněny všechny připojit podmínky.
například, tady máme základní library
schéma se dvě tabulky: books
languages
.,>
Mezitím, naše books
stolek má language_id
řada, která pro většinu, ale ne všechny, knihy jednoduše obsahuje language_id
spojené s původní verzi a jazyk knihy:
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
V mnoha případech, můžeme chtít provést INNER JOIN
books
languages
tabulky, takže spíše než prohlížení smysl. language_id
hodnota každé knize, můžeme skutečně vidět language name
místo.,
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
důležité je poznamenat, že naše sada výsledků se ve výše uvedených dvou dotazech mírně lišila. V prvním jsme jednoduše uvedeny na první 10
knihy, ale v INNER JOIN
dotaz jsme jen vrací výsledky, které splňují všechny podmínky z obou tabulek. Z tohoto důvodu, záznam Hamlet
(který má language_id
hodnota null
nebo prázdná), je ignorován a není vrácena ve výsledku z našich INNER JOIN
.,
co je vnější spojení?
Místo výhradně vrací výsledky, které splňují všechny připojit podmínky INNER JOIN
OUTER JOIN
vrátí ne pouze výsledky, které splňují všechny podmínky, ale také se vrací řádky z jedné tabulka, která nesplňuje podmínku. Stůl, který je vybrán pro toto „obejít“ podmíněné požadavky určuje směr nebo „vedlejší“ spojení, obvykle odkazoval se na jako LEFT
nebo RIGHT
vnější spojení.,
Při definování straně, aby OUTER JOIN
, ty jsou určující, které tabulky se bude vždy vrátit jeho řádku, i když protichůdné tabulka na druhé straně join chybí nebo null
hodnoty jako část spojování stavu.,
Proto, pokud budeme provádět stejné základní JOIN
jako výše načíst books
language names
, víme, že naše books
tabulka by měla vždy vrátit data, takže naše JOIN
strana by měla „směřovat“ books
tabulky, čímž languages
tabulka OUTER
tabulky jsme připojení.,> kromě toho, že menší úpravy:
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
Jak se očekávalo, pomocí LEFT OUTER JOIN
namísto předchozí INNER JOIN
, dostáváme to nejlepší z obou světů: Nejsme přeskakují books
záznamy (například Hamlet
) jednoduše proto, že language_id
je hodnota null
pro ten rekord, ale pro všechny záznamy, kde language_id
existuje, jsme si pěkně formátované language name
získáno z našeho languages
tabulka.,
Provedení Vnější Spojení Pomocí (+) Symbol
Jak je uvedeno v oficiální dokumentaci, Oracle poskytuje speciální outer join operator
(+
symbol), který je zkratka pro provádění OUTER JOINS
.
V praxi, +
symbol je umístěn přímo v podmíněný příkaz a na straně volitelné stůl (ten, který je dovoleno obsahovat prázdné nebo null
hodnoty v rámci podmíněného).,
Proto můžeme opět přepsat naše výše LEFT OUTER JOIN
prohlášení pomocí +
operátor tak jako:
výsledky jsou stejné jako standardní LEFT OUTER JOIN
příklad výše, takže nebudeme je sem patří. Nicméně, tam je jeden zásadní aspekt oznámení o syntaxi pomocí +
operátor OUTER JOINS
.
+
provozovatel musí být na levé straně podmíněná (vlevo rovná =
značka)., Proto, v tomto případě, protože chceme zajistit, aby naše languages
tabulka je volitelné tabulky, které můžeme vrátit null
hodnoty v tomto srovnání jsme si vyměnili pořadí tabulek v této podmíněné, takže languages
je na levé straně (a je nepovinný) zatímco books
je na pravé straně.
a Konečně, protože toto pořadí v tabulce strany v podmíněném při používání +
provozovatel, je důležité si uvědomit, že výše uvedené je prostě zkratka pro RIGHT OUTER JOIN
., To znamená, že tento fragment dotazu:
FROM books b, library.languages lWHERE l.id (+)= b.language_id
…je fakticky totožný s tímto:
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
Napsat komentář