Modül dersleri (4/4)
Bir diğerinin içindeki sorgu: alt sorgular
Nasıl ayıklayacağınızı, filtreleyeceğinizi, gruplandıracağınızı, birleştireceğinizi ve dönüştüreceğinizi öğrendiniz. Orada son bir temel fikir: bir sorguyu diğerinin içine koymak. Bunlar alt sorgular olarak adlandırılır ve bunlar soruları yanıtlamanıza olanak tanıyan adımlardır "kim ortalamanın üzerinde kazanıyor?" veya "hangi departmanlarda birisi var?" gibi bir projeye mi atandınız?".
Temel sözdizimi
Bir alt sorgu, tek bir sorgu yerine kullanılan, parantez içine alınmış bir SELECT'dir.
başka bir sorgudaki değer veya değerler listesi:
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);Motor önce alt sorguyu çalıştırır — SELECT AVG(salary) FROM employees
tek bir sayı döndürür — ve sonra bu sayıyı dıştaki WHERE içinde kullanır
sanki elle yazmışsınız gibi. Bu tam olarak avantajdır: bunu yaparsınız
Ortalamayı önceden bilmenize gerek yoktur; SQL bunu sizin için hesaplar.
En yaygın üç "tür"
1. Tek bir değer döndüren alt sorgu
Yukarıdaki örnek: alt sorgu bir satır, bir sütun üretir (buna denir)
skaler). Bunu =, >, < vb. ile kullanırsınız.
-- Employee with the highest salary:
SELECT first_name, last_name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);2. Bir liste döndüren alt sorgu
Alt sorgu bir sütun, birçok satır üretir. onunla kullanırsın
IN (...):
-- Departments that have at least one employee:
SELECT name
FROM departments
WHERE id IN (SELECT DISTINCT department_id
FROM employees
WHERE department_id IS NOT NULL);3. "Tablo" olarak alt sorgu (FROM)
Bir alt sorgu aynı zamanda FROM içindeki bir tablonun yerini de alabilir. Faydalıdır
toplamaları önceden hesaplayın ve ardından bunları filtreleyin veya birleştirin:
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM departments AS d
JOIN (SELECT department_id, AVG(salary) AS stipendio_medio
FROM employees
GROUP BY department_id) AS medie
ON d.id = medie.department_id
WHERE medie.stipendio_medio > 40000;Alt sorgu mu, yoksa KATILMAK mı? Hangisi ne zaman kullanılmalı
Genellikle aynı sonuç JOIN veya bir alt sorguyla elde edilebilir.
Temel kural:
- Bir tablonun satırlarını başka bir tablonun özelliğine göre filtrelemek
("bölümleri…" olan çalışanlar),
IN (subquery)oldukça okunabilir. - Sonuçta birden fazla tablodaki sütunları birleştirmek için
JOINkullanın. - bir toplam hesaplamak ve bunu eşik olarak kullanmak ("üstünde) ortalama"), skaler alt sorgu doğal seçimdir.
Uygulamada her ikisini de göreceksiniz: SQL motoru genellikle bunları aynı şekilde optimize eder yol. En iyi okunan formu seçin.
Deneyin
Şirket ortalamasının KESİNLİKLE üzerinde kazanan çalışanların adını (adını), soyadını (soyadı) ve maaşını (maaşını) bulun. Üç sütun.
İpucu göster
Yer değiştirmek ? SELECT AVG(salary) FROM Employees alt sorgusu ile — eşik olarak kullanılacak tek bir sayı döndürür.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
Maaşı kesinlikle 50000'in üzerinde olan en az bir çalışanı olan departmanların adını (departments.name) listeleyin. IN ile bir alt sorgu kullanın. Alfabetik olarak sipariş edin.
İpucu göster
İç alt sorgu, maaşı > 50000 olan çalışanları olan departmanların kimliklerini döndürür. Daha sonra dış sorguda WHERE id IN (...).
3 denemeden sonra çözüm mevcut