Guide for Empleats 7: Subconsultes


Això és una guia per ajudar-te a començar amb aquest problema — no és la solució.

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 un AVG, un MAX o un MIN). Si en pot retornar diversos, cal IN.
  • La subconsulta amb IN nomé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ó al WHERE; cal la subconsulta.
  • Fer servir ORDER BY ... LIMIT 1 per trobar "el més gran": si hi ha un empat, en perdries algun. La subconsulta amb MIN/MAX els 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.

Tornar al problema