Guide for Empleats 7: Subconsultes
Com abordar aquest problema
Practiques les subconsultes: una consulta SELECT dins d'una altra. La subconsulta calcula un valor (o una llista de valors) a partir de la taula, i la consulta exterior compara cada fila amb aquest resultat.
La sintaxi que necessites
Subconsulta escalar (retorna un sol valor), amb =, >, <...:
SELECT columnes
FROM taula
WHERE columna > (SELECT AGREGAT(columna) FROM taula);
Subconsulta que retorna una llista de valors, amb IN:
SELECT columnes
FROM taula
WHERE columna IN (SELECT columna FROM taula WHERE ... GROUP BY ... HAVING ...);
- La subconsulta va sempre entre parèntesis.
- Amb
=o>la subconsulta ha de retornar un sol valor (per exemple unAVG, unMAXo unMIN). Si en pot retornar diversos, calIN. - La subconsulta amb
INnomés ha de tenir una columna: la que compares.
Pregunta per pregunta
Pregunta 1. La subconsulta calcula un valor sobre tots els empleats (quina funció d'agregació dona el "salari mitjà"?). La consulta exterior filtra els que el superen. Tres columnes.
Pregunta 2. Primer pensa una consulta que, tota sola, retorni els càrrecs que tenen més d'un empleat (necessitaràs agrupar i filtrar grups). Després fes-la servir com a llista amb IN. Dues columnes.
Pregunta 3. "L'empleat més gran" és el que té la data de naixement més antiga. La subconsulta calcula aquesta data (quina funció dona el valor més petit?) i l'exterior busca qui la té. Fixa't que "més gran" d'edat vol dir data més petita.
Un exemple semblant
Empleat (o empleats) amb el salari més alt:
SELECT FirstName, LastName
FROM Employees
WHERE Salary = (SELECT MAX(Salary) FROM Employees);
Empleats que tenen algun càrrec en què algú cobra més de 2000:
SELECT FirstName, JobTitle
FROM Employees
WHERE JobTitle IN (SELECT JobTitle FROM Employees WHERE Salary > 2000);
Paranys habituals:
- Escriure
WHERE Salary > AVG(Salary)directament: no es pot fer servir una funció d'agregació alWHERE; cal la subconsulta. - Fer servir
ORDER BY ... LIMIT 1per trobar "el més gran": si hi ha un empat, en perdries algun. La subconsulta ambMIN/MAXels retorna tots. - Posar més d'una columna a la subconsulta d'un
IN. - El jutge no mira els noms de les columnes ni l'ordre de les files, però sí el nombre de columnes i el seu ordre: no afegeixis columnes "de regal" (com l'identificador) si no te les demanen.