SQL Avanzado

En esta sección, describiremos las siguientes palabras claves y conceptos SQL:

  • SQL UNION
  • SQL UNION ALL
  • SQL INTERSECT
  • SQL MINUS
  • SQL Subconsulta
  • SQL EXISTS
  • SQL CASE

SQL UNION

El propósito del comando SQL UNION es combinar los resultados de dos consultas juntas. En este sentido, UNION es parecido a Join, ya que los dos se utilizan para información relacionada en múltiples tablas. Una restricción de UNION es que todas las columnas correspondientes necesitan ser del mismo tipo de datos. También, cuando utilizamos UNION, sólo se seleccionan valores distintos (similar a SELECT DISTINCT).

La sintaxis es la siguiente:

[Instrucción SQL 1]
UNION
[Instrucción SQL 2]

Supongamos que tenemos las siguientes dos tablas,

Tabla Store_Information

store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Tabla Internet_Sales

Date Sales
07-Jan-1999 250 €
10-Jan-1999 535 €
11-Jan-1999 320 €
12-Jan-1999 750 €

y deseamos saber de todas las fechas donde hay una operación de venta. Para hacerlo, utilizamos la siguiente instrucción SQL:

SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales

Resultado:

Date
05-Jan-1999
07-Jan-1999
08-Jan-1999
10-Jan-1999
11-Jan-1999
12-Jan-1999

Por favor note que si ingresamos “SELECT DISTINCT Date” para cada o ambas instrucciones SQL, obtendremos el mismo conjunto de resultados.

SQL UNION ALL

El propósito del Comando SQL UNION ALL es también combinar los resultados de dos consultas juntas. La diferencia entre UNION ALL y UNION es que, mientras UNION sólo selecciona valores distintos, UNION ALL selecciona todos los valores.

La sintaxis para UNION ALL es la siguiente:

[Instrucción SQL 1]
UNION ALL
[Instrucción SQL 2]

Utilicemos el mismo ejemplo de la sección anterior para ilustrar la diferencia. Supongamos que tenemos las siguientes dos tablas,

Tabla Store_Information

store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Tabla Internet_Sales

Date Sales
07-Jan-1999 250 €
10-Jan-1999 535 €
11-Jan-1999 320 €
12-Jan-1999 750 €

y deseamos encontrar las fechas en donde se realizó una operación de venta en un negocio como así también las fechas donde hay una venta a través de Internet. Para hacerlo, utilizamos la siguiente instrucción SQL:

SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales

Resultado:

Date
05-Jan-1999
07-Jan-1999
08-Jan-1999
08-Jan-1999
07-Jan-1999
10-Jan-1999
11-Jan-1999
12-Jan-1999

SQL INTERSECT

Parecido al comando UNION, INTERSECT también opera en dos instrucciones SQL. La diferencia es que, mientras UNION actúa fundamentalmente como un operador OR (O) (el valor se selecciona si aparece en la primera o la segunda instrucción), el comando INTERSECT actúa como un operador AND (Y) (el valor se selecciona si aparece en ambas instrucciones).

La sintaxis es la siguiente:

[Instrucción SQL 1]
INTERSECT
[Instrucción SQL 2]

Digamos que tenemos las siguientes dos tablas:

Tabla Store_Information

store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Tabla Internet_Sales

Date Sales
07-Jan-1999 250 €
10-Jan-1999 535 €
11-Jan-1999 320 €
12-Jan-1999 750 €

y deseamos encontrar todas las fechas donde hay ventas tanto en el negocio como en Internet. Para hacerlo, utilizamos la siguiente instrucción SQL:

SELECT Date FROM Store_Information
INTERSECT
SELECT Date FROM Internet_Sales

Resultado:

Date
07-Jan-1999

Por favor note que el comando INTERSECT sólo arrojará valores distintivos.

SQL MINUS

opera en dos instrucciones SQL. Toma todos los resultados de la primera instrucción SQL, y luego sustrae aquellos que se encuentran presentes en la segunda instrucción SQL para obtener una respuesta final. Si la segunda instrucción SQL incluye resultados que no están presentes en la primera instrucción SQL, dichos resultados se ignoran.

La sintaxis es la siguiente:

[Instrucción SQL 1]
MINUS
[Instrucción SQL 2]

Continuemos con el mismo ejemplo:

Tabla Store_Information

store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Tabla Internet_Sales

Date Sales
07-Jan-1999 250 €
10-Jan-1999 535 €
11-Jan-1999 320 €
12-Jan-1999 750 €

y deseamos encontrar todas las fechas donde hay ventas en el negocio, pero no aquellas realizadas por Internet. Para hacerlo, utilizamos la siguiente instrucción SQL:

SELECT Date FROM Store_Information
MINUS
SELECT Date FROM Internet_Sales

Resultado:

Date
05-Jan-1999
08-Jan-1999

“05-Jan-1999”, “07-Jan-1999”,et “08-Jan-1999” son los valores distintivos arrojados desde “SELECT Date FROM Store_Information.” También se arroja “07-Jan-1999” de la segunda instrucción SQL, “SELECT Date FROM Internet_Sales,” de este modo se lo excluye del conjunto final de resultados.

Por favor note que el comando MINUSsólo arrojará valores distintos.

Algunas bases de datos pueden utilizar EXCEPT en vez de MINUS. Por favor verifique la documentación para su base de datos específica para el uso apropiado.

SQL Subconsulta >>

Es posible incorporar una instrucción SQL dentro de otra. Cuando esto se hace en las instrucciones WHERE o HAVING, tenemos una construcción de subconsulta.

La sintaxis es la siguiente:

SELECT “nombre1_columna”
FROM “nombre1_tabla”
WHERE “nombre2_columna” [Operador de Comparación]

(SELECT “nombre3_columna”
FROM “nombre2_tabla”
WHERE [Condición]
)

[Operador de Comparación] podrían ser operadores de igualdad tales como =, >, <, >=, <=. También puede ser un operador textual como “LIKE”. La parte en rojo se considera como la “consulta interna”, mientras que la parte en azul se considera como la “consulta externa”.

por ejemplo  SQL :

Table Store_Information

store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Table Geography

region_name store_name
East Boston
East New York
West Los Angeles
West San Diego

SELECT SUM(Sales) FROM Store_Information

WHERE Store_name IN
(SELECT store_name FROM Geography
WHERE region_name = ‘West’)

Résultat :

SUM(Sales)
2050

SubConsulta:

SELECT SUM(a1.Sales) FROM Store_Information a1
WHERE a1.Store_name IN
(SELECT store_name FROM Geography a2
WHERE a2.store_name = a1.store_name)

SQL EXISTS

En la sección anterior, utilizamos IN para enlazar la consulta interna y la consulta externa en una instrucción de subconsulta. IN no es la única forma de hacerlo – uno puede utilizar muchos operadores tales como >, <, o =. EXISTS es un operador especial que describiremos en esta sección.

EXISTS simplemente verifica si la consulta interna arroja alguna fila. Si lo hace, entonces la consulta externa procede. De no hacerlo, la consulta externa no se ejecuta, y la totalidad de la instrucción SQL no arroja nada.

La sintaxis para EXISTS es

SELECT “nombre1_columna”
FROM “nombre1_tabla”
WHERE EXISTS
(SELECT *
FROM “nombre2_tabla”
WHERE [Condición])

Por favor note que en vez de *, puede seleccionar una o más columnas en la consulta interna. El efecto será idéntico.

Utilizamos las mismas tablas de ejemplos:

Tabla Store_Information

store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Tabla Geography

region_name store_name
East Boston
East New York
West Los Angeles
West San Diego

colocaríamos la siguiente consulta SQL:

SELECT SUM(Sales) FROM Store_Information
WHERE EXISTS
(SELECT * FROM Geography
WHERE region_name = ‘West’)

Obtendremos el siguiente resultado:

SUM(Sales)
2750

Al principio, esto puede parecer confuso, debido a que la subsequencia incluye la condición [region_name = ‘West’], aún así la consulta sumó los negocios para todas las regiones. Si observamos de cerca, encontramos que debido a que la subconsulta arroja más de 0 filas, la condición EXISTS es verdadera, y la condición colocada dentro de la consulta interna no influencia la forma en que se ejecuta la consulta externa.

SQL CASE

CASE se utiliza para brindar un tipo de lógica “si-entonces-otro” para SQL. Su sintaxis es:

SELECT CASE (“nombre_columna”)
WHEN “condición1” THEN “resultado1”
WHEN “condición2” THEN “resultado2”

[ELSE “resultadoN”]
END
FROM “nombre_tabla”

“condición” puede ser un valor estático o una expresión. La cláusula ELSE es opcional.

En nuestra Tabla Store_Information de ejemplo,

Tabla Store_Information

store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
San Francisco 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

si deseamos multiplicar las sumas de ventas de ‘Los Angeles’ por 2 y las sumas de ventas de ‘San Diego’ por 1,5, ingresamos,

SELECT store_name, CASE store_name
WHEN ‘Los Angeles’ THEN Sales * 2
WHEN ‘San Diego’ THEN Sales * 1.5
ELSE Sales
END
“Nuevas Ventas”,
Date
FROM Store_Information

“Nuevas Ventas” es el nombre que se le otorga a la columna con la instrucción CASE.

Resultado:

store_name Nuevas Ventas Date
Los Angeles 3000 € 05-Jan-1999
San Diego 375 € 07-Jan-1999
San Francisco 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999