Joins II: RIGHT, FULL, SELF y UNION
LEFT JOIN mantiene todo lo de la izquierda. Hoy completas la familia: lo que mantiene todo lo de la derecha, lo que mantiene todo de ambos lados a la vez, el JOIN de una tabla contra sí misma, y una forma completamente distinta de combinar resultados que no depende de ninguna clave en común: UNION.
RIGHT JOIN: el espejo del LEFT JOIN
RIGHT JOIN hace exactamente lo mismo que
LEFT JOIN, pero mantiene todas las filas de la
tabla de la derecha en vez de la izquierda. En la práctica,
casi nadie usa RIGHT JOIN: es más habitual reescribir la consulta cambiando el
orden de las tablas y usar LEFT JOIN, que es más fácil de leer de un vistazo.
Aun así, tienes que reconocerlo si te lo encuentras.
FULL JOIN: todo, coincida o no, de ambos lados
FULL JOIN (o FULL OUTER
JOIN) combina LEFT y RIGHT a la vez: mantiene todas las filas de ambas
tablas, rellenando con NULL donde no haya coincidencia en el otro lado.
No todos los motores soportan FULL JOIN de forma nativa (MySQL, por ejemplo, históricamente no lo hacía). Este playground sí lo soporta porque corre sobre SQLite moderno. Si algún día trabajas con un motor que no lo soporte, se simula combinando un LEFT JOIN y un RIGHT JOIN con UNION — justo lo que aprendes a continuación.
SELF JOIN: una tabla contra sí misma
A veces necesitas comparar filas de una misma tabla entre sí — por ejemplo, "clientes de la misma ciudad que Ana". Para eso usas un JOIN normal, pero con la misma tabla dos veces, cada una con su propio alias.
El a.id <> b.id es imprescindible: sin él,
cada cliente aparecería emparejado consigo mismo (misma ciudad que él mismo,
técnicamente cierto pero inútil).
UNION y UNION ALL: apilar resultados
UNION no combina tablas en horizontal como un JOIN — combina resultados en vertical, apilando las filas de dos consultas distintas, siempre que tengan el mismo número de columnas y tipos compatibles.
Apila los resultados y elimina filas duplicadas exactas entre ambas consultas.
Apila los resultados SIN eliminar duplicados. Es más rápido, porque se salta la comprobación de duplicados — úsalo siempre que sepas que no puede haberlos, o que no te importan.
Ponlo a prueba
Comprueba lo que has aprendido
1. ¿En qué se diferencia FULL JOIN de LEFT JOIN?
2. ¿Para qué sirve comparar a.id <> b.id en un SELF JOIN?
3. ¿Qué diferencia hay entre UNION y UNION ALL?