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ı:
![](https://cdn.codegym.cc/images/article/a0eff64c-0bb4-4480-833e-c1305cd03a5e/512.jpeg)
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
)