Bu çok yaygın bir soru, bu yüzden bu cevap yazdığım makaleye dayanıyor .
Tablo ilişkisi
Aşağıdaki tablolara post
ve post_comment
tablolara sahip olduğumuzu düşünürsek :
post
Aşağıdaki kayıtları vardır:
| id | title |
|----|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
ve post_comment
aşağıdaki üç satıra sahiptir:
| id | review | post_id |
|----|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
SQL İÇ KATILIM
SQL JOIN deyimi, farklı tablolara ait satırları ilişkilendirmenizi sağlar. Örneğin, bir CROSS JOIN , iki birleştirme tablosu arasındaki tüm olası satır kombinasyonlarını içeren bir Kartezyen Ürün oluşturacaktır.
CROSS JOIN belirli senaryolarda yararlı olsa da, çoğu zaman belirli bir koşula bağlı olarak tablolara katılmak istersiniz. İşte bu noktada INNER JOIN devreye giriyor.
SQL INNER JOIN, ON yan tümcesi ile belirtilen bir koşula göre iki tabloyu birleştirerek Kartezyen Ürünü filtrelememizi sağlar.
SQL INNER JOIN - "her zaman doğru" koşulda
"Her zaman doğru" koşulu sağlarsanız, INNER JOIN birleştirilen kayıtları filtrelemez ve sonuç kümesi iki birleştirme tablosunun Kartezyen Ürününü içerecektir.
Örneğin, aşağıdaki SQL INNER JOIN sorgusunu çalıştırırsak:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 1
Tüm kombinasyonları post
ve post_comment
kayıtları alacağız :
| p.id | pc.id |
|---------|------------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
Dolayısıyla, ON yan tümcesi koşulu "her zaman doğru" ise, INNER JOIN bir CROSS JOIN sorgusuna eşdeğerdir:
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 - AÇIK "her zaman yanlış" koşulu
Öte yandan, ON yan tümcesi koşulu "her zaman yanlış" ise, birleştirilen tüm kayıtlar filtrelenir ve sonuç kümesi boş olur.
Bu nedenle, aşağıdaki SQL INNER JOIN sorgusunu çalıştırırsak:
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
Herhangi bir sonuç alamayacağız:
| p.id | pc.id |
|---------|------------|
Bunun nedeni yukarıdaki sorgunun aşağıdaki CROSS JOIN sorgusuna eşdeğer olmasıdır:
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
Yabancı Anahtar ve Birincil Anahtar sütunlarını kullanarak SQL INNER JOIN - ON yan tümcesi
En yaygın ON yan tümcesi koşulu, aşağıdaki sorguda gösterildiği gibi, alt tablodaki Yabancı Anahtar sütununu üst tablodaki Birincil Anahtar sütunuyla eşleştiren koşuldur:
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
Yukarıdaki SQL INNER JOIN sorgusu yürütülürken, aşağıdaki sonuç kümesi elde ediyoruz:
| 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 |
Bu nedenle, yalnızca ON yan tümcesi koşulu ile eşleşen kayıtlar sorgu sonuç kümesine dahil edilir. Bizim durumumuzda, sonuç kümesi kayıtlarıyla post
birlikte tüm bunları içerir post_comment
. post
Hiçbir ilişkilendirmiş satırlar post_comment
bunlar AÇIK Madde koşulunu tatmin edemez çünkü dışlanır.
Yine, yukarıdaki SQL INNER JOIN sorgusu aşağıdaki CROSS JOIN sorgusuna eşdeğerdir:
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
Vurulmamış satırlar, WHERE yan tümcesini karşılayan satırlardır ve yalnızca bu kayıtlar sonuç kümesine dahil edilecektir. INNER JOIN deyiminin nasıl çalıştığını görselleştirmenin en iyi yolu budur.
| p.id | pc.post_id | pc.id | p.title | pc.review |
| ------ | ------------ | ------- | ----------- | --------- - |
| 1 | 1 | 1 | Java | İyi |
| 1 | 1 | 2 | Java | Mükemmel |
| 1 | 2 | 3 | Java | Müthiş |
| 2 | 1 | 1 | Hazırda Beklet | İyi |
| 2 | 1 | 2 | Hazırda Beklet | Mükemmel |
| 2 | 2 | 3 | Hazırda Beklet | Müthiş |
| 3 | 1 | 1 | JPA | İyi |
| 3 | 1 | 2 | JPA | Mükemmel |
| 3 | 2 | 3 | JPA | Müthiş |
Sonuç
Bir INNER JOIN deyimi, bir INNER JOIN sorgusunun ON yan tümcesinde kullandığınız koşulla eşleşen bir WHERE yan tümcesi ile CROSS JOIN olarak yeniden yazılabilir.
Bu sadece INNER JOIN için geçerli değildir, OUTER JOIN için geçerli değildir.