Cheatsheet de SQL
Consultas y operaciones esenciales para el día a día.
Filtra por comando, explicación o sección.
1. Selección básica
SELECT * FROM tabla; Todas las columnas y filas SELECT col1, col2 FROM tabla; Columnas específicas SELECT DISTINCT col FROM tabla; Valores únicos SELECT col AS alias FROM tabla; Alias de columna SELECT NOW(); Fecha/hora actual (depende del motor) 2. Filtros (WHERE)
SELECT * FROM t WHERE id = 10; Igualdad SELECT * FROM t WHERE price BETWEEN 10 AND 20; Rango SELECT * FROM t WHERE name LIKE 'Jo%'; Coincidencia por patrón SELECT * FROM t WHERE col IS NULL; Nulos SELECT * FROM t WHERE status IN ('open','closed'); Conjunto de valores 3. Orden y límite
SELECT * FROM t ORDER BY created_at DESC; Orden descendente SELECT * FROM t ORDER BY a ASC, b DESC; Orden compuesto SELECT * FROM t LIMIT 10; Limitar filas SELECT * FROM t LIMIT 10 OFFSET 20; Paginación SELECT TOP 10 * FROM t; SQL Server: primeras N filas 4. JOINs
SELECT * FROM a JOIN b ON a.id = b.a_id; INNER JOIN (intersección) SELECT * FROM a LEFT JOIN b ON a.id = b.a_id; LEFT JOIN (todo A + coincidencias) SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id; RIGHT JOIN (todo B + coincidencias) SELECT * FROM a FULL JOIN b ON a.id = b.a_id; FULL (todo A y B, Postgres) SELECT * FROM a CROSS JOIN b; Producto cartesiano 💡 Prefiere ON con claves explícitas. Evita NATURAL JOIN salvo casos muy controlados.
5. Agregaciones (GROUP BY / HAVING)
SELECT COUNT(*) FROM t; Conteo de filas SELECT status, COUNT(*) FROM t GROUP BY status; Conteo por categoría SELECT AVG(price) FROM t; Media SELECT dept, SUM(salary) s FROM emp GROUP BY dept HAVING SUM(salary) > 100000; Filtrar grupos con HAVING SELECT MIN(col), MAX(col) FROM t; Mínimo y máximo 6. Subconsultas
SELECT * FROM t WHERE id IN (SELECT id FROM u WHERE active = 1); Subconsulta en WHERE SELECT (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) AS order_count FROM users u; Escalar en SELECT INSERT INTO t (col) SELECT col FROM u; INSERT…SELECT WITH top_u AS (SELECT * FROM u LIMIT 10) SELECT * FROM top_u; CTE (WITH) WITH RECURSIVE r AS (...) SELECT * FROM r; CTE recursiva (árboles) 7. DML (INSERT/UPDATE/DELETE)
INSERT INTO t (a,b) VALUES (1,'x'); Insertar una fila INSERT INTO t (a,b) VALUES (1,'x'), (2,'y'); Insert múltiple UPDATE t SET col = 'nuevo' WHERE id = 1; Actualizar con filtro DELETE FROM t WHERE created_at < '2025-01-01'; Eliminar con filtro INSERT INTO t (a) VALUES (1) ON CONFLICT (a) DO NOTHING; Upsert (Postgres) ⚠️ Siempre usa WHERE en UPDATE/DELETE para evitar afectar todas las filas.
8. DDL (CREATE/ALTER/DROP)
CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT NOT NULL); Crear tabla (Postgres) ALTER TABLE users ADD COLUMN email TEXT; Añadir columna ALTER TABLE users ALTER COLUMN name SET NOT NULL; Modificar restricción DROP TABLE users; Borrar tabla CREATE VIEW active_users AS SELECT * FROM users WHERE active = true; Crear vista 9. Claves, restricciones e índices
PRIMARY KEY (id) Identificador único y no nulo FOREIGN KEY (user_id) REFERENCES users(id) Integridad referencial UNIQUE (email) Evita duplicados CREATE INDEX idx_t_col ON t(col); Índice simple CREATE INDEX idx_t_col_lower ON t(LOWER(col)); Índice funcional (Postgres) 💡 Indexa columnas usadas en JOIN/WHERE/ORDER BY. Demasiados índices penalizan escrituras.
10. Transacciones
BEGIN; ... COMMIT; Iniciar y confirmar BEGIN; ... ROLLBACK; Deshacer cambios SET TRANSACTION ISOLATION LEVEL READ COMMITTED; Nivel de aislamiento SAVEPOINT sp1; ROLLBACK TO sp1; Puntos de guarda SELECT txid_current(); ID de transacción (Postgres) 11. Funciones comunes
UPPER(col), LOWER(col), LENGTH(col) Cadenas CONCAT(a,' ',b) / a || ' ' || b Concat (MySQL/SQL Server vs Postgres) COALESCE(col, 'N/D') Sustituir NULL NOW(), CURRENT_DATE, DATE_TRUNC('day', ts) Fechas y truncado (Postgres) CASE WHEN cond THEN x ELSE y END Condicional en SELECT