Guide for Cognoms 7: Subconsultes
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 alWHERE. LIKEamb 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.