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