En el artículo anterior presentamos usar los JOIN como mecanismo para obtener combinaciones de datos entre dos o más tablas.
Adelantamos que habia cuatro tipos de JOIN principales: INNER, LEFT, RIGHTy FULL, cada uno con su comportamiento diferente.
FROM Tabla_Izquierda AliasA
[TIPO] JOIN Tabla_Derecha AliasB
ON AliasA.Columna = AliasB.Columna
La sintaxis de los cuatro es muy similar. Cambia el TIPO que ponemos y, el mapeo de valores en el ON.
Para entender esto, nada mejor que ver los JOIN en acción 👇.
Interseccion INNER JOIN
Es el tipo de unión más común. Cuando decimos simplemente “haz un JOIN”, nos referimos a este.
El INNER JOIN devuelve únicamente las filas donde hay una coincidencia en ambas tablas.
Si un registro de la tabla A no tiene su pareja en la tabla B, ese registro se descarta.
Por ejemplo, sería una consulta de tipo
Dame todos los clientes que TIENEN pedidos (y los pedidos)
Veamos un ejemplo,
SELECT
C.Nombre AS Cliente,
P.Fecha,
P.Total
FROM Clientes C
INNER JOIN Pedidos P ON C.ClienteID = P.ClienteID;
- Si tienes un Cliente “Juan” que nunca ha comprado nada: No sale.
- Si tienes un Pedido huérfano (sin cliente asociado): No sale.
- Solo salen las parejas perfectas.
Aunque la palabra clave completa es INNER JOIN, T-SQL permite escribir simplemente JOIN. Es exactamente lo mismo, pero por claridad mejor poner INNER JOIN.
Prioridad izquierda LEFT JOIN
Aquí empezamos a tratar con la asimetría. El LEFT JOIN (o equivalente LEFT OUTER JOIN)
- Devuelve todas las filas de la tabla de la izquierda
- Y las filas coincidentes de la tabla de la derecha.
¿Y si no hay coincidencia? SQL Server rellena las columnas de la derecha con NULL.
Dame TODOS los Clientes, da igual si han comprado algo o no
Si han comprado, añade el pedido. Si no, muestralo igual con un hueco
Que en SQL sería algo así,
SELECT
C.Nombre AS Cliente,
P.PedidoID
FROM Clientes C -- Tabla Izquierda (Principal)
LEFT JOIN Pedidos P ON C.ClienteID = P.ClienteID; -- Tabla Derecha
Resultado:
- Ana (Tiene pedido 101) -> Sale:
Ana | 101 - Juan (No tiene pedidos) -> Sale:
Juan | NULL
Este JOIN también se puede usar para encontrar ausencias. Por ejemplo: “¿Qué clientes no han comprado nada?”
SELECT C.Nombre
FROM Clientes C
LEFT JOIN Pedidos P ON C.ClienteID = P.ClienteID
WHERE P.PedidoID IS NULL; -- Filtramos los que no cruzaron
Prioridad derecha RIGHT JOIN
El RIGHT JOIN es exactamente el opuesto al LEFT JOIN.
- Devuelve todas las filas de la tabla de la derecha,
- Y las coincidentes de la izquierda.
Si no hay coincidencia en la izquierda, rellena con NULL.
Dame TODOS los Pedidos, incluso si no tienen Cliente asignado
Que sería algo así,
SELECT
C.Nombre AS Cliente,
P.PedidoID
FROM Clientes C
RIGHT JOIN Pedidos P ON C.ClienteID = P.ClienteID;
En la práctica, el RIGHT JOIN se usa muy poco. ¿Por qué? Porque mentalmente leemos de izquierda a derecha.
Puedes convertir un RIGHT en LEFT invirtiendo el orden de las tablas en el FROM, y es más natural.
Es decir: TablaA RIGHT JOIN TablaB es igual a TablaB LEFT JOIN TablaA.
Union completa FULL JOIN
El FULL JOIN (equivalente a FULL OUTER JOIN) es la suma de los dos anteriores. Devuelve todas las filas de ambas tablas.
- Si coinciden, muestra los datos unidos.
- Si está en A pero no en B: Muestra A y rellena B con NULL.
- Si está en B pero no en A: Muestra B y rellena A con NULL.
Que sería algo como,
Dame TODO: Clientes sin pedidos, Pedidos sin clientes, y Clientes con Pedidos. Que no falte nada, dame todo.
O en SQL,
SELECT
C.Nombre AS Cliente,
P.PedidoID
FROM Clientes C
FULL JOIN Pedidos P ON C.ClienteID = P.ClienteID;
Es muy útil en tareas de limpieza de datos o reportes de conciliación para ver qué registros no cuadran entre dos sistemas.
Producto cartesiano CROSS JOIN
Existe un quinto tipo, menos común pero peligroso si se hace por accidente: el CROSS JOIN (producto cartesiano).
Este JOIN no tiene condición ON. Cruza cada fila de la tabla A con cada fila de la tabla B. Si Clientes tiene 100 filas y Productos tiene 100 filas, el resultado será de 10.000 filas ().
SELECT C.Nombre, P.NombreProducto
FROM Clientes C
CROSS JOIN Productos P;
Úsalo solo cuando quieras generar combinaciones masivas (por ejemplo, crear un calendario cruzando “Días” con “Turnos”). Si lo usas por error en tablas grandes, puedes tirar el servidor 💥.
