Salt la conținutul principal
Modulul 4 · Lecția 4 din 416/57 în curs~12 min
Lecții din modul (4/4)

O interogare în alta: subinterogări

Ați învățat cum să extrageți, să filtrați, să grupați, să vă alăturați și să transformați. Acolo este o ultimă idee fundamentală: introducerea unei interogări în alta. Acestea sunt numite subinterogări și sunt pasul care vă permite să răspundeți la întrebări precum "cine câștigă peste medie?" sau "care departamente au pe cineva atribuit unui proiect?".

Sintaxa de bază

O subinterogare este o SELECT înfășurată în paranteze, folosită în locul unei singure valoare sau o listă de valori într-o altă interogare:

SQL
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM   employees
WHERE  salary > (SELECT AVG(salary) FROM employees);

Motorul rulează mai întâi subinterogarea — SELECT AVG(salary) FROM employees returnează un singur număr — și apoi folosește acel număr în WHERE exterior de parcă l-ai fi scris de mână. Acesta este tocmai avantajul: o faci nu trebuie să știți media în avans, SQL o calculează pentru dvs.

Cele mai comune trei „tipuri”

1. Subinterogare care returnează o singură valoare

Exemplul de mai sus: subinterogarea produce un rând, o coloană (numită scalar). Îl folosești cu =, >, < și așa mai departe.

SQL
-- Employee with the highest salary:
SELECT first_name, last_name
FROM   employees
WHERE  salary = (SELECT MAX(salary) FROM employees);

2. Subinterogare care returnează o listă

Subinterogarea produce o coloană, mai multe rânduri. Îl folosești cu 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. Subinterogare ca „tabel” (FROM)

O subinterogare poate lua locul unui tabel în FROM. Este util să precalculați agregatele și apoi filtrați sau uniți-le:

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;

Subinterogare sau JOIN? Când să folosești care

Adesea, același rezultat poate fi obținut cu un JOIN sau cu o subinterogare. Regula generală:

  • Pentru a filtra rândurile unui tabel pe baza unei proprietăți a altuia ("angajați ale căror departamente sunt..."), IN (subquery) este foarte ușor de citit.
  • Pentru a combina coloanele din mai multe tabele în rezultat, utilizați JOIN.
  • Pentru a calcula un agregat și a-l folosi ca prag ("deasupra medie"), subinterogarea scalară este alegerea naturală.

În practică, le vei vedea pe ambele: motorul SQL le optimizează adesea la fel cale. Alegeți formularul care citește cel mai bine.

Încearcă

Exercițiu#sql.m4.l4.e1
Încercări: 0Se încarcă…

Găsiți numele (prenume), numele (numele) și salariul (salariul) angajaților care câștigă STRICT mai mult decât media companiei. Trei coloane.

Se încarcă editorul...
Afișează indiciu

Înlocuiește? cu subinterogarea SELECT AVG(salary) FROM angajații — returnează un singur număr de utilizat ca prag.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m4.l4.e2
Încercări: 0Se încarcă…

Listați numele (departments.name) departamentelor care au cel puțin un angajat cu salariu strict mai mare de 50000. Folosiți o subinterogare cu IN. Ordonați alfabetic.

Se încarcă editorul...
Afișează indiciu

Subinterogarea interogă returnează id-urile departamentelor care au angajați cu salariu > 50000. Apoi WHERE id IN (...) pe interogarea exterioară.

Soluție disponibilă după 3 încercări