Mnemo

SQL — Fundamentos

Fuente: Generado con prompts/generar-mazo.md (formato con distractores autorales)

20 tarjetas20 vencidas ahora1 ya repasadas

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.