Guide for Cavallers i Dracs 8: JOINs i subconsultes
Com abordar aquest problema
Combines tres eines: un JOIN entre dracs i cavallers, una agrupació amb GROUP BY / HAVING sobre el resultat del JOIN, i una subconsulta que calcula un valor (com una mitjana) per comparar-hi cada fila.
La sintaxi que necessites
JOIN + agrupació:
SELECT a.grup, SUM(b.valor)
FROM taula_a a
INNER JOIN taula_b b ON b.columna_que_apunta = a.clau
GROUP BY a.grup
HAVING SUM(b.valor) > limit;
Subconsulta escalar (retorna un sol valor):
SELECT columna
FROM taula
WHERE valor > (SELECT AVG(valor) FROM taula);
WHEREfiltra files abans d'agrupar;HAVINGfiltra grups després d'agrupar i pot fer servir funcions d'agregació.- La subconsulta entre parèntesis s'executa i el seu resultat (un número) es fa servir com si l'haguessis escrit a mà.
Pregunta per pregunta
Pregunta 1. Cal unir les dues taules per la relació drac-cavaller, agrupar per cavaller i sumar una columna dels dracs. La condició "suma superior a 2000" és sobre un agregat: pensa si va al WHERE o al HAVING. Dues columnes.
Pregunta 2. Un JOIN sense agrupar, amb dues condicions: una sobre una columna del cavaller i una altra sobre una columna del drac. Mira bé a quina taula és cada columna.
Pregunta 3. Aquí no cal cap JOIN: és una subconsulta que calcula la mitjana d'una columna de tota la taula, i la consulta exterior compara cada drac amb aquest valor. Una sola columna.
Un exemple semblant
Nombre de dracs morts per cavallers de cada títol, només per als títols amb 3 dracs o més:
SELECT k.Title, COUNT(*)
FROM Knights k
INNER JOIN Dragons d ON d.KilledBy = k.Nickname
GROUP BY k.Title
HAVING COUNT(*) >= 3;
El drac (o dracs) amb el màxim de víctimes conegudes:
SELECT Name, KnownVictims
FROM Dragons
WHERE KnownVictims = (SELECT MAX(KnownVictims) FROM Dragons);
Paranys habituals:
- Posar una funció d'agregació al
WHERE(WHERE SUM(...) > ...oWHERE valor > AVG(valor)): és un error. UsaHAVINGo una subconsulta. - Agrupar per una columna i mostrar-ne una altra que no és al
GROUP BYni dins d'una funció d'agregació. - Escriure el valor de la mitjana a mà (calculat abans): si les dades canvien, la consulta deixa de ser correcta. Deixa que la subconsulta el calculi.
- 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.