English

Chuleta de SQL

Todo SQL básico en una página: SELECT, WHERE, GROUP BY, JOIN y las trampas que caen en los exámenes. Para imprimir o bajar en PDF.

Bajar en PDF Practícalo jugando: SQL arcade →

Esqueleto

SELECT columnas
FROM tabla
WHERE condición
GROUP BY columna
HAVING condición
ORDER BY columna DESC
LIMIT 10;

Se escribe siempre en este orden.

Se ejecuta en otro orden

FROM → WHERE → GROUP BY
→ HAVING → SELECT
→ ORDER BY → LIMIT

Por eso WHERE no puede usar un COUNT ni un alias del SELECT.

Filtrar filas

edad > 40 AND ciudad = 'Puerto Sal'
oficio <> 'joyera' OR edad < 30
ciudad IN ('Puerto Sal', 'San Ciro')
edad BETWEEN 30 AND 40
nombre LIKE 'Ma%'
email IS NULL

Texto con comillas simples. % es «cualquier cosa».

Resumir

COUNT(*)                 -- filas
COUNT(email)             -- sin NULL
COUNT(DISTINCT ciudad)   -- distintos
SUM(botin)  AVG(botin)
MIN(botin)  MAX(botin)

Agrupar

SELECT ciudad, SUM(botin)
FROM robos
WHERE botin >= 500        -- filas
GROUP BY ciudad
HAVING COUNT(*) >= 2;     -- grupos

En SELECT, sólo columnas del GROUP BY y agregados.

Subconsulta

SELECT nombre, total
FROM pedidos
WHERE total >
  (SELECT AVG(total) FROM pedidos);

La de dentro se calcula primero.

Fechas

-- todo marzo, también de noche
fecha >= '2024-03-01'
AND fecha < '2024-04-01'

Mejor que BETWEEN cuando la columna guarda la hora.

Ordenar y sin repetidos

SELECT DISTINCT ciudad FROM robos;
ORDER BY botin DESC  -- mayor primero
LIMIT 3              -- va al final

Sin ORDER BY, LIMIT devuelve filas cualesquiera.

Unir tablas

LEFT JOINtodo A, con B si hayFROM a LEFT JOIN b ON a.id = b.a_id
JOINsólo lo que emparejaFROM a JOIN b ON a.id = b.a_id
LEFT JOIN + IS NULLA sin pareja en B… WHERE b.a_id IS NULL
FULL JOINtodo, con o sin parejaFROM a FULL JOIN b ON a.id = b.a_id

Las trampas de examen

  • = NULL no encuentra nada. Usa IS NULL. →
  • NOT IN con un NULL en la lista. Devuelve cero filas. Filtra los NULL de la subconsulta. →
  • BETWEEN con fechas y horas. Pierde el último día. Usa >= inicio y < día siguiente. →
  • Un WHERE sobre la tabla derecha. Convierte tu LEFT JOIN en JOIN normal. →
  • COUNT(*) con LEFT JOIN. Da 1 en vez de 0. Cuenta una columna de la otra tabla. →
  • WHERE con un agregado. Error. Va en HAVING. →

casoabiertogame.com/cero · SQL arcade y casos de detectives que se resuelven con SQL