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

Keep calm and query on 💻