Saltar al contenido principal
eLearner.app
Módulo 5 · Lección 4 de 420/57 en el curso~12 min
Lecciones del módulo (4/4)

UNION, INTERSECT, EXCEPT (y CROSS JOIN)

Hasta ahora ha combinado datos horizontalmente: JOIN adjunta columnas de filas relacionadas. SQL también ofrece otra familia de operadores que combina datos verticalmente, tratando los resultados de dos SELECT como conjuntos: CÓDIGOPH2, CÓDIGOPH3, CÓDIGOPH4. También revisamos CROSS JOIN, el producto cartesiano.

UNIÓN CRUZADA: cada fila con cada fila

CROSS JOIN no tiene ON: produce todas las combinaciones posibles de filas entre dos tablas (producto cartesiano). Si A tiene n filas y B tiene m filas, el resultado tiene n × m.

SQL
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM   customers c
CROSS JOIN products p;

12 clientes × 16 productos = 192 filas. Rara vez se utiliza en datos reales (es ¡caro!), pero es útil para:

  • generar combinaciones "todos contra todos" (por ejemplo, una matriz de compatibilidad);
  • emparejar una tabla con una pequeña tabla de constantes/parámetros.

##UNIÓN y UNIÓN TODOS

UNION agrega los resultados de dos SELECT con el mismo número y tipo de columnas:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

Normas:

  • los dos SELECT deben tener el mismo número de columnas, con compatibilidad tipos;
  • UNION (sin ALL) elimina duplicados: realiza de manera efectiva una DISTINCT sobre el resultado final;
  • UNION ALL también mantiene duplicados y es mucho más rápido porque evita la clasificación/hash para la deduplicación.
SQL
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM   customers c JOIN orders  o ON o.customer_id = c.id
UNION
SELECT c.email
FROM   customers c JOIN reviews r ON r.customer_id = c.id;

INTERSECTAR y EXCEPTAR

INTERSECT mantiene solo las filas presentes en ambos resultados; CÓDIGOPH1 mantiene las filas del primero que no están en el segundo (el conjunto "diferencia").

SQL
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

INTERSECT y EXCEPT también eliminan duplicados de forma predeterminada; el Las variantes INTERSECT ALL/EXCEPT ALL no lo hacen.

Pruébalo tú mismo

Ejercicio#sql.m5.l4.e1
Intentos: 0Cargando...

Trova tutte le email dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). Una columna: correo electrónico. Ordina por correo electrónico.

Cargando editor...
Mostrar pista

UNIÓN entre dos SELECT que devuelven la misma columna de correo electrónico. El ORDER BY va al final, sobre el resultado final.

Solución disponible después de 3 intentos

Ejercicio de revisión

Ejercicio#sql.m5.l4.e2
Intentos: 0Cargando...

Trova le email dei clienti che hanno ordinato ma non hanno mai recensito nulla. Estados Unidos EXCEPTO. Una columna: correo electrónico. Ordina por correo electrónico.

Cargando editor...
Mostrar pista

EXCEPTO mantiene solo las filas del SELECT izquierdo que no están presentes en el derecho.

Solución disponible después de 3 intentos