Establecer operaciones (SQL) - Set operations (SQL)

Las operaciones de conjunto permiten combinar los resultados de varias consultas en un único conjunto de resultados . Set operadores incluyen UNION, INTERSECTy EXCEPT.

Operador UNION

En SQL, la UNIONcláusula combina los resultados de dos consultas SQL en una sola tabla de todas las filas coincidentes . Las dos consultas deben dar como resultado el mismo número de columnas y tipos de datos compatibles para poder unir. Todos los registros duplicados se eliminan automáticamente a menos que UNION ALLse utilicen.

UNIONpuede ser útil en aplicaciones de almacenamiento de datos donde las tablas no están perfectamente normalizadas . Un ejemplo simple sería una base de datos que tiene tablas sales2005y sales2006que tienen estructuras idénticas pero están separadas debido a consideraciones de rendimiento. Una UNIONconsulta podría combinar resultados de ambas tablas.

Tenga en cuenta que UNION ALLno garantiza el orden de las filas. Las filas del segundo operando pueden aparecer antes, después o mezcladas con filas del primer operando. En situaciones en las que se desea un pedido específico, se ORDER BYdebe utilizar.

Tenga en cuenta que UNION ALLpuede ser mucho más rápido que simple UNION.

Ejemplos de

Dadas estas dos tablas:

ventas2005
persona Monto
José 1000
Alex 2000
Beto 5000
ventas2006
persona Monto
José 2000
Alex 2000
Zach 35000

Ejecutando esta declaración:

SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;

produce este conjunto de resultados, aunque el orden de las filas puede variar porque no ORDER BYse proporcionó ninguna cláusula:

persona Monto
José 1000
Alex 2000
Beto 5000
José 2000
Zach 35000

Tenga en cuenta que hay dos filas para Joe porque esas filas son distintas en sus columnas. Solo hay una fila para Alex porque esas filas no son distintas para ambas columnas.

UNION ALLda resultados diferentes, porque no eliminará los duplicados. Ejecutando esta declaración:

SELECT * FROM sales2005
UNION ALL
SELECT * FROM sales2006;

daría estos resultados, permitiendo nuevamente la variación por la falta de una ORDER BYdeclaración:

persona Monto
José 1000
José 2000
Alex 2000
Alex 2000
Beto 5000
Zach 35000

La discusión de combinaciones externas completas también tiene un ejemplo que usa UNION.

Operador INTERSECT

El INTERSECToperador SQL toma los resultados de dos consultas y devuelve solo las filas que aparecen en ambos conjuntos de resultados. A los efectos de la eliminación de duplicados, el INTERSECToperador no distingue entre NULLs. El INTERSECToperador elimina filas duplicadas del conjunto de resultados final. El INTERSECT ALLoperador no elimina filas duplicadas del conjunto de resultados final, pero si una fila aparece X veces en la primera consulta e Y veces en la segunda, aparecerá min (X, Y) veces en el conjunto de resultados.

Ejemplo

La siguiente INTERSECTconsulta de ejemplo devuelve todas las filas de la tabla Pedidos donde la cantidad está entre 50 y 100.

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 1 AND 100

INTERSECT

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 50 AND 200;

EXCEPTO operador

El EXCEPToperador SQL toma las distintas filas de una consulta y devuelve las filas que no aparecen en un segundo conjunto de resultados. Para propósitos de eliminación de filas y eliminación de duplicados, el EXCEPToperador no distingue entre NULLs. El EXCEPT ALLoperador no elimina los duplicados, pero si una fila aparece X veces en la primera consulta e Y veces en la segunda, aparecerá como máximo (X - Y, 0) veces en el conjunto de resultados.

En particular, la plataforma Oracle proporciona un MINUSoperador que es funcionalmente equivalente al operador estándar SQL [1] . EXCEPT DISTINCT

Ejemplo

La siguiente EXCEPTconsulta de ejemplo devuelve todas las filas de la tabla Pedidos donde la Cantidad está entre 1 y 49, y aquellas con una Cantidad entre 76 y 100.

Dicho de otra manera; la consulta devuelve todas las filas donde la cantidad está entre 1 y 100, excepto las filas donde la cantidad está entre 50 y 75.

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 1 AND 100

EXCEPT

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 50 AND 75;

Ejemplo

El siguiente ejemplo es equivalente al ejemplo anterior pero sin utilizar el EXCEPToperador.

SELECT o1.*
FROM (
    SELECT *
    FROM Orders
    WHERE Quantity BETWEEN 1 AND 100) o1
LEFT JOIN (
    SELECT *
    FROM Orders
    WHERE Quantity BETWEEN 50 AND 75) o2
ON o1.id = o2.id
WHERE o2.id IS NULL

Ver también

Referencias

enlaces externos