JOINS Avanzados y UNIONS

🔄 JOIN — Sintaxis Implícita

Sintaxis explícita vs implícita

SELECT *
FROM orders o
JOIN customers c
   ON o.customer_id = c.customer_id;

📤 Resultado:

order_id customer_id order_date first_name
1 3 2019-01-10 Ana
2 5 2019-02-18 Luis
3 2 2019-03-22 María

🕹️ Sintaxis implícita

SELECT *
FROM orders o, customers c
WHERE o.customer_id = c.customer_id;

📤 Resultado idéntico:

order_id customer_id first_name
1 3 Ana
2 5 Luis
3 2 María

⚠️ Cuidado: Si olvidas el WHERE, harás un join de todo con todo (producto cartesiano).

SELECT *
FROM orders o, customers c;

📤 Resultado:

order_id customer_id first_name
1 3 Ana
1 5 Luis
1 2 María

Ejercicio Joins 7

🌗 OUTER JOINS

INNER vs OUTER

SELECT  
   c.customer_id,
   c.first_name,
   o.order_id
FROM customers c
JOIN orders o
  ON c.customer_id = o.customer_id
ORDER BY c.customer_id;

📤 INNER JOIN — solo coincidencias:

customer_id first_name order_id
1 Ana 5
2 Luis 2
3 María 1

🫱 LEFT JOIN

💡 Incluye todos los registros de la tabla izquierda (customers).

SELECT  
   c.customer_id,
   c.first_name,
   o.order_id
FROM customers c
LEFT JOIN orders o
  ON c.customer_id = o.customer_id
ORDER BY c.customer_id;

🫱 LEFT JOIN

💡 Incluye todos los registros de la tabla izquierda (customers).

📤 Resultado:

customer_id first_name order_id
1 Ana 5
2 Luis 2
4 Pablo NULL

🫲 RIGHT JOIN

💡 Incluye todos los registros de la tabla derecha (orders). 👉 En MySQL no existen FULL JOIN, solo LEFT y RIGHT.

SELECT  
   c.customer_id,
   c.first_name,
   o.order_id
FROM customers c
RIGHT JOIN orders o
  ON c.customer_id = o.customer_id
ORDER BY c.customer_id;

🫲 RIGHT JOIN

💡 Incluye todos los registros de la tabla derecha (orders).

📤 Resultado:

customer_id first_name order_id
1 Ana 5
2 Luis 2
NULL NULL 8

👉 En MySQL no existen FULL JOIN, solo LEFT y RIGHT.

Ejercicio Joins 8

🔗 OUTER JOIN con múltiples tablas

SELECT  
   c.customer_id,
   c.first_name,
   o.order_id
FROM customers c
LEFT JOIN orders o
  ON c.customer_id = o.customer_id
LEFT JOIN shippers sh
  ON o.shipper_id = sh.shipper_id
ORDER BY c.customer_id;

📤 Resultado:

customer_id first_name order_id shipper
1 Ana 5 DHL
2 Luis 2 FedEx
4 Pablo NULL NULL

🧩 USING Clause

💡 Se usa solo si las columnas tienen el mismo nombre en ambas tablas.

SELECT 
  o.order_id,
  c.first_name
FROM orders o
JOIN customers c
ON  o.customer_id= c.customer_id

🧩 USING Clause

💡 Se usa solo si las columnas tienen el mismo nombre en ambas tablas.

SELECT 
  o.order_id,
  c.first_name
FROM orders o
JOIN customers c
USING (customer_id);

🧩 USING Clause

💡 Se usa solo si las columnas tienen el mismo nombre en ambas tablas.

SELECT 
  o.order_id,
  c.first_name
FROM orders o
JOIN customers c
USING (customer_id);

📤 Resultado:

order_id first_name
1 Ana
2 Luis
3 María

Ejercicio Joins 9

🧮 USING con múltiples columnas

SELECT *
FROM order_items oi
JOIN order_item_notes oin
  USING (order_id, product_id);

📤 Resultado:

order_id product_id quantity note
6 2 4 Good quality
6 3 5 Discount applied
7 1 2 Fragile

Ejercicio Joins 10

🤖 NATURAL JOIN

💡 El motor adivina automáticamente las columnas en común para unir.

SELECT 
  o.order_id,
  c.first_name
FROM orders o
NATURAL JOIN customers c;

📤 Resultado:

order_id first_name
1 Ana
2 Luis
3 María

Pruébalo en Ejercicio Joins 10

🔁 CROSS JOIN

💡 Combina todas las filas de una tabla con todas las de otra (producto cartesiano).

SELECT *
FROM customers c
CROSS JOIN products p;

📤 Resultado (fragmento):

customer product
Ana Monitor
Ana Mouse
Ana Keyboard
Luis Monitor
Luis Mouse

Ejercicio Joins 11

CROSS JOIN con alias

SELECT 
  sh.name AS shipper,
  p.name AS product
FROM shippers sh, products p
ORDER BY sh.name;

📤 Resultado:

shipper product
DHL Monitor
DHL Mouse
FedEx Monitor

🧩 UNION

💡 Combina resultados de varias consultas en una sola.

🧩 UNION

SELECT first_name
FROM customers

📤 Resultado:

first_name
Ana
Luis
María

🧩 UNION

SELECT name
FROM shippers;

📤 Resultado:

name.
DHL
FedEx

🧩 UNION

SELECT first_name
FROM customers
UNION
SELECT name
FROM shippers;

📤 Resultado:

first_name
Ana
Luis
María
DHL
FedEx

UNION dentro de la misma tabla

SELECT first_name
FROM customers
UNION
SELECT last_name
FROM customers;

📤 Resultado:

nombre
Ana
López
Luis

UNION dentro de la misma tabla

SELECT first_name, last_name
FROM customers
UNION
SELECT last_name, 'apellido' AS status
FROM customers;

📤 Resultado:

first_name last_name
Ana López
Luis Rojas
Rojas apellido

⚠️ Reglas de UNION:

  • Cada consulta debe tener el mismo número de columnas.

  • Los tipos de datos deben ser compatibles.

  • El nombre final de cada columna viene del primer SELECT.

Ejercicio Joins 12

🧾 Ejemplo aplicado — UNION condicional

SELECT 
   order_id, 
   order_date,
   'Active' AS status
FROM orders
WHERE order_date >= '2019-01-01'
UNION
SELECT 
   order_id, 
   order_date,
   'Archived' AS status
FROM orders
WHERE order_date < '2019-01-01';

🧾 Ejemplo aplicado — UNION condicional

📤 Resultado:

order_id order_date status
1 2019-01-10 Active
2 2019-02-18 Active
5 2018-11-25 Archived

🧭 Resumen final

Tipo Descripción
Implicit JOIN Usa coma y WHERE
OUTER JOIN Incluye filas sin coincidencias
USING Une columnas con nombres iguales
NATURAL JOIN Detecta columnas comunes automáticamente
CROSS JOIN Combina todas las filas
UNION Une resultados de varias consultas