Skip to content

Cheat Sheet de SQL

Última verificación mayo 2026 — corre en tu navegador
Cheatsheet de SQL
SELECT * FROM users

Seleccionar todas las columnas de la tabla

Select
SELECT name, email FROM users

Seleccionar columnas específicas

Select
SELECT DISTINCT status FROM orders

Seleccionar solo valores únicos

Select
SELECT * FROM users WHERE age > 18

Filtrar filas con WHERE

Select
SELECT * FROM users WHERE name LIKE '%john%'

Búsqueda de patrones con LIKE

Select
SELECT * FROM users WHERE age BETWEEN 18 AND 30

Filtro de rango con BETWEEN

Select
SELECT * FROM users WHERE status IN ('active', 'pending')

Filtrar por conjunto de valores

Select
SELECT * FROM users WHERE email IS NOT NULL

Filtrar valores null/no null

Select
SELECT * FROM users ORDER BY name ASC

Ordenar resultados ascendentemente

Select
SELECT * FROM users ORDER BY created_at DESC LIMIT 10

Obtener las N primeras filas

Select
SELECT * FROM users LIMIT 10 OFFSET 20

Paginación con offset

Select
SELECT name AS full_name FROM users

Alias de columna

Select
INSERT INTO users (name, email) VALUES ('John', 'john@mail.com')

Insertar una fila

Modificar
INSERT INTO users (name, email) VALUES ('A', 'a@m.com'), ('B', 'b@m.com')

Insertar múltiples filas

Modificar
UPDATE users SET name = 'Jane' WHERE id = 1

Actualizar filas que cumplan la condición

Modificar
DELETE FROM users WHERE id = 1

Eliminar filas que cumplan la condición

Modificar
TRUNCATE TABLE users

Eliminar todas las filas (rápido, sin rollback)

Modificar
INSERT INTO target SELECT * FROM source WHERE condition

Insertar desde otra consulta

Modificar
INSERT INTO users (name, email) VALUES ('John', 'j@m.com') ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name

Upsert (insertar o actualizar)

Modificar
SELECT * FROM users INNER JOIN orders ON users.id = orders.user_id

Inner join (solo filas coincidentes)

Joins
SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id

Left join (todos de la tabla izquierda)

Joins
SELECT * FROM users RIGHT JOIN orders ON users.id = orders.user_id

Right join (todos de la tabla derecha)

Joins
SELECT * FROM users FULL OUTER JOIN orders ON users.id = orders.user_id

Full outer join (todos de ambas)

Joins
SELECT * FROM users CROSS JOIN products

Cross join (producto cartesiano)

Joins
SELECT a.name, b.name FROM employees a JOIN employees b ON a.manager_id = b.id

Self join (auto unión)

Joins
SELECT COUNT(*) FROM users

Contar todas las filas

Agregación
SELECT COUNT(DISTINCT status) FROM orders

Contar valores distintos

Agregación
SELECT SUM(amount) FROM orders

Suma de valores de la columna

Agregación
SELECT AVG(age) FROM users

Promedio de valores de la columna

Agregación
SELECT MIN(price), MAX(price) FROM products

Valores mínimo y máximo

Agregación
SELECT status, COUNT(*) FROM orders GROUP BY status

Agrupar y contar

Agregación
SELECT status, COUNT(*) FROM orders GROUP BY status HAVING COUNT(*) > 5

Filtrar grupos con HAVING

Agregación
SELECT department, STRING_AGG(name, ', ') AS members FROM employees GROUP BY department

Concatenar valores agrupados

Agregación
SELECT * FROM users WHERE id IN ( SELECT user_id FROM orders )

Subconsulta con IN

Subconsultas
SELECT * FROM users WHERE EXISTS ( SELECT 1 FROM orders WHERE orders.user_id = users.id )

Subconsulta con EXISTS

Subconsultas
SELECT *, ( SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id ) AS order_count FROM users

Subconsulta correlacionada en SELECT

Subconsultas
WITH active_users AS ( SELECT * FROM users WHERE status = 'active' ) SELECT * FROM active_users

Expresión de tabla común (CTE)

Subconsultas
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY score DESC) AS rank FROM students ) ranked WHERE rank <= 10

Subconsulta con función ventana

Subconsultas
CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE, created_at TIMESTAMP DEFAULT NOW() )

Crear tabla con restricciones

DDL
ALTER TABLE users ADD COLUMN age INT

Añadir columna a la tabla

DDL
ALTER TABLE users DROP COLUMN age

Eliminar columna de la tabla

DDL
ALTER TABLE users ALTER COLUMN name SET NOT NULL

Modificar restricción de columna

DDL
DROP TABLE IF EXISTS users

Eliminar tabla si existe

DDL
ALTER TABLE users RENAME COLUMN name TO full_name

Renombrar columna

DDL
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE

Añadir restricción de clave foránea

DDL
COALESCE(val1, val2, 'default')

Devolver primer valor no nulo

Funciones
CASE WHEN age < 18 THEN 'minor' WHEN age < 65 THEN 'adult' ELSE 'senior' END

Expresión condicional

Funciones
CAST(price AS INTEGER)

Conversión de tipo

Funciones
CONCAT(first_name, ' ', last_name)

Concatenar cadenas

Funciones
UPPER(name) / LOWER(name)

Convertir mayúsculas/minúsculas

Funciones
LENGTH(name) / TRIM(name)

Longitud de cadena / eliminar espacios

Funciones
NOW() / CURRENT_DATE / CURRENT_TIMESTAMP

Fecha/hora actual

Funciones
EXTRACT(YEAR FROM created_at)

Extraer parte de la fecha

Funciones
DATE_TRUNC('month', created_at)

Truncar fecha a precisión

Funciones
CREATE INDEX idx_users_email ON users(email)

Crear índice en columna

Índices
CREATE UNIQUE INDEX idx_users_email ON users(email)

Crear índice único

Índices
CREATE INDEX idx_name_email ON users(name, email)

Índice compuesto (multi-columna)

Índices
DROP INDEX idx_users_email

Eliminar un índice

Índices
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'x'

Analizar plan de ejecución de consulta

Índices
Mostrando 59 de 59 consultas

Cheat Sheet de SQL — SELECT, JOIN, GROUP BY y Funciones de Ventana

SQL se estandarizó en 1986 y el dialecto central —SELECT, JOIN, GROUP BY, INSERT, UPDATE, DELETE— apenas ha cambiado en cuarenta años; CTE y funciones de ventana se montan sobre la misma forma. La chuleta de abajo cubre más de 60 consultas entre selects, modificaciones, joins, agregados, subconsultas, DDL, funciones e índices. La mayoría de los líos en consultas reales no vienen de olvidar la sintaxis. Vienen de rarezas que parecen normales pero muerden. `NULL` no es igual a nada, ni a sí mismo, así que `WHERE columna = NULL` no devuelve filas y la forma correcta es `IS NULL`. Un `LEFT JOIN` seguido de un `WHERE` por la tabla derecha se transforma sin avisar en un `INNER JOIN`, porque cualquier fila con `NULL` a la derecha falla el filtro. `COUNT(*)` y `COUNT(columna)` devuelven cifras distintas en consultas idénticas. Estos son los fragmentos que se acaban consultando al depurar eso: el join que conserva el lado izquierdo, el `HAVING` que filtra grupos y no filas, la CTE que aplana una subconsulta anidada, sin releer la referencia de SQL desde la línea uno cada vez.

Trampas habituales en SQL

Hay un puñado de patrones que merecen estar en la primera pantalla de cualquier archivo SQL. `WHERE` filtra filas antes del agrupamiento; `HAVING` filtra grupos después de agregar: poner `COUNT(*) > 5` en `WHERE` lanza error. Hacer join entre tablas cambia el número de filas: un join uno-a-muchos multiplica, y un `SUM` puede contar el doble si la misma fila padre encaja con varios hijos. Los índices rinden en columnas que aparezcan en `WHERE`, `JOIN ON` u `ORDER BY` cuando la selectividad compense el coste de escritura en cada insert; `EXPLAIN ANALYZE` confirma que un índice se está usando. `LIKE 'patrón%'` puede aprovechar un índice btree cuando el comodín va al final, pero `LIKE '%patrón'` no, así que los comodines al principio fuerzan un escaneo de toda la tabla. Las transacciones y los niveles de aislamiento importan: el `READ COMMITTED` por defecto deja que dos lecturas dentro de la misma transacción vean valores distintos, bien para informes pero mal para saldos. La chuleta agrupa esto en Select, Modify, Joins, Aggregate, Subqueries, DDL, Functions e Indexes para que la sección adecuada esté a un clic.

  • Más de 60 consultas SQL prácticas
  • 8 categorías desde SELECT hasta índices
  • Cubre JOINs, CTEs y funciones ventana
  • Sentencias DDL para gestión de tablas
  • Copia al portapapeles con un clic
  • Sintaxis compatible con PostgreSQL

Gratis. Sin registro. Tus datos permanecen en tu navegador. Anuncios mediante Google AdSense (con consentimiento).

Por ·