Ini adalah pertanyaan yang sangat umum, jadi jawaban ini didasarkan pada artikel yang saya tulis ini.
Hubungan meja
Mengingat kami memiliki tabel post
dan post_comment
tabel berikut :
The post
memiliki catatan berikut:
| id | title |
|----|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
dan post_comment
memiliki tiga baris berikut:
| id | review | post_id |
|----|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
SQL INNER BERGABUNG
Klausa SQL JOIN memungkinkan Anda untuk mengaitkan baris milik tabel yang berbeda. Misalnya, CROSS JOIN akan membuat Produk Cartesian yang berisi semua kemungkinan kombinasi baris antara dua tabel yang bergabung.
Meskipun CROSS JOIN berguna dalam skenario tertentu, sebagian besar waktu, Anda ingin bergabung dengan tabel berdasarkan kondisi tertentu. Dan, di situlah INNER BERGABUNG berperan.
SQL INNER JOIN memungkinkan kita untuk menyaring Produk Cartesian dari bergabung dengan dua tabel berdasarkan kondisi yang ditentukan melalui klausa ON.
SQL INNER JOIN - ON "selalu benar" kondisi
Jika Anda memberikan kondisi "selalu benar", INNER JOIN tidak akan memfilter rekaman yang bergabung, dan kumpulan hasil akan berisi Produk Cartesian dari dua tabel bergabung.
Misalnya, jika kami menjalankan query SQL INNER JOIN berikut:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 1
Kami akan mendapatkan semua kombinasi post
dan post_comment
catatan:
| p.id | pc.id |
|---------|------------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
Jadi, jika kondisi klausa ON "selalu benar", INNER JOIN sama dengan kueri CROSS JOIN:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
CROSS JOIN post_comment
WHERE 1 = 1
ORDER BY p.id, pc.id
SQL INNER JOIN - ON "selalu salah" kondisi
Di sisi lain, jika kondisi klausa ON "selalu salah", maka semua catatan yang bergabung akan disaring dan hasil yang ditetapkan akan kosong.
Jadi, jika kita menjalankan query SQL INNER JOIN berikut:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 0
ORDER BY p.id, pc.id
Kami tidak akan mendapatkan hasil apa pun:
| p.id | pc.id |
|---------|------------|
Itu karena kueri di atas setara dengan kueri Gabung Gabung berikut:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
CROSS JOIN post_comment
WHERE 1 = 0
ORDER BY p.id, pc.id
SQL INNER JOIN - ON klausa menggunakan kolom Foreign Key dan Primary Key
Kondisi klausa ON paling umum adalah kondisi yang cocok dengan kolom Kunci Asing di tabel anak dengan kolom Kunci Utama di tabel induk, seperti yang diilustrasikan oleh permintaan berikut:
SELECT
p.id AS "p.id",
pc.post_id AS "pc.post_id",
pc.id AS "pc.id",
p.title AS "p.title",
pc.review AS "pc.review"
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id
ORDER BY p.id, pc.id
Saat menjalankan query SQL INNER JOIN di atas, kami mendapatkan hasil sebagai berikut:
| p.id | pc.post_id | pc.id | p.title | pc.review |
|---------|------------|------------|------------|-----------|
| 1 | 1 | 1 | Java | Good |
| 1 | 1 | 2 | Java | Excellent |
| 2 | 2 | 3 | Hibernate | Awesome |
Jadi, hanya catatan yang cocok dengan kondisi klausa ON yang termasuk dalam set hasil kueri. Dalam kasus kami, set hasil berisi semua post
beserta post_comment
catatannya. The post
baris yang telah ada terkait post_comment
dikecualikan karena mereka tidak dapat memenuhi kondisi ON Clause.
Sekali lagi, kueri SQL INNER JOIN di atas setara dengan kueri CROSS JOIN berikut:
SELECT
p.id AS "p.id",
pc.post_id AS "pc.post_id",
pc.id AS "pc.id",
p.title AS "p.title",
pc.review AS "pc.review"
FROM post p, post_comment pc
WHERE pc.post_id = p.id
Baris yang tidak disambar adalah yang memenuhi klausa WHERE, dan hanya catatan ini yang akan dimasukkan dalam hasil yang ditetapkan. Itulah cara terbaik untuk memvisualisasikan cara kerja klausa INNER JOIN.
| p.id | pc.post_id | pc.id | p.title | pc.review |
| ------ | ------------ | ------- | ----------- | --------- - |
| 1 | 1 | 1 | Jawa | Bagus |
| 1 | 1 | 2 | Jawa | Luar Biasa |
| 1 | 2 | 3 | Jawa | Luar Biasa |
| 2 | 1 | 1 | Hibernasi | Bagus |
| 2 | 1 | 2 | Hibernasi | Luar Biasa |
| 2 | 2 | 3 | Hibernasi | Luar Biasa |
| 3 | 1 | 1 | JPA | Bagus |
| 3 | 1 | 2 | JPA | Luar Biasa |
| 3 | 2 | 3 | JPA | Luar Biasa |
Kesimpulan
Pernyataan INNER JOIN dapat ditulis ulang sebagai CROSS JOIN dengan klausa WHERE yang cocok dengan kondisi yang sama dengan yang Anda gunakan pada klausa ON dari permintaan INNER JOIN.
Bukan berarti ini hanya berlaku untuk INNER JOIN, bukan untuk OUTER JOIN.