Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
Total income is 7856.2500 Total income is 180397.2000 Total income is 61384.0500 (18 row(s) affected) C. Utilizar DISTINCT con SELECT
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)
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
(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.
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
(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
En este ejemplo se agrupa por una expresin. Puede agrupar por una expresin si sta no contiene funciones de agregado.
USE pubs SELECT AVG(ytd_sales), ytd_sales * royalty FROM titles GROUP BY ytd_sales * royalty ORDER BY ytd_sales * royalty
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
USE pubs SELECT type, AVG(price) FROM titles WHERE royalty = 10 GROUP BY all type ORDER BY type
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)
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
ORDER BY type
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
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
(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
FROM titles WHERE price > $10 AND type LIKE '%cook' ORDER BY type, price COMPUTE SUM(price) BY type
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
10
(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)
(2 row(s) affected) sum sum --------------------- --------------------22.9800 15000.0000 (1 row(s) affected) type price advance ------------ --------------------- ---------------------
11
(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)
(18 row(s) affected) sum sum --------------------- --------------------236.2600 95400.0000 (1 row(s) affected)
12
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
(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.
13
USE pubs -- Using COMPUTE SELECT type, price FROM titles WHERE type like '%cook' ORDER BY type, price COMPUTE SUM(price) BY type
(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
14
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)
15
--------------------- --------------------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
16
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.
17
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
18
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
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
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
20
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
21
Algodata Algodata Algodata Binnet & Binnet & ... NULL NULL NULL
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
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
------------------------------ -------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),
22
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
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)
23
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.
24
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.
------------ ------------------------------------ -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
25
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'
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
26
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
27
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
28
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
29