Chuleta de joins de SQL
Una referencia de joins de SQL con búsqueda e imprimible: inner, left, right, full, anti y semi joins, self joins, ON vs WHERE y LATERAL. Gratis.
Basic join types
9SELECT * FROM a INNER JOIN b ON a.id = b.a_id;
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id;
SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id;
SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;
JOIN = INNER JOIN
LEFT OUTER JOIN = LEFT JOIN
LEFT JOIN ... UNION ... RIGHT JOIN ...
ON a.id = b.a_id AND a.type = b.type
ON a.qty BETWEEN p.min_qty AND p.max_qty
Anti-joins (no match)
8LEFT JOIN b ON a.id = b.a_id WHERE b.a_id IS NULL
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
WHERE a.id NOT IN (SELECT a_id FROM b)
WHERE a.id NOT IN (SELECT a_id FROM b WHERE a_id IS NOT NULL)
RIGHT JOIN a ... WHERE a.id IS NULL
SELECT id FROM a EXCEPT SELECT a_id FROM b;
users without orders = LEFT JOIN + IS NULL
Prefer NOT EXISTS over NOT IN
Semi-joins (has a match)
8WHERE EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
WHERE a.id IN (SELECT a_id FROM b)
JOIN b ... GROUP BY a.id
SELECT DISTINCT a.* FROM a JOIN b ON ...
EXISTS stops at the first match
EXISTS (SELECT 1 ...) vs (SELECT * ...)
IN: uncorrelated / EXISTS: correlated
users WITH orders = EXISTS subquery
Self joins
8FROM emp e JOIN emp m ON e.manager_id = m.id
FROM emp e LEFT JOIN emp m ON e.manager_id = m.id
SELECT e.name, m.name AS manager FROM ...
ON a.id < b.id
ON a.id <> b.id
ON b.day = a.day + INTERVAL 1 DAY
ON a.city = b.city AND a.id <> b.id
WITH RECURSIVE tree AS (... UNION ALL ...)
Cross & multi-table joins
8SELECT * FROM sizes CROSS JOIN colors;
FROM sizes, colors
FROM users u JOIN orders o ON ... JOIN items i ON ...
JOIN dates d CROSS JOIN users u LEFT JOIN ...
u LEFT JOIN o ON ... LEFT JOIN i ON i.o_id = o.id
u LEFT JOIN o ... INNER JOIN i ON i.o_id = o.id
FROM a JOIN (b LEFT JOIN c ON ...) ON ...
Written order is logical, not execution order
ON vs WHERE (the gotcha)
8LEFT JOIN b ON a.id = b.a_id AND b.status = 1
LEFT JOIN b ON a.id = b.a_id WHERE b.status = 1
WHERE b.a_id IS NULL OR b.status = 1
LEFT JOIN b ON ... AND a.type = 'x'
WHERE a.type = 'x'
INNER JOIN: ON and WHERE are equivalent
COALESCE(b.total, 0)
COUNT(b.id) vs COUNT(*)
USING, NATURAL & set ops
9JOIN b USING (user_id)
USING outputs ONE shared column
NATURAL JOIN b
Avoid NATURAL JOIN in production
SELECT ... UNION SELECT ...
UNION ALL
JOIN adds columns, UNION adds rows
INTERSECT
UNION needs same column count and types
LATERAL & performance
9CROSS JOIN LATERAL (SELECT ... WHERE b.a_id = a.id LIMIT 3) t
LEFT JOIN LATERAL (...) t ON TRUE
CROSS APPLY / OUTER APPLY
LATERAL sees columns of preceding tables
CREATE INDEX idx ON orders (user_id);
EXPLAIN SELECT ...;
Filter early: join the smallest set first
ON DATE(a.created_at) = b.day
Join on same-type, same-collation columns
Ninguna entrada coincide con “:q”.
Acerca de Chuleta de joins de SQL
Esta chuleta de joins de SQL hace una cosa a fondo: explica todas las formas de combinar tablas. Ocho secciones cubren los tipos de join básicos, los anti-joins para filas sin coincidencia, los semi-joins para filas que sí tienen coincidencia, los self joins, los joins cruzados y multitabla, la clásica trampa de ON frente a WHERE, USING, NATURAL y las operaciones de conjuntos, y los joins LATERAL con notas de rendimiento.
Los joins son donde los resultados de SQL fallan silenciosamente: un LEFT JOIN filtrado en la cláusula WHERE se convierte en silencio en un INNER JOIN, y NOT IN con un NULL no devuelve nada. Esas trampas tienen sus propias filas aquí, junto al patrón correcto que usar en su lugar.
Como cada chuleta de este grupo, es gratuita y se ejecuta en el cliente: filtra filas en vivo con el cuadro de búsqueda, salta entre secciones con el índice fijo, copia cualquier sentencia con un clic e imprime la página como referencia en tu escritorio.
Cómo usar Chuleta de joins de SQL
- Abre la hoja y revisa las secciones, desde Tipos de join básicos hasta LATERAL y rendimiento.
- Busca una palabra clave como LEFT JOIN, EXISTS o NOT IN para filtrar todas las filas en vivo.
- Lee la sección ON vs WHERE antes de depurar un LEFT JOIN que devuelve muy pocas filas.
- Haz clic en una sentencia o en su icono de copiar para copiar el SQL a tu portapapeles.
- Usa Imprimir para obtener una copia en papel de la referencia completa de joins.