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:
-- 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.
-- 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 (...):
-- 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:
-- 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ă
Găsiți numele (prenume), numele (numele) și salariul (salariul) angajaților care câștigă STRICT mai mult decât media companiei. Trei coloane.
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
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.
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