• 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