Alt sorgu bir tablo döndürür
Ve son olarak, üçüncü seçenek, alt sorgunun tüm tabloyu döndürmesidir. Bu en yaygın seçenektir.
Çoğu zaman belirli bir tabloyu biraz değiştirmek istediğimiz durumlar olur. Ve ancak o zaman (JOIN ON operatörünü kullanarak) düzeltilmiş tabloyu başka bir tabloyla birleştirin.
İki tabloyu JOIN ile birleştirdiğimiz en basit durumla başlayalım:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
Ve muhtemelen hatırladığınız gibi , görev tablosunda kimseye atanmamış görevler vardır : çalışan_kimliği NULL'dur .
Tüm asılı görevleri yönetmene atadığımız düzeltilmiş bir tablo oluşturalım (kimliği = 4).
Bunu yapmak için IFNULL() işlevini kullanırız :
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
Ve bu sorgunun sonucu:
İ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 satın al | 2022-09-01 |
6 | 4 | 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) |
Düzeltilen hücre kırmızı ile işaretlenmiştir.
Şimdi düzeltilmiş tablomuzu sorgunun yerine koyalım:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
Görev tablosu yerine .
Böyle bir istek şuna benzer:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
Görev kelimesi yerine parantezler yazdık ve istek gövdesini bunların içine yerleştirdik.
Bu arada, iç içe geçmiş sorgu için takma ad t (takma ad) çok kullanışlıydı. Tablodan farklı olarak iç içe geçmiş bir sorgunun kendi adı yoktur, bu nedenle takma ad çok yersizdir.
Ve işte böyle bir 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 | 6 | 4 | ofisi temizle |
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 | 4 | 5 | kahve satın al |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 2015-10-10 | 5 | 5 | kahve satın al |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 2015-10-10 | 3 | 5 | kahve satın al |
6 | Vaska | kedi | 1000 | 3 | 2018-11-11 | 8 | 6 | Hayatın tadını çıkar |
Müdürümüzün “ofisi temizleme” görevi var, onu devredecek birini çabucak bulacağını düşünüyorum :) WITH operatörünü kullanarak
Bu arada, MySQL'in 8. sürümünden başlayarak, artık tüm alt sorgularınızı son sorgunun içine koymak zorunda değilsiniz. Ayrı olarak gerçekleştirilebilirler. Bunun için WITH deyimi kullanılır .
Sanal bir tablo (adlandırılmış sorgu) oluşturmanıza olanak tanır ve görünümü bir şablon tarafından verilir:
WITH Name AS (request)
Alt sorgunuzun, benzersiz bir ad atamadığınız COUNT(*) gibi adsız sütunlara sahip olduğu zamanlar vardır. Bu durumda, WITH deyimi, alt sorgu için yeni sütun adları belirleme seçeneğine sahiptir.
İkinci formu şablon tarafından verilir:
WITH Name(column1, column2, …) AS (request)
İstediğiniz kadar sanal tablo (adlandırılmış sorgular) kullanabilir ve bunlarda birbirinize başvurabilirsiniz. Talebinizin genel şekli şuna benzer olacaktır:
WITH name1 AS (request1),
name2 AS (request2),
name3 AS (request3)
SELECT * FROM name1 JOIN name2 ON …
Şimdi korkutucu sorgumuzu alalım:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
Ve WITH ifadesini kullanarak yeniden yazın:
WITH task2(id, employee_id, name, deadline)
AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
Veya sütun adları olmadan da yapabilirsiniz, ancak o zaman IFNULL() işlevi için bir diğer ad belirtmeniz gerekir:
WITH task2 AS (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id