- Apa itu Inner Join?
- Apa itu Outer Join?
- Melakukan Penggabungan Luar Menggunakan Simbol (+)
Seperti hampir semua database relasional, Oracle memungkinkan kueri dihasilkan yang menggabungkan atau JOIN baris dari dua atau lebih tabel untuk membuat set hasil akhir. Meskipun ada banyak jenis gabungan yang dapat dilakukan, yang paling umum adalah INNER JOIN dan OUTER JOINS .
Dalam tutorial ini, kita akan secara singkat mengeksplorasi perbedaan antara INNER dan OUTER JOINS dan kemudian periksa metode singkatan yang disediakan Oracle untuk melakukan OUTER JOINS khusus menggunakan + simbol operator.
Apa itu Inner Join?
Sebuah INNER JOIN dalam database relasional hanyalah penggabungan dua atau lebih tabel di mana hasilnya hanya berisi data yang memenuhi semua kondisi gabungan .
Misalnya, di sini kita memiliki library basic dasar skema dengan dua tabel:books dan languages . languages tabel hanyalah daftar nama bahasa yang mungkin dan bahasa yang unik id :
SELECT * FROM library.languages;
id name
1 English
2 French
3 German
4 Mandarin
5 Spanish
6 Arabic
7 Japanese
8 Russian
9 Greek
10 Italian
Sementara itu, books tabel memiliki language_id baris yang untuk sebagian besar, tetapi tidak semua, buku hanya berisi language_id terkait dengan bahasa asli buku yang diterbitkan:
SELECT * FROM
books
ORDER BY
id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language_id
1 In Search of Lost Time Marcel Proust 1913 2
2 Ulysses James Joyce 1922 1
3 Don Quixote Miguel de Cervantes 1605 5
4 Moby Dick Herman Melville 1851 1
5 Hamlet William Shakespeare 1601 (null)
6 War and Peace Leo Tolstoy 1869 8
7 The Odyssey Homer -700 9
8 The Great Gatsby F. Scott Fitzgerald 1925 1
9 The Divine Comedy Dante Alighieri 1472 10
10 Madame Bovary Gustave Flaubert 1857 2
Dalam banyak kasus, kami mungkin ingin melakukan INNER JOIN dari books dan languages tabel jadi daripada melihat language_id yang tidak berarti nilai setiap buku, kita benar-benar dapat melihat language name sebagai gantinya.
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b
INNER JOIN
library.languages l
ON
b.language_id = l.id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language
1 In Search of Lost Time Marcel Proust 1913 French
2 Ulysses James Joyce 1922 English
3 Don Quixote Miguel de Cervantes 1605 Spanish
4 Moby Dick Herman Melville 1851 English
6 War and Peace Leo Tolstoy 1869 Russian
7 The Odyssey Homer -700 Greek
8 The Great Gatsby F. Scott Fitzgerald 1925 English
9 The Divine Comedy Dante Alighieri 1472 Italian
10 Madame Bovary Gustave Flaubert 1857 French
11 The Brothers Karamazov Fyodor Dostoyevsky 1880 Russian
Yang penting untuk diperhatikan di sini adalah bahwa kumpulan hasil kami sedikit berbeda dalam dua kueri di atas. Pada bagian pertama, kami hanya mencantumkan 10 pertama buku, tetapi dalam INNER JOIN kueri kami hanya mengembalikan hasil yang memenuhi semua ketentuan dari kedua tabel. Untuk alasan ini, catatan Hamlet (yang memiliki language_id nilai null atau kosong) diabaikan dan tidak dikembalikan dalam hasil INNER JOIN .
Apa itu Outer Join?
Alih-alih secara eksklusif mengembalikan hasil yang memenuhi semua kondisi gabungan dari INNER JOIN , sebuah OUTER JOINS mengembalikan tidak hanya hasil yang memenuhi semua kondisi, tetapi juga mengembalikan baris dari satu tabel yang tidak memenuhi kondisi. Tabel yang dipilih untuk "memotong" persyaratan bersyarat ini ditentukan oleh arah atau "sisi" gabungan, biasanya disebut sebagai LEFT atau RIGHT gabungan luar.
Saat menentukan sisi ke OUTER JOINS Anda , Anda menentukan tabel mana yang akan selalu mengembalikan barisnya meskipun berlawanan tabel di sisi lain gabungan tidak ada atau null nilai sebagai bagian dari kondisi bergabung.
Oleh karena itu, jika kita melakukan JOIN dasar yang sama seperti di atas untuk mengambil books dan language name , kami tahu bahwa books our kami tabel harus selalu mengembalikan data, jadi JOIN our sisi harus "menunjuk ke arah" books kami tabel, sehingga membuat languages tabel OUTER tabel yang kami lampirkan.
Untuk mencapai ini, kita cukup mengubah:
books b INNER JOIN library.languages l
…untuk ini:
books b LEFT OUTER JOIN library.languages l
Dengan demikian, seluruh kueri dan kumpulan hasil terlihat hampir identik dengan INNER JOIN kecuali perubahan kecil itu:
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b
LEFT OUTER JOIN
library.languages l
ON
b.language_id = l.id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
id title author year_published language
1 In Search of Lost Time Marcel Proust 1913 French
2 Ulysses James Joyce 1922 English
3 Don Quixote Miguel de Cervantes 1605 Spanish
4 Moby Dick Herman Melville 1851 English
5 Hamlet William Shakespeare 1601 (null)
6 War and Peace Leo Tolstoy 1869 Russian
7 The Odyssey Homer -700 Greek
8 The Great Gatsby F. Scott Fitzgerald 1925 English
9 The Divine Comedy Dante Alighieri 1472 Italian
10 Madame Bovary Gustave Flaubert 1857 French
Seperti yang diharapkan, dengan menggunakan LEFT OUTER JOIN bukannya INNER JOIN sebelumnya , kami mendapatkan yang terbaik dari kedua dunia:Kami tidak melewatkan books apa pun catatan (seperti Hamlet ) hanya karena language_id nilainya null untuk catatan itu, namun untuk semua catatan di mana language_id ada, kami mendapatkan language name yang diformat dengan baik diperoleh dari languages . kami tabel.
Melakukan Gabungan Luar Menggunakan Simbol (+)
Seperti yang ditunjukkan dalam dokumentasi resmi, Oracle menyediakan outer join operator khusus (+ simbol) yang merupakan singkatan untuk melakukan OUTER JOINS .
Dalam praktiknya, + simbol ditempatkan langsung dalam kondisi pernyataan dan di sisi tabel opsional (yang diperbolehkan berisi kosong atau null nilai dalam kondisi).
Oleh karena itu, sekali lagi kita dapat menulis ulang LEFT OUTER JOIN kita di atas pernyataan menggunakan + operator seperti ini:
SELECT
b.id,
b.title,
b.author,
b.year_published,
l.name language
FROM
books b,
library.languages l
WHERE
l.id (+)= b.language_id
ORDER BY
b.id
FETCH FIRST 10 ROWS ONLY;
Hasilnya sama dengan standar LEFT OUTER JOIN contoh di atas, jadi kami tidak akan menyertakannya di sini. Namun, ada satu aspek penting yang perlu diperhatikan tentang sintaks menggunakan + operator untuk OUTER JOINS .
+ operator harus berada di sisi kiri kondisional (kiri sama dengan = tanda). Oleh karena itu, dalam hal ini, karena kami ingin memastikan bahwa languages . kami table adalah tabel opsional yang dapat mengembalikan null nilai selama perbandingan ini, kami menukar urutan tabel dalam kondisi ini, jadi languages ada di sebelah kiri (dan opsional) sementara books ada di sebelah kanan.
Terakhir, karena penataan ulang sisi tabel dalam kondisi saat menggunakan + operator, penting untuk menyadari bahwa di atas hanyalah singkatan untuk RIGHT OUTER JOIN . Ini berarti potongan kueri ini:
FROM
books b,
library.languages l
WHERE
l.id (+)= b.language_id
…secara efektif identik dengan ini:
FROM
library.languages l
RIGHT OUTER JOIN
books b
ON
b.language_id = l.id