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.
-- 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:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';Normas:
- los dos
SELECTdeben tener el mismo número de columnas, con compatibilidad tipos; UNION(sinALL) elimina duplicados: realiza de manera efectiva unaDISTINCTsobre el resultado final;UNION ALLtambién mantiene duplicados y es mucho más rápido porque evita la clasificación/hash para la deduplicación.
-- 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").
-- 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
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.
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
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.
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