- 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