Guide for Cognoms 7: Subconsultes


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

Com abordar aquest problema

Practiques subconsultes sobre una sola taula: calcules un valor de referència (una mitjana, un màxim...) amb una consulta interior i el fas servir a la condició de la consulta exterior.

La sintaxi que necessites

SELECT columnes
FROM taula
WHERE expressio > (SELECT AGREGAT(columna) FROM taula WHERE filtre_opcional);
  • El resultat de la subconsulta es pot fer servir dins d'una expressió: per exemple, columna > 3 * (SELECT ...) multiplica el valor calculat per 3.
  • La subconsulta pot tenir el seu propi WHERE. Si calcules el màxim d'un subconjunt de files, la consulta exterior també ha de quedar-se dins d'aquest subconjunt: si no, podria aparèixer una fila de fora que casualment té el mateix valor.
  • També pots fer servir funcions dins la subconsulta, com MAX(LENGTH(columna)).

Pregunta per pregunta

Pregunta 1. La subconsulta calcula la mitjana d'una columna sobre tota la taula; l'exterior compara cada cognom amb aquest valor multiplicat pel factor que diu l'enunciat. Dues columnes.

Pregunta 2. El màxim no és de tota la taula, sinó només dels cognoms que comencen per una lletra concreta (per filtrar per inicial necessites LIKE amb un comodí). Llegeix el segon punt de la sintaxi: el filtre ha de ser on calgui perquè no se t'escoli cap cognom d'una altra lletra.

Pregunta 3. El valor de referència és la longitud màxima dels noms. La consulta exterior ha de comparar la longitud de cada nom amb aquest valor i retornar dues columnes: el nom i la seva longitud (és a dir, cal calcular la funció també al SELECT).

Un exemple semblant

El cognom amb el Freq1 més alt d'entre els que acaben en 'EZ':

SELECT Name, Freq1
FROM LastNames
WHERE Name LIKE '%EZ'
  AND Freq1 = (SELECT MAX(Freq1) FROM LastNames WHERE Name LIKE '%EZ');

Quants cognoms tenen un Freq2 superior a la mitjana de Freq2:

SELECT COUNT(*)
FROM LastNames
WHERE Freq2 > (SELECT AVG(Freq2) FROM LastNames);

Paranys habituals:

  • Fer servir ORDER BY ... LIMIT 1: en aquest problema es demana resoldre-ho amb subconsultes, i a més perdries els empats.
  • Escriure WHERE Freq1 > AVG(Freq1): les funcions d'agregació no poden anar directament al WHERE.
  • LIKE amb el comodí al lloc equivocat: 'A%' vol dir "comença per A" i '%A' "acaba en A".
  • 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