Ana içeriğe geç
Modül 4 · Ders 4 ders 4Kurstaki 16/57~12 min
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:

SQL
-- 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.

SQL
-- 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 (...):

SQL
-- 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:

SQL
-- 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 JOIN kullanı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

Egzersiz#sql.m4.l4.e1
Denemeler: 0Yükleniyor…

Ş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.

Düzenleyici yükleniyor…
İ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

Egzersiz#sql.m4.l4.e2
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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