Los OUTER JOIN permiten obtener no solo las coincidencias entre dos tablas, sino también las filas que no tienen correspondencia en una de las dos tablas. Existen dos tipos principales:
NULL
).NULL
).NULL
cuando no hay coincidencias.Usaremos las mismas tablas de ejemplo:
clientes
id_cliente | nombre |
---|---|
1 | Juan |
2 | María |
3 | Pedro |
pedidos
id_pedido | id_cliente | producto |
---|---|---|
101 | 1 | Laptop |
102 | 2 | Teléfono |
103 | 4 | Tablet |
Muestra todos los clientes, aunque no tengan pedidos.
SELECT clientes.id_cliente, clientes.nombre, pedidos.id_pedido, pedidos.producto
FROM clientes
LEFT JOIN pedidos ON clientes.id_cliente = pedidos.id_cliente;
Resultado:
id_cliente | nombre | id_pedido | producto |
---|---|---|---|
1 | Juan | 101 | Laptop |
2 | María | 102 | Teléfono |
3 | Pedro | NULL | NULL |
✅ Pedro aparece aunque no tenga pedidos, y los valores de pedidos
son NULL
para él.
Muestra todos los pedidos, aunque no haya clientes registrados para ellos.
SELECT clientes.id_cliente, clientes.nombre, pedidos.id_pedido, pedidos.producto
FROM clientes
RIGHT JOIN pedidos ON clientes.id_cliente = pedidos.id_cliente;
Resultado:
id_cliente | nombre | id_pedido | producto |
---|---|---|---|
1 | Juan | 101 | Laptop |
2 | María | 102 | Teléfono |
NULL | NULL | 103 | Tablet |
✅ El pedido 103 aparece aunque no haya un cliente registrado con id_cliente = 4
en la tabla clientes
.
Muestra todos los clientes y todos los pedidos, incluso si no tienen relación.
SELECT clientes.id_cliente, clientes.nombre, pedidos.id_pedido, pedidos.producto
FROM clientes
FULL JOIN pedidos ON clientes.id_cliente = pedidos.id_cliente;
Resultado:
id_cliente | nombre | id_pedido | producto |
---|---|---|---|
1 | Juan | 101 | Laptop |
2 | María | 102 | Teléfono |
3 | Pedro | NULL | NULL |
NULL | NULL | 103 | Tablet |
✅ Aparecen Pedro (sin pedidos) y el pedido 103 (sin cliente registrado).
Tipo de JOIN | Filas devueltas |
---|---|
INNER JOIN | Solo las filas con coincidencias en ambas tablas. |
LEFT JOIN | Todas las filas de la primera tabla y las coincidencias de la segunda (NULL si no hay coincidencia). |
RIGHT JOIN | Todas las filas de la segunda tabla y las coincidencias de la primera (NULL si no hay coincidencia). |
FULL JOIN | Todas las filas de ambas tablas (NULL donde no haya coincidencia). |
🔹 ¿Cuál necesitas usar?
INNER JOIN
.LEFT JOIN
o RIGHT JOIN
.FULL JOIN
./* cuenta TODOS los clientes que no tienen ninguna campaña hecha: sin utilizar JOIN y utilizando JOIN */
SET @con:= (SELECT count(distinct c.id) FROM clientes c,
campanas ca WHERE c.id = ca.fk_cliente);
SET @tot:= (SELECT COUNT(id) FROM clientes);
SELECT @tot-@con;
SELECT COUNT(id) FROM clientes
WHERE id NOT IN (SELECT distinct c.id
FROM clientes c, campanas ca
WHERE c.id = ca.fk_cliente);
SELECT COUNT(*)
FROM clientes CL LEFT JOIN campanas CA
ON CL.id = CA.fk_cliente
WHERE CA.fk_cliente IS NULL;
/* CONTAR LOS ANUNCIOS QUE NO ESTÁN FACTURADOS SIN UTILIZAR JOIN Y UTILIZANDO JOIN */
SET @TOT:=(SELECT COUNT(*) FROM anuncios);
SET @ANU_F:=(SELECT COUNT(DISTINCT FK_ANUNCIO)
FROM lineas_fac);
SELECT @TOT-@ANU_F RESULTADO
UNION ALL
SELECT COUNT(ID) FROM anuncios WHERE
ID NOT IN (SELECT DISTINCT FK_ANUNCIO
FROM lineas_fac)
UNION ALL
SELECT COUNT(AN.ID) FROM anuncios AN
LEFT JOIN lineas_fac LF
ON AN.id = LF.fk_anuncio
WHERE LF.ID IS NULL;
/* SACA UN LISTADO CON LOS 10 PRIMEROS portales ,ORDENADOS POR ORDEN ALFABÉTICO, QUE MÁS anuncios TIENEN FACTURADOS Y DONDE LOS clientes NO SEAN DE CATALUÑA NI CANARIAS */
CREATE VIEW clientes_2 as
SELECT cl.* FROM clientes cl JOIN localidades lo
ON cl.fk_localidad = lo.id JOIN municipios mu
ON lo.fk_municipio = mu.id JOIN provincias pr
ON mu.fk_provincia = pr.id JOIN regiones re
ON pr.fk_region = re.id
WHERE re.nombre NOT LIKE "%cataluña%" AND
re.nombre NOT LIKE "%canarias%"
SELECT p.dominio, count(a.id) FROM portales p join anuncios a
ON p.id = a.fk_portal JOIN lineas_fac l
ON a.id = l.fk_anuncio JOIN facturas f
ON l.fk_factura = f.id join clientes_2 c
ON f.fk_cliente = c.id
GROUP BY a.fk_portal
ORDER BY 1 LIMIT 10