SQL'de iç içe sorgular

SQL dili, bir sorguyu başka bir sorgunun içine yerleştirmenize olanak tanır. Bu, kodun okunabilirliği büyük ölçüde azaltılsa da, büyük ve karmaşık bir şey yapacak çok büyük bir sorgu yazmayı mümkün kılar.

Alt sorguların kaç değer döndürdüğüne bağlı olarak uygulanabilecekleri alan değişir. Toplamda üç seçenek vardır:

  • Alt sorgu, tek bir değer (bir sütun ve bir satır) döndürür.
  • Alt sorgu, bir değer listesi döndürür (tek sütunlu bir tablo).
  • Alt sorgu bir tablo döndürür (birçok sütun, herhangi bir sayıda satır).

Her durum için bir örneğe bakalım.

Skaler sonuçlu alt sorgu

Çalışan tablosundan maaşı şirket ortalamasından yüksek olan tüm çalışanlarımızın listesini bulalım. Nasıl yapabiliriz?

Önceden bilirsek, maaşlarını ortalama ile karşılaştırarak çalışanları kolayca filtreleyebiliriz. Aynı zamanda, şirket çalışanlarının ortalama maaşını hesaplamamızı sağlayan bir sorgu yazmıştık. hatırlayalım:

SELECT AVG(salary) FROM employee 

Sonra MySQL bize şu değeri verdi: 76833.3333 .

Şimdi maaşı ortalamanın üzerinde olan tüm çalışanların bir listesini nasıl bulabilirim? Ayrıca çok basit:

 SELECT * FROM employee 
   WHERE salary > 76833.3333 

Bu sorgunun sonucu şöyle olacaktır:

İD isim meslek maaş
1 İvanov İvan Programcı 100000
2 Petrov Petr Programcı 80000
4 Rabinovich Moisha Müdür 200000

Ve şimdi, 76833 değeri yerine ilk isteği değiştirerek her iki isteği de birleştiriyoruz:

   SELECT * FROM employee 
   WHERE salary > (SELECT AVG(salary) FROM employee) 

Bu sorgunun sonucu aynı olacaktır:

İD isim meslek maaş
1 İvanov İvan Programcı 100000
2 Petrov Petr Programcı 80000
4 Rabinovich Moisha Müdür 200000

Değer listesi içeren alt sorgu

Bir zamanlar bir görevimiz olduğunu hatırlıyor musunuz - bir tablodan diğerinde karşılık gelen kayıt olmayan tüm kayıtları bulmak?

Bir de şu resim vardı:

Yanılmıyorsam, görev şu şekildedir: çalışan tablosundaki görev tablosunda görev bulunmayan tüm çalışanların bir listesini görüntüleyin .

Ayrıca iki adımda bir çözüm bulalım.

Öncelikle görev tablosunda görevleri olan tüm çalışanların id lerini döndürecek bir sorgu yazalım. Sadece iki şeyi hatırla:

  • kopyaları kaldırın - DISTINCT anahtar sözcüğünü kullanın.
  • sonuçtan NULL değerleri kaldırın.
SELECT DISTINCT employee_id FROM task 
   WHERE employee_id IS NOT NULL

Ve işte böyle bir talebin güzel bir sonucunu aldık:

Çalışan kimliği
1
2
5
4
6

Kolaylık olması için geçici olarak bir dizi olarak yazalım: 1,2,5,4,6. Şimdi, çalışan tablosuna, kimliği ilk listede yer almayan çalışanların bir listesini döndürecek ikinci bir sorgu yazalım:

SELECT * FROM employee  
WHERE id NOT IN (1,2,5,4,6)

Ve bu sorgunun sonucu:

İD isim meslek maaş yaş katılmak_tarihi
3 İvanov Sergey test cihazı 40000 otuz 2014-01-01

Ve şimdi, önceki örnekte olduğu gibi, id listesi yerine ilk isteğin gövdesini değiştirerek her iki isteği de birleştirebilirsiniz.

 SELECT * FROM employee 
   WHERE id NOT IN ( 
      	SELECT DISTINCT employee_id FROM task 
      	WHERE employee_id IS NOT NULL 
   )