Sei sulla pagina 1di 29

Diseo y gestin de base de datos

Ejemplos de SELECT
A. Utilizar SELECT para obtener filas y columnas

En este ejemplo se muestran tres fragmentos de cdigo. En el primer ejemplo de cdigo se devuelven todas las filas (no se especific la clusula WHERE) y todas las columnas (con *) de la tabla authors de la base de datos pubs.
USE pubs SELECT * FROM authors ORDER BY au_lname ASC, au_fname ASC -- Alternate way. USE pubs SELECT authors.* FROM customers ORDER BY au_lname ASC, au_fname ASC

En este ejemplo se devuelven todas las filas (no se especific la clusula WHERE) y slo un subconjunto de las columnas (au_lname, au_fname, phone, city, state) de la tabla authors de la base de datos pubs. Adems, se agregan encabezados de columna.
USE pubs SELECT au_fname, au_lname, phone AS Telephone, city, state FROM authors ORDER BY au_lname ASC, au_fname ASC

En este ejemplo se devuelven slo las filas de los autores que viven en California y su apellido no es McBadden.
USE pubs SELECT au_fname, au_lname, phone AS Telephone FROM authors WHERE state = 'CA' and au_lname <> 'McBadden' ORDER BY au_lname ASC, au_fname ASC B. Utilizar SELECT con encabezados de columna y clculos

En estos ejemplos se devuelven todas las filas de titles. En el primer ejemplo se devuelven las ventas totales del ao hasta la fecha actual y las cantidades que se deben a cada autor y publicador. En el segundo ejemplo, se calculan los beneficios totales de cada libro.
USE pubs SELECT ytd_sales AS Sales, authors.au_fname + ' '+ authors.au_lname AS Author, ToAuthor = (ytd_sales * royalty) / 100, ToPublisher = ytd_sales - (ytd_sales * royalty) / 100 FROM titles INNER JOIN titleauthor ON titles.title_id = titleauthor.title_id INNER JOIN authors ON titleauthor.au_id = authors.au_id ORDER BY Sales DESC, Author ASC

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

El siguiente es el conjunto de resultados:


Sales ----------22246 22246 18722 15096 8780 4095 4095 4095 4095 4095 4095 4095 4095 4072 3876 3876 3336 2045 2045 2032 375 375 375 111 NULL Author ------------------------Anne Ringer Michel DeFrance Marjorie Green Reginald Blotchet-Halls Cheryl Carson Abraham Bennet Akiko Yokomoto Ann Dull Burt Gringlesby Dean Straight Marjorie Green Michael O'Leary Sheryl Hunter Johnson White Michael O'Leary Stearns MacFeather Charlene Locksley Albert Ringer Anne Ringer Innes del Castillo Livia Karsen Stearns MacFeather Sylvia Panteley Albert Ringer Charlene Locksley ToAuthor ----------5339 5339 4493 2113 1404 409 409 409 409 409 409 409 409 407 387 387 333 245 245 243 37 37 37 11 NULL ToPublisher ----------16907 16907 14229 12983 7376 3686 3686 3686 3686 3686 3686 3686 3686 3665 3489 3489 3003 1800 1800 1789 338 338 338 100 NULL

(25 row(s) affected)

sta es la consulta que calcula el beneficio de cada libro:


USE pubs SELECT 'Total income is', price * ytd_sales AS Revenue, 'for', title_id AS Book# FROM titles ORDER BY Book# ASC

El siguiente es el conjunto de resultados:


Revenue --------------Total income is Total income is Total income is Total income is Total income is Total income is Total income is Total income is Total income is Total income is Total income is Total income is Total income is Total income is Total income is --------------------81859.0500 46318.2000 55978.7800 81859.0500 40619.6800 66515.5400 NULL 201501.0000 81900.0000 NULL 8096.2500 22392.7500 777.0000 81399.2800 26654.6400 ---for for for for for for for for for for for for for for for Book# -----BU1032 BU1111 BU2075 BU7832 MC2222 MC3021 MC3026 PC1035 PC8888 PC9999 PS1372 PS2091 PS2106 PS3333 PS7777

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

Total income is 7856.2500 Total income is 180397.2000 Total income is 61384.0500 (18 row(s) affected) C. Utilizar DISTINCT con SELECT

for for for

TC3218 TC4203 TC7777

En este ejemplo se utiliza DISTINCT para evitar la obtencin de nmeros duplicados de Id. de autor.
USE pubs SELECT DISTINCT au_id FROM authors ORDER BY au_id D. Utilizar subconsultas correlacionadas

En este ejemplo se muestran consultas que son semnticamente equivalentes y se demuestra la diferencia entre la utilizacin de la palabra clave EXISTS y la palabra clave IN. Ambos son ejemplos de subconsultas vlidas que obtienen una instancia de cada nombre de publicador cuyo libro es de negocios y los Id. del publicador coinciden en las tablas titles y publishers.
USE pubs SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business') -- Or USE pubs SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business')

En este ejemplo se utiliza IN en una subconsulta correlacionada (o repetitiva), que es una consulta que depende de la consulta externa para obtener sus valores. Se ejecuta varias veces, una vez para cada fila que seleccione la consulta externa. Esta consulta obtiene una instancia del nombre y apellido de cada autor cuyo porcentaje en la tabla titleauthor es 100 y cuyos nmeros de identificacin de autor coinciden en las tablas authors y titleauthor.
USE pubs SELECT DISTINCT au_lname, au_fname FROM authors WHERE 100 IN (SELECT royaltyper FROM titleauthor WHERE titleauthor.au_id = authors.au_id)

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

La consulta superior de esta instruccin no se puede evaluar independientemente de la consulta externa. Necesita un valor de authors.au_id, pero este valor cambia a medida que Microsoft SQL Server examina diferentes filas en authors. Una subconsulta correlacionada se puede usar tambin en la clusula HAVING de una consulta externa. En este ejemplo se buscan los tipos de libros para los que el anticipo mximo es superior a dos veces el promedio del grupo.
USE pubs SELECT t1.type FROM titles t1 GROUP BY t1.type HAVING MAX(t1.advance) >= ALL (SELECT 2 * AVG(t2.advance) FROM titles t2 WHERE t1.type = t2.type)

En este ejemplo se utilizan dos subconsultas correlacionadas para buscar los nombre de los autores que han participado en la escritura de al menos un libro de informtica conocido.
USE pubs SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE title_id IN (SELECT title_id FROM titles WHERE type = 'popular_comp')) E. Utilizar GROUP BY

En este ejemplo se buscan las ventas anuales hasta la fecha de cada publicador de la base de datos.
USE pubs SELECT pub_id, SUM(ytd_sales) AS total FROM titles GROUP BY pub_id ORDER BY pub_id

El siguiente es el conjunto de resultados:


pub_id -----0736 0877 1389 total ----28286 44219 24941

(3 row(s) affected)

Debido a la clusula GROUP BY, slo se devuelve por cada publicador una fila que contiene la suma de todas las ventas.

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

F. Utilizar GROUP BY con varios grupos

En este ejemplo se busca el promedio de precios y la suma de la ventas anuales hasta la fecha, agrupados por el tipo e Id. del publicador.
USE pubs SELECT type, pub_id, AVG(price) AS 'avg', sum(ytd_sales) AS 'sum' FROM titles GROUP BY type, pub_id ORDER BY type, pub_id

El siguiente es el conjunto de resultados:


type -----------business business mod_cook popular_comp psychology psychology trad_cook UNDECIDED pub_id -----0736 1389 0877 1389 0736 0877 0877 0877 avg --------------------2.9900 17.3100 11.4900 21.4750 11.4825 21.5900 15.9633 NULL sum ----------18722 12066 24278 12875 9564 375 19566 NULL

(8 row(s) affected) Warning, null value eliminated from aggregate. G. Utilizar GROUP BY y WHERE

En este ejemplo se colocan los resultados en grupos despus de obtener slo las filas con anticipos superiores a 5.000 $.
USE pubs SELECT type, AVG(price) FROM titles WHERE advance > $5000 GROUP BY type ORDER BY type

El siguiente es el conjunto de resultados:


type -----------business mod_cook popular_comp psychology trad_cook -------------------------2.99 2.99 21.48 14.30 17.97

(5 row(s) affected) H. Utilizar GROUP BY con una expresin

En este ejemplo se agrupa por una expresin. Puede agrupar por una expresin si sta no contiene funciones de agregado.

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

USE pubs SELECT AVG(ytd_sales), ytd_sales * royalty FROM titles GROUP BY ytd_sales * royalty ORDER BY ytd_sales * royalty

El siguiente es el conjunto de resultados:


----------NULL 111 375 2032 2045 3336 3876 4072 4095 8780 15096 18722 22246 ----------NULL 1110 3750 24384 24540 33360 38760 40720 40950 140480 211344 449328 533904

(13 row(s) affected) I. Comparar GROUP BY y GROUP BY ALL

En el primer ejemplo se generan grupos slo para aquellos libros que tienen derechos de autor del diez por ciento. Puesto que ningn libro de cocina moderno tiene derechos de autor del 10 por ciento, no hay ningn grupo en el resultado del tipo mod_cook. En el segundo ejemplo se generan grupos de todos los tipos, incluidos los libros de cocina moderna y UNDECIDED, aunque el grupo de libros de cocina moderna no contiene filas que cumplan la calificacin especificada en la clusula WHERE. La columna que contiene el valor de agregado (el precio promedio) es NULL para los grupos que carecen de filas que cumplan los criterios.
USE pubs SELECT type, AVG(price) FROM titles WHERE royalty = 10 GROUP BY type ORDER BY type

El siguiente es el conjunto de resultados:


type -----------business popular_comp psychology trad_cook -------------------------17.31 20.00 14.14 17.97

(4 row(s) affected) -- Using GROUP BY ALL

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

USE pubs SELECT type, AVG(price) FROM titles WHERE royalty = 10 GROUP BY all type ORDER BY type

El siguiente es el conjunto de resultados:


type -----------business mod_cook popular_comp psychology trad_cook UNDECIDED -------------------------17.31 NULL 20.00 14.14 17.97 NULL

(6 row(s) affected) J. Utilizar GROUP BY con ORDER BY

En este ejemplo se busca el promedio de precio de cada tipo de libro y se ordenan los resultados por promedio de precio.
USE pubs SELECT type, AVG(price) FROM titles GROUP BY type ORDER BY AVG(price)

El siguiente es el conjunto de resultados:


type -----------UNDECIDED mod_cook psychology business trad_cook popular_comp -------------------------NULL 11.49 13.50 13.73 15.96 21.48

(6 row(s) affected) K. Utilizar la clusula HAVING

En el primer ejemplo se muestra una clusula HAVING con una funcin de agregado. Agrupa por tipo las filas de la tabla titles y elimina los grupos que incluyen solamente un libro. En el segundo ejemplo se muestra una clusula HAVING sin funciones de agregado. Se agrupan las filas de la tabla titles por tipo y se eliminan los tipos que no empiezan por la letra p.
USE pubs SELECT type FROM titles GROUP BY type HAVING COUNT(*) > 1

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

ORDER BY type

El siguiente es el conjunto de resultados:


type -----------business mod_cook popular_comp psychology trad_cook (5 row(s) affected)

En esta consulta se utiliza la clusula LIKE en la clusula HAVING.


USE pubs SELECT type FROM titles GROUP BY type HAVING type LIKE 'p%' ORDER BY type

El siguiente es el conjunto de resultados:


type -----------popular_comp psychology (2 row(s) affected) L. Utilizar HAVING y GROUP BY

En este ejemplo se muestra la utilizacin de las clusulas GROUP BY, HAVING, WHERE y ORDER BY en una instruccin SELECT. Se generan grupos y valores de resumen pero tras eliminar los ttulos cuyos precios son inferiores a 5 $. Tambin se organizan los resultados por pub_id.
USE pubs SELECT pub_id, SUM(advance), AVG(price) FROM titles WHERE price >= $5 GROUP BY pub_id HAVING SUM(advance) > $15000 AND AVG(price) < $20 AND pub_id > '0800' ORDER BY pub_id

El siguiente es el conjunto de resultados:


pub_id ------ -------------------------- -------------------------0877 26,000.00 17.89 1389 30,000.00 18.98 (2 row(s) affected)

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

M. Utilizar HAVING con SUM y AVG

En este ejemplo se agrupa la tabla titles por publicador y se incluyen solamente aquellos grupos de publicadores que han pagado ms de 25.000 $ en anticipos y cuyos libros tienen un promedio de precio superior a 15 $.
USE pubs SELECT pub_id, SUM(advance), AVG(price) FROM titles GROUP BY pub_id HAVING SUM(advance) > $25000 AND AVG(price) > $15

Para ver los publicadores cuyas ventas anuales hasta la fecha sean superiores a 40.000 $, utilice esta consulta:
USE pubs SELECT pub_id, total = SUM(ytd_sales) FROM titles GROUP BY pub_id HAVING SUM(ytd_sales) > 40000

Si desea comprobar que hay al menos seis libros implicados en los clculos de cada publicador, utilice HAVING COUNT(*) > 5 para eliminar los publicadores que devuelven totales inferiores a seis libros. La consulta sera la siguiente:
USE pubs SELECT pub_id, SUM(ytd_sales) AS total FROM titles GROUP BY pub_id HAVING COUNT(*) > 5

El siguiente es el conjunto de resultados:


pub_id -----0877 1389 total ----44219 24941

(2 row(s) affected)

Con esta instruccin, se devuelven dos filas. Se elimina New Moon Books (0736).
N. Calcular totales de grupo con COMPUTE BY

En este ejemplo se utilizan dos fragmentos de cdigo para mostrar la utilizacin de COMPUTE BY. En el primer ejemplo de cdigo se utiliza un elemento COMPUTE BY con una funcin de agregado y en el segundo se utiliza un elemento COMPUTE BY y dos funciones de agregado. En este ejemplo se calcula la suma de precios (para precios superiores a 10 $) de cada tipo de libro de cocina y se ordenan primero por tipo de libro y, despus, por precio.
USE pubs SELECT type, price

Ing. Timoteo Caldern Letona

Diseo y gestin de base de datos

FROM titles WHERE price > $10 AND type LIKE '%cook' ORDER BY type, price COMPUTE SUM(price) BY type

El siguiente es el conjunto de resultados:


type price ------------ --------------------mod_cook 19.9900 (1 row(s) affected) sum --------------------19.9900 (1 row(s) affected) type -----------trad_cook trad_cook trad_cook price --------------------11.9500 14.9900 20.9500

(3 row(s) affected) sum --------------------47.8900 (1 row(s) affected)

En este ejemplo se obtiene el tipo de libro, el nmero de identificacin del publicador y el precio de todos los libros de cocina. La clusula COMPUTE BY utiliza dos funciones de agregado diferentes.
USE pubs SELECT type, pub_id, price FROM titles WHERE type LIKE '%cook' ORDER BY type, pub_id COMPUTE SUM(price), MAX(pub_id) BY type

El siguiente es el conjunto de resultados:


type -----------mod_cook mod_cook pub_id -----0877 0877 price --------------------19.9900 2.9900

(2 row(s) affected) sum max --------------------- ---22.9800 0877 (1 row(s) affected)

Ing. Timoteo Caldern Letona

10

Diseo y gestin de base de datos

type -----------trad_cook trad_cook trad_cook

pub_id -----0877 0877 0877

price --------------------20.9500 11.9500 14.9900

(3 row(s) affected) sum max --------------------- ---47.8900 0877 (1 row(s) affected) O. Calcular valores totales con COMPUTE sin BY

Se puede utilizar la palabra clave COMPUTE sin BY para generar totales generales, cuentas totales, etc. Esta instruccin averigua el total general de los precios y anticipos de todos los tipos de libros cuyo precio es superior a 20 $.
USE pubs SELECT type, price, advance FROM titles WHERE price > $20 COMPUTE SUM(price), SUM(advance)

Puede utilizar COMPUTE BY y COMPUTE sin BY en la misma consulta. Esta consulta calcula la suma de precios y anticipos por tipo y, a continuacin, calcula el total general de los precios y anticipos de todos los tipos de libros.
USE pubs SELECT type, price, advance FROM titles WHERE type LIKE '%cook' ORDER BY type, price COMPUTE SUM(price), SUM(advance) BY type COMPUTE SUM(price), SUM(advance)

El siguiente es el conjunto de resultados:


type -----------mod_cook mod_cook price --------------------2.9900 19.9900 advance --------------------15000.0000 .0000

(2 row(s) affected) sum sum --------------------- --------------------22.9800 15000.0000 (1 row(s) affected) type price advance ------------ --------------------- ---------------------

Ing. Timoteo Caldern Letona

11

Diseo y gestin de base de datos

trad_cook trad_cook trad_cook

11.9500 14.9900 20.9500

4000.0000 8000.0000 7000.0000

(3 row(s) affected) sum sum --------------------- --------------------47.8900 19000.0000 (1 row(s) affected) sum sum --------------------- --------------------70.8700 34000.0000 (1 row(s) affected) P. Calcular sumas en todas las columnas

En este ejemplo se muestran slo tres columnas en la lista de seleccin y se proporcionan totales basados en todos los precios y anticipos al final de los resultados.
USE pubs SELECT type, price, advance FROM titles COMPUTE SUM(price), SUM(advance)

El siguiente es el conjunto de resultados:


type -----------business business business business mod_cook mod_cook UNDECIDED popular_comp popular_comp popular_comp psychology psychology psychology psychology psychology trad_cook trad_cook trad_cook price --------------------19.9900 11.9500 2.9900 19.9900 19.9900 2.9900 NULL 22.9500 20.0000 NULL 21.5900 10.9500 7.0000 19.9900 7.9900 20.9500 11.9500 14.9900 advance --------------------5000.0000 5000.0000 10125.0000 5000.0000 .0000 15000.0000 NULL 7000.0000 8000.0000 NULL 7000.0000 2275.0000 6000.0000 2000.0000 4000.0000 7000.0000 4000.0000 8000.0000

(18 row(s) affected) sum sum --------------------- --------------------236.2600 95400.0000 (1 row(s) affected)

Ing. Timoteo Caldern Letona

12

Diseo y gestin de base de datos

Warning, null value eliminated from aggregate. Q. Utilizar ms de una clusula COMPUTE

En este ejemplo se calcula la suma de los precios de todos los libros de psicologa, as como la suma de los precios de los libros de psicologa organizados por publicador. Puede utilizar diferentes funciones de agregado en la misma instruccin si incluye ms de una clusula COMPUTE BY.
USE pubs SELECT type, pub_id, price FROM titles WHERE type = 'psychology' ORDER BY type, pub_id, price COMPUTE SUM(price) BY type, pub_id COMPUTE SUM(price) BY type

El siguiente es el conjunto de resultados:


type -----------psychology psychology psychology psychology pub_id -----0736 0736 0736 0736 price --------------------7.0000 7.9900 10.9500 19.9900

(4 row(s) affected) sum --------------------45.9300 (1 row(s) affected) type pub_id price ------------ ------ --------------------psychology 0877 21.5900 (1 row(s) affected) sum --------------------21.5900 (1 row(s) affected) sum --------------------67.5200 (1 row(s) affected) R. Comparar GROUP BY con COMPUTE

En el primer ejemplo se utiliza la clusula COMPUTE para calcular la suma de los precios de los diferentes libros de cocina. En el segundo ejemplo se genera la misma informacin de resumen slo con GROUP BY.

Ing. Timoteo Caldern Letona

13

Diseo y gestin de base de datos

USE pubs -- Using COMPUTE SELECT type, price FROM titles WHERE type like '%cook' ORDER BY type, price COMPUTE SUM(price) BY type

El siguiente es el conjunto de resultados:


type -----------mod_cook mod_cook price --------------------2.9900 19.9900

(2 row(s) affected) sum --------------------22.9800 (1 row(s) affected) type -----------trad_cook trad_cook trad_cook price --------------------11.9500 14.9900 20.9500

(3 row(s) affected) sum --------------------47.8900 (1 row(s) affected)

sta es la segunda consulta con GROUP BY:


USE pubs -- Using GROUP BY SELECT type, SUM(price) FROM titles WHERE type LIKE '%cook' GROUP BY type ORDER BY type

El siguiente es el conjunto de resultados:


type ------------ --------------------mod_cook 22.9800 trad_cook 47.8900 (2 row(s) affected)

Ing. Timoteo Caldern Letona

14

Diseo y gestin de base de datos

S. Utilizar SELECT con las clusulas GROUP BY, COMPUTE y ORDER BY

En este ejemplo se devuelven solamente las filas que contienen las ventas anuales hasta la fecha y, a continuacin, se calcula el promedio de costo de los libros y los anticipos totales en orden descendente por type. Se devuelven cuatro columnas de datos y se incluye el ttulo truncado. Todas las columnas calculadas aparecen en la lista de seleccin.
USE pubs SELECT CAST(title AS char(20)) AS title, type, price, advance FROM titles WHERE ytd_sales IS NOT NULL ORDER BY type DESC COMPUTE AVG(price), SUM(advance) BY type COMPUTE SUM(price), SUM(advance)

El siguiente es el conjunto de resultados:


title --------------------Onions, Leeks, and G Fifty Years in Bucki Sushi, Anyone? (3 row(s) affected) avg sum --------------------- --------------------15.9633 19000.0000 (1 row(s) affected) title --------------------Computer Phobic AND Is Anger the Enemy? Life Without Fear Prolonged Data Depri Emotional Security: (5 row(s) affected) avg sum --------------------- --------------------13.5040 21275.0000 (1 row(s) affected) title --------------------But Is It User Frien Secrets of Silicon V (2 row(s) affected) avg sum type price advance ------------ --------------------- -------------popular_comp 22.9500 popular_comp 20.0000 7000.0000 8000.0000 type price advance ------------ --------------------- -------------psychology psychology psychology psychology psychology 21.5900 10.9500 7.0000 19.9900 7.9900 7000.0000 2275.0000 6000.0000 2000.0000 4000.0000 type price advance ------------ --------------------- -------------trad_cook trad_cook trad_cook 20.9500 11.9500 14.9900 7000.0000 4000.0000 8000.0000

Ing. Timoteo Caldern Letona

15

Diseo y gestin de base de datos

--------------------- --------------------21.4750 15000.0000 (1 row(s) affected) title --------------------Silicon Valley Gastr The Gourmet Microwav (2 row(s) affected) avg sum --------------------- --------------------11.4900 15000.0000 (1 row(s) affected) title --------------------The Busy Executive's Cooking with Compute You Can Combat Compu Straight Talk About (4 row(s) affected) avg sum --------------------- --------------------13.7300 25125.0000 (1 row(s) affected) sum sum --------------------- --------------------236.2600 95400.0000 (1 row(s) affected) T. Utilizar la instruccin SELECT con CUBE type price advance ------------ --------------------- -------------business business business business 19.9900 11.9500 2.9900 19.9900 5000.0000 5000.0000 10125.0000 5000.0000 type price advance ------------ --------------------- -------------mod_cook mod_cook 19.9900 2.9900 .0000 15000.0000

En este ejemplo se muestran dos fragmentos de cdigo. En el primer ejemplo se devuelve el conjunto de resultados de una instruccin SELECT que utiliza el operador CUBE. La instruccin SELECT abarca una relacin de uno a varios entre los ttulos de los libros y la cantidad vendida de cada libro. Con el operador CUBE, la instruccin devuelve una fila adicional.
USE pubs SELECT SUBSTRING(title, 1, 65) AS title, SUM(qty) AS 'qty' FROM sales INNER JOIN titles ON sales.title_id = titles.title_id GROUP BY title WITH CUBE ORDER BY title

El siguiente es el conjunto de resultados:

Ing. Timoteo Caldern Letona

16

Diseo y gestin de base de datos

title -----------------------------------------------------------------NULL But Is It User Friendly? Computer Phobic AND Non-Phobic Individuals: Behavior Variations Cooking with Computers: Surreptitious Balance Sheets ... The Busy Executive's Database Guide The Gourmet Microwave You Can Combat Computer Stress! (17 row(s) affected)

qty ---493 30 20 25 15 40 35

El valor NULL representa a todos los valores de la columna title. El conjunto de resultados devuelve valores con las cantidades vendidas de cada ttulo y la cantidad vendida de todos los ttulos. Al aplicar el operador CUBE o el operador ROLLUP se devuelve el mismo resultado. En este ejemplo se utiliza la tabla cube_examples para mostrar cmo afecta el operador CUBE al conjunto de resultados y se utiliza una funcin de agregado (SUM). La tabla cube_examples contiene un nombre de producto, un nombre de cliente y el nmero de pedidos que cada cliente ha realizado de un producto determinado.
USE pubs CREATE TABLE cube_examples (product_name varchar(30) NULL, customer_name varchar(30) NULL, number_of_orders int NULL ) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Filo Mix', 'Romero y tomillo', 10) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Outback Lager', 'Wilman Kala', 10) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Filo Mix', 'Romero y tomillo', 20) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Ikura', 'Wilman Kala', 10) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Ikura', 'Romero y tomillo', 10) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Outback Lager', 'Wilman Kala', 20) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Filo Mix', 'Wilman Kala', 30) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Filo Mix', 'Eastern Connection', 40) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Outback Lager', 'Eastern Connection', 10) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Ikura', 'Wilman Kala', 40) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Ikura', 'Romero y tomillo', 10) INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Filo Mix', 'Romero y tomillo', 50)

Primero, emita una consulta tpica con la clusula GROUP BY y el conjunto de resultados.

Ing. Timoteo Caldern Letona

17

Diseo y gestin de base de datos

USE pubs SELECT product_name, customer_name, SUM(number_of_orders) FROM cube_examples GROUP BY product_name, customer_name ORDER BY product_name

GROUP BY ocasiona que el conjunto de resultados forme grupos dentro de los grupos. El siguiente es el conjunto de resultados:
product_name ------------------------------Filo Mix Filo Mix Filo Mix Ikura Ikura Outback Lager Outback Lager (7 row(s) affected) customer_name ------------------------------ -------Eastern Connection Romero y tomillo Wilman Kala Romero y tomillo Wilman Kala Eastern Connection Wilman Kala 40 80 30 20 50 10 30

A continuacin, emita una consulta con una clusula GROUP BY con el operador CUBE. El conjunto de resultados debe contener la misma informacin e informacin de superagregado de cada una de las columnas GROUP BY.
USE pubs SELECT product_name, customer_name, SUM(number_of_orders) FROM cube_examples GROUP BY product_name, customer_name WITH CUBE

El conjunto de resultados del operador CUBE contiene los valores del conjunto de resultados GROUP BY anterior y agrega los superagregados de cada columna en la clusula GROUP BY. El valor NULL representa todos los valores del conjunto cuyo agregado se calcula. El siguiente es el conjunto de resultados:
product_name ------------------------------Filo Mix Filo Mix Filo Mix Filo Mix Ikura Ikura Ikura Outback Lager Outback Lager Outback Lager NULL NULL NULL NULL (14 row(s) affected) customer_name ------------------------------ -------Eastern Connection Romero y tomillo Wilman Kala NULL Romero y tomillo Wilman Kala NULL Eastern Connection Wilman Kala NULL NULL Eastern Connection Romero y tomillo Wilman Kala 40 80 30 150 20 50 70 10 30 40 260 50 100 110

Ing. Timoteo Caldern Letona

18

Diseo y gestin de base de datos

La lnea 4 del conjunto de resultados indica que, entre todos los clientes, se ha realizado un total de 150 pedidos de Filo Mix. La lnea 11 del conjunto de resultados indica que el nmero total de pedidos que han realizado todos los clientes de todos los productos es 260. Las lneas 12 a 14 del conjunto de resultados indican que el nmero total de pedidos de cada cliente para todos los productos es 100, 110 y 50, respectivamente.
U. Utilizar CUBE en un conjunto de resultados con tres columnas

En este ejemplo se muestran dos fragmentos de cdigo. En el primer ejemplo de cdigo se genera un conjunto de resultados de CUBE con tres columnas y en el segundo ejemplo se produce un conjunto de resultados de CUBE con cuatro columnas. La primera instruccin SELECT devuelve el nombre de la publicacin, el ttulo y la cantidad de libros vendidos. La clusula GROUP BY de este ejemplo contiene dos columnas llamadas pub_name y title. Tambin hay dos relaciones uno a varios entre publishers y titles y entre titles y sales. Al utilizar el operador CUBE, el conjunto de resultados contiene ms informacin detallada acerca de las cantidades de ttulos vendidos por publicadores. El valor NULL representa a todos los valores de la columna title.
USE pubs SELECT pub_name, title, SUM(qty) AS 'qty' FROM sales INNER JOIN titles ON sales.title_id = titles.title_id INNER JOIN publishers ON publishers.pub_id = titles.pub_id GROUP BY pub_name, title WITH CUBE

El siguiente es el conjunto de resultados:


pub_name -------------------Algodata Infosystems Algodata Infosystems Algodata Infosystems Algodata Infosystems Algodata Infosystems Algodata Infosystems Binnet & Hardley Binnet & Hardley ... NULL NULL NULL NULL (36 row(s) affected) title qty ---------------------------------------- -----But Is It User Friendly? 30 Cooking with Computers: Surreptitious Ba 25 Secrets of Silicon Valley 50 Straight Talk About Computers 15 The Busy Executive's Database Guide 15 NULL 135 Computer Phobic AND Non-Phobic Individu 20 Fifty Years in Buckingham Palace Kitche 20 ... Sushi, Anyone? 20 The Busy Executive's Database Guide 15 The Gourmet Microwave 40 You Can Combat Computer Stress! 35

Al aumentar el nmero de columnas en la clusula GROUP BY se muestra por qu el operador CUBE es un operador de n dimensiones. Una clusula GROUP BY con dos columnas devuelve tres clases ms de agrupamientos cuando se utiliza el operador
Ing. Timoteo Caldern Letona

19

Diseo y gestin de base de datos

CUBE. El nmero de agrupamientos puede ser mayor de tres, en funcin de los distintos valores de las columnas. El conjunto de resultados est agrupado por el nombre del publicador y, a continuacin, por el ttulo del libro. La cantidad de cada ttulo vendida por cada publicador se enumera en la columna del lado derecho. El valor NULL en la columna title representa a todos los ttulos. Para obtener ms informacin acerca de cmo diferenciar valores especficos y todos los valores en el conjunto de resultados, consulte el ejemplo H. El operador CUBE devuelve estos grupos de informacin a partir de una instruccin SELECT:

La cantidad de cada ttulo que ha vendido cada publicador. La cantidad vendida de cada ttulo. La cantidad de ttulos que ha vendido cada publicador. El nmero total de ttulos vendidos por todos los publicadores.

Cada columna a la que se hace referencia en la clusula GROUP BY tiene una referencia cruzada con las dems columnas de la clusula GROUP BY y se le ha vuelto a aplicar el agregado SUM, con lo que se crean filas adicionales en el conjunto de resultados. La informacin que devuelve el conjunto de resultados crece en n dimensiones junto con el nmero de columnas de la clusula GROUP BY.

Nota Compruebe que todas las columnas que siguen a la clusula GROUP BY tienen entre s relaciones significativas y reales. Por ejemplo, si utiliza au_fname y au_lname, el operador CUBE devuelve informacin irrelevante, como el nmero de libros venidos por los autores que tienen el mismo nombre. Mediante la utilizacin del operador CUBE en una jerarqua real, como las ventas anuales y trimestrales, se producen filas sin significado en el conjunto de resultados. Resulta ms eficaz utilizar el operador ROLLUP. En este segundo ejemplo, la clusula GROUP BY contiene tres columnas a las que el operador CUBE realiza referencias cruzadas. Hay tres relaciones uno a varios entre publishers y authors, entre authors y titles y entre titles y sales. Con el operador CUBE, se devuelve informacin ms detallada acerca de la cantidad de ttulos que venden los publicadores.
USE pubs SELECT pub_name, au_lname, title, SUM(qty) FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id INNER JOIN titles ON titles.title_id = titleauthor.title_id INNER JOIN publishers ON publishers.pub_id = titles.pub_id INNER JOIN sales ON sales.title_id = titles.title_id GROUP BY pub_name, au_lname, title WITH CUBE

Ing. Timoteo Caldern Letona

20

Diseo y gestin de base de datos

El operador CUBE devuelve esta informacin basada en agrupamientos con referencias cruzadas devueltos con el operador CUBE:

Nmero de cada ttulo de cada autor que ha vendido cada publicador. Nmero total de ttulos de cada autor que ha vendido cada publicador. Nmero total de ttulos que ha vendido cada publicador. Nmero de ttulos de todos los autores vendidos por todos los publicadores. Nmero de cada ttulo de cada autor vendido por todos los publicadores. Nmero de ttulos de cada autor vendidos por todos los publicadores. Nmero de cada ttulo de todos los autores vendidos por cada publicador. Nmero de cada ttulo de cada autor vendido por todos los publicadores.

Nota El superagregado de todos los publicadores, todos los ttulos y todos los autores es mayor que el nmero total de ventas, debido a que cierto nmero de ttulos tienen ms de un autor. Un patrn emerge a medida que crece el nmero de relaciones. El patrn de los valores y los valores NULL del informe muestran los grupos que se han formado para un agregado de resumen. La funcin GROUPING proporciona informacin explcita acerca de los grupos.
V. Utilizar la funcin GROUPING con CUBE

En este ejemplo se muestra cmo la instruccin SELECT utiliza la funcin de agregado SUM, la clusula GROUP BY y el operador CUBE. Tambin utiliza la funcin GROUPING en las dos columnas enumeradas despus de la clusula GROUP BY.
USE pubs SELECT pub_name, GROUPING(pub_name),title, GROUPING(title), SUM(qty) AS 'qty' FROM sales INNER JOIN titles ON sales.title_id = titles.title_id INNER JOIN publishers ON publishers.pub_id = titles.pub_id GROUP BY pub_name, title WITH CUBE

El conjunto de resultados tiene dos columnas que contienen los valores 0 y 1, producidos por las expresiones GROUPING(pub_name) y GROUPING(title). El siguiente es el conjunto de resultados:
pub_name title qty -------------------- --- ------------------------- --- ----------Algodata Infosystems 0 But Is It User Friendly? 0 30 Algodata Infosystems 0 Cooking with Computers: S 0 25 Algodata Infosystems 0 Secrets of Silicon Valley 0 50

Ing. Timoteo Caldern Letona

21

Diseo y gestin de base de datos

Algodata Algodata Algodata Binnet & Binnet & ... NULL NULL NULL

Infosystems Infosystems Infosystems Hardley Hardley

0 0 0 0 0

0 0 1 0 0 ... 1 The Busy Executive's Data 0 1 The Gourmet Microwave 0 1 You Can Combat Computer S 0

Straight Talk About Compu The Busy Executive's Data NULL Computer Phobic AND Non-P Fifty Years in Buckingham

15 15 135 20 20 15 40 35

(36 row(s) affected) W. Utilizar el operador ROLLUP

En este ejemplo se muestran dos fragmentos de cdigo. En el primer ejemplo se obtiene el nombre de producto, el nombre de cliente y la suma de pedidos realizados, y se utiliza el operador ROLLUP.
USE pubs SELECT product_name, customer_name, SUM(number_of_orders) AS 'Sum orders' FROM cube_examples GROUP BY product_name, customer_name WITH ROLLUP

El siguiente es el conjunto de resultados:


product_name orders ------------------------------Filo Mix Filo Mix Filo Mix Filo Mix Ikura Ikura Ikura Outback Lager Outback Lager Outback Lager NULL (11 row(s) affected) customer_name Sum

------------------------------ -------Eastern Connection Romero y tomillo Wilman Kala NULL Romero y tomillo Wilman Kala NULL Eastern Connection Wilman Kala NULL NULL 40 80 30 150 20 50 70 10 30 40 260

En el segundo ejemplo se realiza una operacin ROLLUP en las columnas de la compaa y el departamento, y se muestra el nmero total de empleados. El operador ROLLUP produce un resumen de agregados. Esto resulta til cuando se necesita informacin de resumen pero un CUBE completo proporciona datos extraos o cuando se tienen conjuntos dentro de conjuntos. Por ejemplo, los departamentos de una compaa son un conjunto dentro de un conjunto.
USE pubs CREATE TABLE personnel ( company_name varchar(20),

Ing. Timoteo Caldern Letona

22

Diseo y gestin de base de datos

department varchar(15), num_employees int ) INSERT INSERT INSERT INSERT INSERT INSERT personnel personnel personnel personnel personnel personnel VALUES VALUES VALUES VALUES VALUES VALUES ('Du monde entier', 'Finance', 10) ('Du monde entier', 'Engineering', 40) ('Du monde entier', 'Marketing', 40) ('Piccolo und mehr', 'Accounting', 20) ('Piccolo und mehr', 'Personnel', 30) ('Piccolo und mehr', 'Payroll', 40)

En esta consulta, el nombre de la compaa, departamento y la suma de todos los empleados de la compaa forman parte del conjunto de resultados, adems de los clculos de ROLLUP.
SELECT company_name, department, SUM(num_employees) FROM personnel GROUP BY company_name, department WITH ROLLUP

El siguiente es el conjunto de resultados:


company_name -------------------Du monde entier Du monde entier Du monde entier Du monde entier Piccolo und mehr Piccolo und mehr Piccolo und mehr Piccolo und mehr NULL (9 row(s) affected) X. Utilizar la funcin GROUPING department --------------Engineering Finance Marketing NULL Accounting Payroll Personnel NULL NULL ----------40 10 40 90 20 40 30 90 180

En este ejemplo se agregan tres nuevas filas a la tabla cube_examples. Cada uno de los tres registros NULL de una o ms columnas utilizados para mostrar slo la funcin ROLLUP produce el valor 1 en la columna de agrupamiento. Adems, en este ejemplo se modifica la instruccin SELECT que se utiliz en el ejemplo anterior.
USE pubs -- Add first row with a NULL customer name and 0 orders. INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES ('Ikura', NULL, 0) -- Add second row with a NULL product and NULL customer with real value -- for orders. INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES (NULL, NULL, 50) -- Add third row with a NULL product, NULL order amount, but a real -- customer name. INSERT cube_examples (product_name, customer_name, number_of_orders) VALUES (NULL, 'Wilman Kala', NULL)

Ing. Timoteo Caldern Letona

23

Diseo y gestin de base de datos

SELECT product_name AS Prod, customer_name AS Cust, SUM(number_of_orders) AS 'Sum Orders', GROUPING(product_name) AS 'Grp prod_name', GROUPING(customer_name) AS 'Grp cust_name' FROM cube_examples GROUP BY product_name, customer_name WITH ROLLUP

La funcin GROUPING slo se puede utilizar con CUBE o ROLLUP. La funcin GROUPING devuelve 1 cuando una expresin produce como resultado NULL, debido a que el valor de la columna es NULL y representa el conjunto de todos los valores. La funcin GROUPING devuelve 0 cuando la columna correspondiente (sea NULL o no) no proviene de las opciones CUBE o ROLLUP como valor de sintaxis. El valor devuelto es del tipo de datos tinyint. El siguiente es el conjunto de resultados:
Prod cust_name -------------NULL NULL NULL Filo Mix Filo Mix Filo Mix Filo Mix Ikura Ikura Ikura Ikura Outback Lager Outback Lager Outback Lager NULL Cust Sum Orders Grp prod_name Grp

------------------ ----------- ------------- ----------NULL Wilman Kala NULL Eastern Connection Romero y tomillo Wilman Kala NULL NULL Romero y tomillo Wilman Kala NULL Eastern Connection Wilman Kala NULL NULL 50 NULL 50 40 80 30 150 0 20 50 70 10 30 40 310 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1

(15 row(s) affected) Y. Utilizar SELECT con GROUP BY, una funcin de agregado y ROLLUP

En este ejemplo se utiliza una consulta SELECT que contiene una funcin de agregado y una clusula GROUP BY, que enumera pub_name, au_lname y title en ese orden.
USE pubs SELECT pub_name, au_lname, title, SUM(qty) AS 'SUM' FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id INNER JOIN titles ON titles.title_id = titleauthor.title_id INNER JOIN publishers ON publishers.pub_id = titles.pub_id INNER JOIN sales ON sales.title_id = titles.title_id GROUP BY pub_name, au_lname, title WITH ROLLUP

Con el operador ROLLUP, estos agrupamientos se crean al moverse de derecha a izquierda por la lista de columnas.

Ing. Timoteo Caldern Letona

24

Diseo y gestin de base de datos

pub_name pub_name pub_name NULL

au_lname au_lname NULL NULL

title NULL NULL NULL

SUM(qty) SUM(qty) SUM(qty) SUM(qty)

Los valores NULL representan todos los valores de esa columna. Si utiliza la instruccin SELECT sin el operador ROLLUP, la instruccin crea un solo agrupamiento. La consulta devuelve un valor de suma para cada combinacin exclusiva de pub_name, au_lname y title.
pub_name au_lname title SUM(qty)

Compare estos ejemplos con los agrupamientos creados al utilizar el operador CUBE en la misma consulta.
pub_name pub_name pub_name NULL NULL NULL pub_name NULL au_lname au_lname NULL NULL au_lname au_lname NULL NULL title SUM(qty) NULL SUM(qty) NULL SUM(qty) NULL SUM(qty) title SUM(qty) NULL SUM(qty) title SUM(qty) title SUM(qty)

Los agrupamientos corresponden a la informacin devuelta en el conjunto de resultados. Los valores NULL del conjunto de resultados representan todos los valores de la columna. El operador ROLLUP devuelve los siguientes datos cuando las columnas (pub_name, au_lname, title) estn en el orden enumerado en la clusula GROUP BY:

Nmero de cada ttulo de cada autor que ha vendido cada publicador. Nmero total de ttulos de cada autor que ha vendido cada publicador. Nmero total de ttulos que ha vendido cada publicador. Nmero de ttulos de todos los autores vendidos por todos los publicadores.

El siguiente es el conjunto de resultados:


pub_name SUM ----------------Algodata Infosys Algodata Infosys Algodata Infosys Algodata Infosys Algodata Infosys ... New Moon Books New Moon Books New Moon Books NULL au_lname title

------------ ------------------------------------ -Bennet Bennet Carson Dull Dull White White NULL NULL The Busy Executive's Database Guide 15 NULL 15 NULL 30 Secrets of Silicon Valley 50 NULL 50 ... Prolonged Data Deprivation: Four 15 NULL 15 NULL 316 NULL 791

(49 row(s) affected)

Ing. Timoteo Caldern Letona

25

Diseo y gestin de base de datos

Se puede utilizar la funcin GROUPING con el operador ROLLUP o con el operador CUBE. Puede aplicar esta funcin a una de las columnas de la lista de seleccin. La funcin devuelve 1 o 0, dependiendo de si la columna est agrupada mediante el operador ROLLUP.
a. Utilizar la sugerencia del optimizador INDEX

En este ejemplo se muestran dos formas de utilizar la sugerencia del optimizador INDEX. En el primer ejemplo se muestra cmo forzar al optimizador a que utilice un ndice no agrupado para recuperar las filas de una tabla y en el segundo ejemplo se fuerza un recorrido de tabla con un ndice igual a 0.
-- Use the specifically named INDEX. USE pubs SELECT au_lname, au_fname, phone FROM authors WITH (INDEX(aunmind)) WHERE au_lname = 'Smith'

El siguiente es el conjunto de resultados:


au_lname au_fname phone -------------------------------------- -------------------- ---------Smith Meander 913 8430462 (1 row(s) affected) -- Force a table scan by using INDEX = 0. USE pubs SELECT emp_id, fname, lname, hire_date FROM employee (index = 0) WHERE hire_date > '10/1/1994' b. Utilizar OPTION y las sugerencias GROUP

En este ejemplo se muestra cmo se utiliza la clusula OPTION (GROUP) con una clusula GROUP BY.
USE pubs SELECT a.au_fname, a.au_lname, SUBSTRING(t.title, 1, 15) FROM authors a INNER JOIN titleauthor ta ON a.au_id = ta.au_id INNER JOIN titles t ON t.title_id = ta.title_id GROUP BY a.au_lname, a.au_fname, t.title ORDER BY au_lname ASC, au_fname ASC OPTION (HASH GROUP, FAST 10) c. Utilizar la sugerencia de consulta UNION

En este ejemplo se utiliza la sugerencia de consulta MERGE UNION.


USE pubs SELECT * FROM authors a1 OPTION (MERGE UNION) SELECT *

Ing. Timoteo Caldern Letona

26

Diseo y gestin de base de datos

FROM authors a2 d. Utilizar UNION simple

El conjunto de resultados de este ejemplo incluye el contenido de las columnas ContactName, CompanyName, City y Phone (nombre de contacto, empresa, poblacin y telfono) de las tablas Customers y SouthAmericanCustomers (clientes y clientes sudamericanos).
USE Northwind GO IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'SouthAmericanCustomers') DROP TABLE SouthAmericanCustomers GO -- Create SouthAmericanCustomers table. SELECT ContactName, CompanyName, City, Phone INTO SouthAmericanCustomers FROM Customers WHERE Country IN ('USA', 'Canada') GO -- Here is the simple union. USE Northwind SELECT ContactName, CompanyName, City, Phone FROM Customers WHERE Country IN ('USA', 'Canada') UNION SELECT ContactName, CompanyName, City, Phone FROM SouthAmericanCustomers ORDER BY CompanyName, ContactName ASC GO e. Utilizar SELECT INTO con UNION

En este ejemplo, la clusula INTO de la primera instruccin SELECT especifica que la tabla denominada CustomerResults debe contener el conjunto final de resultados de la unin de las columnas designadas de las tablas Customers y SouthAmericanCustomers.
USE Northwind IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'CustomerResults') DROP TABLE CustomerResults GO USE Northwind SELECT ContactName, CompanyName, City, Phone INTO CustomerResults FROM Customers WHERE Country IN ('USA', 'Canada') UNION SELECT ContactName, CompanyName, City, Phone FROM SouthAmericanCustomers ORDER BY CompanyName, ContactName ASC GO f. Utilizar UNION para dos instrucciones SELECT con ORDER BY

Ing. Timoteo Caldern Letona

27

Diseo y gestin de base de datos

El orden de algunos parmetros utilizados con la clusula UNION es importante. En este ejemplo se muestra el uso correcto e incorrecto de UNION en dos instrucciones SELECT en las que se cambia el nombre de una columna en la salida.
/* INCORRECT */ USE Northwind GO SELECT City FROM Customers ORDER BY Cities UNION SELECT Cities = City FROM SouthAmericanCustomers GO /* CORRECT */ USE Northwind GO SELECT Cities = City FROM Customers UNION SELECT City FROM SouthAmericanCustomers ORDER BY Cities GO g. Utilizar UNION entre tres instrucciones SELECT para mostrar los efectos de ALL y los parntesis

En estos ejemplos, se utiliza UNION para mezclar los resultados de tres tablas que tienen 5 filas de datos. En el primer ejemplo, se utiliza UNION ALL para mostrar los registros duplicados y se devuelven como resultado las 15 filas. En el segundo ejemplo, se utiliza UNION sin ALL para eliminar las filas duplicadas de los resultados combinados de tres instrucciones SELECT y se devuelven 5 filas como resultado. En el ejemplo final, se utiliza ALL con la primera operacin UNION y parntesis para la segunda UNION, que no utiliza ALL. La segunda operacin UNION se procesa en primer lugar porque se encuentra entre parntesis y devuelve 5 filas, porque no se utiliza la opcin ALL y se quitan los duplicados. Estas 5 filas se mezclan con los resultados de la primera instruccin SELECT mediante las palabras clave UNION ALL, que no quitan los duplicados entre los dos conjuntos de 5 filas. El resultado final es de 10 filas.
USE Northwind GO IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'CustomersOne') DROP TABLE CustomersOne GO IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'CustomersTwo') DROP TABLE CustomersTwo GO IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'CustomersThree') DROP TABLE CustomersThree GO USE Northwind

Ing. Timoteo Caldern Letona

28

Diseo y gestin de base de datos

GO SELECT ContactName, CompanyName, City, Phone INTO CustomersOne FROM Customers WHERE Country = 'Mexico' GO SELECT ContactName, CompanyName, City, Phone INTO CustomersTwo FROM Customers WHERE Country = 'Mexico' GO SELECT ContactName, CompanyName, City, Phone INTO CustomersThree FROM Customers WHERE Country = 'Mexico' GO -- Union ALL SELECT ContactName FROM CustomersOne UNION ALL SELECT ContactName FROM CustomersTwo UNION ALL SELECT ContactName FROM CustomersThree GO USE Northwind GO SELECT ContactName FROM CustomersOne UNION SELECT ContactName FROM CustomersTwo UNION SELECT ContactName FROM CustomersThree GO USE Northwind GO SELECT ContactName FROM CustomersOne UNION ALL ( SELECT ContactName FROM CustomersTwo UNION SELECT ContactName FROM CustomersThree ) GO

Ing. Timoteo Caldern Letona

29

Potrebbero piacerti anche