SQL — Fundamentos
Fuente: Generado con prompts/generar-mazo.md (formato con distractores autorales)
sqlbases-de-datosaprendizaje
Tarjetas
¿Cómo filtras filas en un SELECT?
Con la cláusula `WHERE`: `SELECT * FROM productos WHERE precio < 100;` — el filtro corre ANTES de agrupar.
¿Para qué sirve DISTINCT?
Elimina filas duplicadas del resultado: `SELECT DISTINCT categoria FROM productos;` devuelve cada categoría una vez.
¿Qué hace INNER JOIN?
Combina filas de dos tablas donde la condición matchea en ambas: `INNER JOIN pedidos ON pedidos.cliente_id = clientes.id` — solo clientes CON pedidos.
¿Cuándo necesitás LEFT JOIN en vez de INNER?
Cuando querés TODAS las filas de la izquierda aunque no tengan match: clientes SIN pedidos incluidos, con NULL en las columnas de la derecha.
¿Cómo tratás los NULL en los filtros?
Con `IS NULL` / `IS NOT NULL` — nunca con `= NULL`, que no matchea nada.
¿WHERE vs HAVING — cuál filtra qué?
WHERE filtra filas ANTES de agrupar; HAVING filtra GRUPOS después del GROUP BY, y puede usar agregados.
¿Qué devuelve una subquery escalar?
Una subquery entre paréntesis que devuelve UN solo valor (una fila, una columna) y se usa donde iría un valor: `WHERE precio > (SELECT AVG(precio) FROM productos)`.
¿Cómo GROUP BY con agregaciones?
`SELECT categoria, COUNT(*) FROM productos GROUP BY categoria` — agrupa filas iguales y calcula una agregación por grupo (COUNT, SUM, AVG, MIN, MAX).
¿Qué diferencia hay entre LIKE y = ?
`LIKE` compara patrones: `LIKE 'A%'` (empieza con A), `%` = cualquier cantidad de caracteres, `_` = uno exacto. `=` es igualdad exacta.
¿Qué hace EXISTS y por qué preferirlo a IN a veces?
`WHERE EXISTS (SELECT 1 FROM pedidos WHERE pedidos.cliente_id = clientes.id)` — verdadero si la subquery tiene al menos una fila. Corta en el primer match.
¿UNION o UNION ALL — cuándo cada uno?
UNION concatena resultados y ELIMINA duplicados; UNION ALL concatena sin deduplicar (más rápido).
¿Cómo hacen ranking las window functions?
`ROW_NUMBER() OVER (ORDER BY puntos DESC)` numera filas SIN colapsarlas — cada fila queda, con su cálculo "de ventana" al lado.
¿Para qué sirve CASE WHEN?
Lógica condicional dentro del SELECT: `CASE WHEN precio > 100 THEN 'caro' WHEN precio > 50 THEN 'medio' ELSE 'barato' END` — transforma valores fila por fila.
¿Cómo protegés una FK al borrar el padre?
Declarando el comportamiento en la FK: `ON DELETE CASCADE` (borra hijos), `ON DELETE RESTRICT` (lo impide) o `SET NULL` (huérfanos con FK nullable).
¿Qué garantiza una PRIMARY KEY?
Unicidad + no NULL de esa columna (o combinación) para TODA la tabla — la identidad de la fila.
¿Qué es un CTE (WITH)?
Un resultado nombrado y temporal para esa query: `WITH top AS (SELECT ...) SELECT * FROM top WHERE ...` — legibilidad y reutilización dentro de la misma sentencia.
¿Diferencia entre DELETE y TRUNCATE?
DELETE borra filas (con o sin WHERE) y registra cada borrado; TRUNCATE vacía la tabla entera de golpe, sin log por fila.
¿Cómo insertás sin duplicar si ya existe?
Con upsert: en Postgres `INSERT ... ON CONFLICT (email) DO UPDATE SET ...` — inserta, y si la unique constraint choca, actualiza.
¿Qué hace un índice y cuándo NO conviene?
Estructura auxiliar ordenada que acelera búsquedas por esa columna a costa de espacio y escrituras más lentas.
¿Qué hace ORDER BY y qué pasa con empates?
Ordena el resultado por una o más columnas: `ORDER BY precio DESC, nombre ASC`. Con empates en la primera, decide la segunda.