OUTER JOIN'in nedenleri
Bu arada, e-tablolarımızı birleştirdiğimiz ve henüz bir temizleyici olmadığı için ofis temizliği görevlerimizin ortadan kalktığı zamanı hatırlıyor musunuz?
Bunun gibi bir sorgu çalıştırırsanız:
SELECT * FROM task
Sonra bu sonucu elde ederiz:
İD | çalışan kimliği | isim | son teslim tarihi |
---|---|---|---|
1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 |
2 | 2 | Arka uçtaki bir hatayı düzeltin | 2022-06-15 |
3 | 5 | kahve satın al | 2022-07-01 |
4 | 5 | kahve satın al | 2022-08-01 |
5 | 5 | kahve alacak | 2022-09-01 |
6 | (HÜKÜMSÜZ) | ofisi temizle | (HÜKÜMSÜZ) |
7 | 4 | Hayatın tadını çıkar | (HÜKÜMSÜZ) |
8 | 6 | Hayatın tadını çıkar | (HÜKÜMSÜZ) |
Görev tablosunu çalışan_kimliği ile çalışan tablosuyla birleştirmeye çalışırsak “Clear Office” görevi kaybolur.
Bu sorunu çözmek için, JOIN operatörüne bu tür yetim satırların bir çift olmadan başka bir tabloda saklanmasına izin veren çeşitli değiştiriciler eklenmiştir.
JOIN operatörünün klasik halini hatırlatayım:
table 1 JOIN table 2 ON
condition
SQL Server'a sol tablodaki (tablo1) tüm verilerin birleştirilmiş tabloda bulunduğundan emin olmasını söyleyebiliriz. Doğru masada onlar için bir çift olmasa bile. Bunu yapmak için, sadece yazmanız gerekir:
table 1 LEFT JOIN table 2 ON condition
Birleştirilmiş tablonun sağ tablodaki tüm satırlara sahip olmasını istiyorsanız , şunu yazmanız gerekir:
table 1 RIGHT JOIN table 2 ON
condition
Yürütücüsü olmayan görevlerin kaybolmaması için tüm görevleri ve çalışanları birleştirecek bir sorgu yazalım. Bunu yapmak için bir sorgu yazın:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
Ve bu sorgunun sonucu:
İD | isim | meslek | maaş | yaş | katılmak_tarihi | İD | çalışan kimliği | isim |
---|---|---|---|---|---|---|---|---|
1 | İvanov İvan | Programcı | 100000 | 25 | 2012-06-30 | 1 | 1 | Ön uçtaki bir hatayı düzeltin |
2 | Petrov Petr | Programcı | 80000 | 23 | 2013-08-12 | 2 | 2 | Arka uçtaki bir hatayı düzeltin |
4 | Rabinovich Moisha | Müdür | 200000 | 35 | 2015-05-12 | 7 | 4 | Hayatın tadını çıkar |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 2015-10-10 | 3 | 5 | kahve satın al |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 2015-10-10 | 4 | 5 | kahve satın al |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 2015-10-10 | 5 | 5 | kahve satın al |
6 | Vaska | kedi | 1000 | 3 | 2018-11-11 | 8 | 6 | Hayatın tadını çıkar |
(HÜKÜMSÜZ) | (HÜKÜMSÜZ) | (HÜKÜMSÜZ) | (HÜKÜMSÜZ) | (HÜKÜMSÜZ) | (HÜKÜMSÜZ) | 6 | (HÜKÜMSÜZ) | ofisi temizle |
Tablomuza bir satır daha eklendi ve ilginç bir şekilde içinde bir çok NULL değeri var. Çalışan tablosundan “Ofis Temizliği” görevi için yürütücü olmadığı için çalışan tablosundan alınan tüm veriler NULL olarak görüntülenir.
BİRLEŞTİRME türleri
Toplamda 4 tip JOIN vardır. Aşağıdaki tabloda sunulmuştur:
Kısa giriş | uzun giriş | Açıklama | |
---|---|---|---|
1 | KATILMAK | İÇ BİRLEŞİM | Yalnızca A ve B tablolarında bulunan kayıtlar |
2 | SOL YÖNDEN KATILIM | SOL DIŞ KATILMA | Tablo A'dan bir çift içermeyen tüm satırlar |
3 | SAĞ KATIL | SAĞ DIŞ BİRLEŞİM | Tablo B'den bir çift içermeyen tüm satırlar |
4 | DIŞ BİRLEŞTİRME | TAM DIŞ BİRLEŞTİRME | A ve B tablolarındaki tüm baz çifti sıraları |
Basitlik için, tabloları kümeler halinde temsil edersek, JOIN bir resim olarak görüntülenebilir:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
Set kesişimi, bir tablo için, başvuruda bulunduğu başka bir tablodan karşılık gelen bir kayıt olduğu anlamına gelir.
Röportajdan soru
Bazen acemi programcılar bir röportajda çok basit bir soruyla bombardımana tutulur. Tablolarımız göz önüne alındığında, aşağıdaki gibi formüle edilebilir:
" Görevi olmayan tüm çalışanların listesini görüntüleyecek bir sorgu yazın ." Öncelikle, bu soruyu biraz yeniden ifade etmeye çalışalım: " Görev tablosunda görev bulunmayan, çalışan tablosundaki tüm çalışanların listesini görüntüleyecek bir sorgu yazın ." Bu seti almamız gerekiyor:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
Bu sorunu çözmenin pek çok yolu var ama ben en basitinden başlayacağım: İlk olarak, tablolarımızı LEFT JOIN ile birleştirebilir ve ardından NULL'larla eksik verilerin doldurulduğu tüm satırları hariç tutmak için WHERE'yi kullanabilirsiniz.
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
Ve bu sorgunun sonucu:
İD | isim | meslek | maaş | yaş | katılmak_tarihi | İD | çalışan kimliği | isim |
---|---|---|---|---|---|---|---|---|
3 | İvanov Sergey | test cihazı | 40000 | otuz | 2014-01-01 | (HÜKÜMSÜZ) | (HÜKÜMSÜZ) | (HÜKÜMSÜZ) |
Bu çözümün tek dezavantajı, burada tablodaki satırların NULL içermesi ve koşula göre bir çalışan listesi göstermemiz gerekmesidir.
Bunu yapmak için ya çalışan tablosunun gerekli sütunlarını SELECT'te listelemeniz gerekir ya da hepsini görüntülemeniz gerekiyorsa aşağıdaki yapıyı yazabilirsiniz:
SELECT e.* FROM employee e, task t
Tam istek şöyle görünecektir:
SELECT e.*
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
bu sorgunun sonucu:
İD | isim | meslek | maaş | yaş | katılmak_tarihi |
---|---|---|---|---|---|
3 | İvanov Sergey | test cihazı | 40000 | otuz | 2014-01-01 |
Yöntemlerin geri kalanı ödev için size bırakılmıştır. Onları kendin bulma zevkinden seni mahrum etmek istemiyorum.