Inicio > Cursos > SQL y Bases de Datos > JOINs — Uniendo Tablas
SQL y Bases de DatosConsultas AvanzadasLección 6 de 20

JOINs — Uniendo Tablas

Los JOINs son la característica más poderosa de SQL: combinan datos de múltiples tablas en una sola consulta. INNER JOIN devuelve solo las filas que tienen coincidencia en ambas tablas. LEFT JOIN devuelve todas las filas de la tabla izquierda aunque no tengan coincidencia en la derecha (las columnas sin coincidencia quedan como NULL).

RIGHT JOIN es el espejo de LEFT JOIN. FULL OUTER JOIN devuelve todas las filas de ambas tablas. CROSS JOIN genera el producto cartesiano (cada fila de A con cada fila de B). En la práctica, INNER JOIN y LEFT JOIN cubren el 95% de los casos reales. Entender JOINs es lo que separa a alguien que "sabe SQL" de alguien que lo domina.

-- Tablas de ejemplo
-- users: id, nombre, email
-- orders: id, user_id, total, fecha
-- order_items: id, order_id, product_id, cantidad, precio
-- products: id, nombre, precio, categoria

-- INNER JOIN: solo filas que coinciden en AMBAS tablas
-- Usuarios que han hecho al menos un pedido
SELECT
  u.nombre,
  u.email,
  o.id AS pedido_id,
  o.total,
  o.fecha
FROM users u
INNER JOIN orders o ON o.user_id = u.id
ORDER BY o.fecha DESC;

-- LEFT JOIN: TODOS los users, pedidos si existen (NULL si no)
-- Usuarios que NUNCA han hecho un pedido
SELECT
  u.nombre,
  u.email,
  COUNT(o.id) AS total_pedidos
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.nombre, u.email
HAVING COUNT(o.id) = 0;

-- JOIN múltiple: 3 tablas
SELECT
  u.nombre AS cliente,
  o.id AS pedido,
  p.nombre AS producto,
  oi.cantidad,
  oi.precio * oi.cantidad AS subtotal
FROM users u
INNER JOIN orders o ON o.user_id = u.id
INNER JOIN order_items oi ON oi.order_id = o.id
INNER JOIN products p ON p.id = oi.product_id
WHERE o.fecha >= '2024-01-01'
ORDER BY o.id, p.nombre;

-- FULL OUTER JOIN: todos de ambos lados (con o sin coincidencia)
SELECT
  u.nombre AS usuario,
  o.id AS pedido
FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;

-- RIGHT JOIN: todos los pedidos aunque el usuario fue borrado
SELECT o.id, o.total, u.nombre
FROM users u
RIGHT JOIN orders o ON o.user_id = u.id;
ConsejoUsa aliases de tabla (u, o, p) para hacer los JOINs más legibles. Cuando una columna existe en varias tablas debes calificarla con el alias (u.id, o.id) o PostgreSQL lanzará un error de ambigüedad.
← INSERT, UPDATE y DELETEGROUP BY y Funciones Agregadas →

Practica esta lección

Resuelve los ejercicios del curso de SQL y Bases de Datos en la app, gratis y con corrección automática.

Empezar a practicar