Unidad v Lenguaje SQL Parte i

download Unidad v Lenguaje SQL Parte i

of 23

Transcript of Unidad v Lenguaje SQL Parte i

Bases de Datos I UNIDAD V: LENGUAJES RELACIONALES PARTE I INTRODUCCION A SQL Comenzaremos el estudio de consultas simples a una Base de Datos, en estas consultas participar solamente una tabla. Para la realizacin de consultas se utiliza la sentencia SELECT, la cual recupera datos de una BD y los devuelve en forma de resultados de la consulta. Para consultas sencillas, la peticin en lenguaje ingls y la sentencia SELECT son muy similares. La sentencia SELECT tiene el siguiente formato:SELECT ALL DISTINCT FROM especificacin de tabla tem-seleccionado

, *

,WHERE condicin de bsqueda

GROUP BY

columna de agrupacin

,HAVING condicin de bsqueda

ORDER BY

especificacin de ordenacin

,

Como se puede apreciar la sentencia SELECT consiste de seis clusulas. Las clusulas SELECT y FROM necesarias, las otras cuatro son opcionales. Aunque lo veremos despus con ms detenimiento resumiremos el uso de cada una de las clusulas: La clusula SELECT lista los datos a recuperar por la sentencia. Los tems pueden ser columnas de la BD o columnas a calcular por SQL. La clusula FROM lista las tablas que contienen los datos a recuperar la consulta. La clusula WHERE dice a SQL que incluya slo ciertas filas de datos en los resultados de la consulta, precisamente los que satisfacen la condicin de bsqueda que se especifica.

Recopilado por: Ing. Claudia L. Benavidez Rugama

1

Bases de Datos I La clusula GROUP BY especifica una consulta resumen. Agrupa todas las filas similares y produce una fila resumen. La clusula HAVING dice a SQL que incluya slo ciertos grupos producidos por la clusula GROUP BY. La clusula ORDER BY ordena los resultados de las consultas sobre la base de los datos de una o ms columnas. Clusula SELECT La clusula SELECT que empieza cada sentencia SELECT especifica los tems de datos a recuperar por la consulta. Un tem puede ser: Un nombre de columna, identificando una columna de la tabla designada en la clusula FROM. Cuando un nombre de columna aparece en el SELECT, SQL simplemente toma el valor de esa columna de cada fila de la tabla de la BD. Una constante, especificando que el mismo valor constante va a aparecer en todas las filas de los resultados de la consulta. Una expresin SQL, indicado que SQL debe calcular el valor a colocar en los resultados.

-

Clusula FROM Especifica las tablas que intervienen en la consulta. Estas tablas se llaman tablas fuentes. Todas las consultas que veremos en esta clase tienen una nica tabla fuente. Resultados de consultas El resultado de una consulta SQL es siempre una tabla de datos, semejante a cualquier otra tabla. Si se trabaja con SQL interactivo ser una tabla que se muestra en la pantalla, si se trabaja desde un programa ser una tabla que de alguna manera ese programa deber manipular. Las columnas de la tabla corresponden a los items de la clusula SELECT. Es importante destacar que an cuando la consulta devuelva un valor, este considera una tabla de una fila y una columna. Consultas Sencillas Las consultas ms sencillas solicitan columnas de datos de una nica tabla en la BD. Generalmente la sentencia SELECT incluye slo las clusulas SELECT y FROM y conceptualmente SQL procesa la consulta recorriendo la tabla nominada en la clusula FROM, una fila cada vez. Por cada fila, SQL toma los valores de las columnas solicitadas en la lista de seleccin y produce una nica fila de resultados. Los resultados contienen por tanto una fila de datos por cada fila de la tabla.

Recopilado por: Ing. Claudia L. Benavidez Rugama

2

Bases de Datos I Ejemplo: Listar la ciudad, regin e importe de ventas de cada oficina SELECT ciudad, regin, ventas FROM oficinas Adems de las columnas cuyos valores provienen directamente de la BD una consulta SQL puede incluir columnas calculadas cuyos valores se calculan a partir de los valores de los datos almacenados. Para solicitar una columna calculada se especifica una expresin en la lista de seleccin. Ejemplo Listar la ciudad, la regin y el importe por encima o por debajo del objetivo para cada oficina. SELECT ciudad, region, ventas-objetivo FROM oficinas (Lo que se ha sealado en negritas constituye la columna calculada.) Listar el valor del inventario para cada producto. SELECT id_fab, id_producto, descripcion, precio*existencias FROM productos Listar las ventas de cada oficina SELECT oficina, tiene ventas de , ventas FROM oficinas (Los resultados de la consulta parecen consistir en una frase distinta por cada oficina, pero realmente es una tabla de 3 columnas. La segunda columna contiene la misma cadena de texto para cada una de las filas.) Seleccin de todas las columnas (SELECT *) A veces es conveniente visualizar el contenido de todas las columnas de una tabla. SQL permite utilizar un * en lugar de la lista de seleccin como abreviatura de todas las columnas. Mostrar todos los datos de la tabla OFICINAS SELECT * FROM oficinas

Recopilado por: Ing. Claudia L. Benavidez Rugama

3

Bases de Datos I Como se mostr en el diagrama sintctico SQL estndar prohbe el uso de * junto a una lista de tems. Hay dialectos (como SQL Server) que si lo permite y por lo tanto pudiera escribirse la siguiente consulta: SELECT *, ventas-objetivo FROM oficinas Filas duplicadas (DISTINCT) Si una consulta incluye la clave primaria de una tabla en su lista de seleccin entonces cada fila de resultados ser nica. Si no se incluye la clave primaria en los resultados pueden producirse filas duplicadas. Por ejemplo: Listar los nmeros de empleados de todos los directores de oficina: SELECT dir FROM oficinas Si un director dirige ms de una oficina su nmero saldra tantas veces como oficina dirija. Para evitar esta repeticin se inserta la palabra clave DISTINCT en la clusula SELECT justo antes de la lista de seleccin En nuestro caso queda la consulta de la siguiente manera: SELECT DISTINCT dir FROM oficinas SQL efecta esta consulta generando primero un conjunto completo de resultados y eliminando luego las filas que son duplicados exactos de alguna otra para formar los resultados finales. Si no se especifica la palabra clave DISTINCT, SQL no elimina las filas duplicadas. Tambin se puede especificar la palabra ALL para indicar explcitamente que las filas duplicadas sean incluidas, pero es innecesario, ya que este es el comportamiento por omisin. Observar que hasta este momento todas las operaciones que hemos realizado sobre las tablas corresponden a la operacin de proyeccin del lgebra relacional. Seleccin de filas (clusula WHERE) Las consultas SQL que recuperan todas las filas de una tabla no son frecuentes en las aplicaciones. Generalmente se desea seleccionar parte de las filas de una tabla.

Recopilado por: Ing. Claudia L. Benavidez Rugama

4

Bases de Datos I La clusula WHERE se emplea para especificar las filas que se desean recuperar. Esta clusula consta de la palabra clave WHERE seguida de una condicin de bsqueda que especifica las filas a recuperar. Dicha condicin en general es una expresin lgica Ejemplos: Muestra todas las oficinas en donde las ventas excedan al objetivo. SELECT ciudad, ventas, objetivo FROM oficinas WHERE ventas > objetivo Muestra el nombre, las ventas y la cuota del empleado nmero 105. SELECT nombre, ventas, cuota FROM vendedores WHERE num_empl=105 SQL recorre cada fila de la tabla, una a una, y aplica la condicin. Se pueden producir tres casos: - Si la condicin de bsqueda es TRUE (cierta), la fila en cuestin se incluye en los resultados de la consulta. - Si la condicin de bsqueda es FALSE (falsa), la fila se excluye de los resultados de la consulta. - Si la condicin de bsqueda tiene un valor NULL (desconocido), la fila se excluye de los resultados de la consulta. La condicin de bsqueda acta como un filtro para la tabla en cuestin. La clusula WHERE aade la operacin de seleccin del lgebra relacional. Condiciones de bsqueda SQL ofrece un conjunto de condiciones de bsqueda. Se pueden agrupar en cinco grupos (llamados predicados en el estndar). a) Test de comparacin Es la bsqueda ms utilizada, cuando se comparan los valores de dos expresiones. Se pueden utilizar los operadores =, =, Los ejemplos que vimos anteriormente son un ejemplo de este test. En el caso que alguna de las dos expresiones sea NULL la comparacin genera un valor NULL. Observe que si es la nica expresin en la clusula WHERE esa fila no se incluir en el resultado.

Recopilado por: Ing. Claudia L. Benavidez Rugama

5

Bases de Datos I b) Test de Rango Comprueba si un valor de dato se encuentra entre dos valores especificados. Su diagrama sintctico es el siguiente:expresin de test NOT BETWEEN exp-inf. AND exp-sup

La primera expresin define el valor a comprobar, las expresiones segunda y tercera definen los extremos inferior y superior del rango a comprobar. Los tipos de datos de las tres expresiones deben ser comparables. Ejemplo: Listar los pedidos que se hayan hecho entre el 01-Oct-89 y en 31-Dic-89. SELECT num_pedido, fecha_pedido, fab, producto, importe FROM pedidos WHERE fecha_pedido BETWEEN 01-10-89 AND 31-12-89 El test incluye los puntos extremos del rango, por lo que los pedidos remitidos el 1 de octubre o el 31 de diciembre se incluirn en los resultados de la consulta. Listar los pedidos cuyo importe est entre 20000 y 30000 SELECT num_pedido, importe FROM pedidos WHERE importe BETWEEN 20000 AND 30000 Listar los vendedores cuyas ventas no estn entre el 80 y el 120 por ciento de su cuota. SELECT nombre, ventas, cuota FROM vendedores WHERE ventas NOT BETWEEN (0.8*cuota) AND (1.2*cuota) Las expresiones especificadas en el test de rango pueden ser cualquier expresin SQL vlida. Se imponen las siguientes reglas para el manejo de los valores nulos. Si la expresin de test produce un valor NULL, o si ambas expresiones del rango producen valores NULL, el test BETWEEN devuelve un resultado NULL. Si la expresin que define el extremo inferior del rango produce un valor NULL, el test BETWEEN devuelve FALSE si el valor de test es superior al lmite superior, y NULL en caso contrario.

Recopilado por: Ing. Claudia L. Benavidez Rugama

6

Bases de Datos I Si la expresin que define el extremo superior del rango produce un valor NULL, el test BETWEEN devuelve FALSE si el valor de test es menor que el lmite inferior, y NULL en caso contrario.

c)Test de pertenencia a conjunto Una prueba tpica de consultas es determinar si un valor de dato coincide con uno de una lista de valores objetivo. A este tipo de test se le llama test de pertenencia a conjunto y su diagrama sintctico se puede ver a continuacin:expresin de test NOT IN ( constante

)

,

Ejemplos: Listar los vendedores que trabajan en las oficinas 11, 13 y 22. SELECT nombre, cuota, ventas FROM vendedores WHERE oficina_vend IN (11, 13, 22) Listar todos los pedidos remitidos un jueves en enero de 1990 SELECT num_pedido, fecha_pedido, importe FROM pedidos WHERE fecha_pedido IN (04-01-90, 11-01-99, 18-01-99, 25-0199) La expresin del test puede ser una expresin cualquiera. Todos los elementos de la lista deben tener el mismo tipo de datos, y este debe coincidir con el tipo de la expresin. Si la expresin produce NULL, el test devuelve NULL. Test de correspondencia con patrn El test de correspondencia con patrn es utilizado para recuperar datos sobre la base de una correspondencia parcial con los valores almacenados en la BD. Su diagrama sintctico se muestra a continuacin:

Recopilado por: Ing. Claudia L. Benavidez Rugama

7

Bases de Datos I

nombre de columna NOT

LIKE

patrn ESCAPE carcter escape

El test de correspondencia con patrn comprueba si el valor de dato de una columna se ajusta a un patrn especificado. El patrn es una cadena que puede incluir uno o ms caracteres comodines. Estos caracteres se interpretan de una manera especial. Caracteres comodines: % - Se interpreta como una secuencia de cero o ms caracteres. (Equivalente al * del MS-DOS) _ - Se interpreta como un carcter. (Equivalente al ? de MS-DOS) Ejemplos: SELECT empresa, lim_credito FROM clientes WHERE empresa LIKE Smith% Corp. Se busca en la tabla clientes aquellos cuyo nombre comience por Smith, luego tengan una secuencia de caracteres y terminen en Corp. SELECT empresa, lim_credito FROM clientes WHERE empresa LIKE Smiths_n Corp. Esta consulta busca en la tabla clientes aquellos cuyos nombres comienzan con Smiths, tiene un carcter luego y despus n Corp. El test LIKE debe aplicarse a columnas con tipo de dato cadenas. Si el valor de dato en la columna es NULL, el test devuelve el valor NULL. La clusula ESCAPE se utiliza cuando se quiere utilizar uno de los comodines en el marco de la cadena que se quiere comparar. Por ejemplo si se quiere encontrar los productos cuyos identificadores comiencen con A%BC. Si escribimos LIKE A%BC, el % se interpretara como un comodn. Se utiliza entonces un carcter llamado escape, cuando el se encuentra en la cadena el carcter que le sigue no se trata como comodn. Nuestro ejemplo quedara: SELECT num_pedido, producto FROM pedidos WHERE producto LIKE A$%BC% ESCAPE $

Recopilado por: Ing. Claudia L. Benavidez Rugama

8

Bases de Datos I El primer signo de por ciento en el patrn, que sigue al carcter de escape, es tratado como un literal no como un comodn, el segundo, sin embargo, funciona como comodn. Observar que el carcter de escape se puede elegir en cada instruccin de forma distinta. Test de valor nulo A veces es til comprobar explcitamente los valores nulos en una condicin de bsqueda y gestionarlos directamente. SQL proporciona un test especial de valor nulo (NULL), cuyo diagrama sintctico se muestra a continuacin.nombre de columna IS NOT NULL

Hallar el vendedor que an no tiene asignada una oficina SELECT nombres FROM vededores WHERE oficina_vend IS NULL A diferencia de otros test este nunca producir un valor NULL. Condiciones de bsqueda compuestas (and, or y not) Las condiciones de bsqueda simples, descritas anteriormente devuelven un valor TRUE, FALSE o NULL cuando se aplican a una fila de datos. Utilizando las reglas de la lgica se pueden combinar estas condiciones de bsquedas simples para formar otras ms complejas. El diagrama sintctico se muestra a continuacinWHERE NO T AND OR condicin de bsqueda

Ejemplo: Hallar los vendedores que estn por debajo de la cuota o con ventas inferiores a 30000. SELECT nombre, cuota, ventas FROM vendedores WHERE (ventas < cuota) OR (ventas < 30000)

Recopilado por: Ing. Claudia L. Benavidez Rugama

9

Bases de Datos I Los parntesis en este caso son opcionales, solo se han puesto para claridad de la expresin. El estndar especifica que estos operadores tienen la siguiente prioridad: NOT, AND y OR. Las tablas de verdad, incluyendo los valores nulos, se muestran en las siguientes tablas: NOT TRUE FALSE FALSE TRUE NULL NULL AND TRUE FALSE NULL OR TRUE FALSE NULL TRUE TRUE FALSE NULL TRUE TRUE TRUE TRUE FALSE FALSE FALSE NULL FALSE TRUE FALSE NULL NULL NULL NULL NULL NULL TRUE NULL NULL

Las posiciones que estn en negritas seran las operaciones donde participan valores nulos. Ordenacin de los resultados de una consulta Al igual que las filas de una tabla en la BD, las filas de los resultados de una consulta no estn dispuestos en ningn orden particular. Se puede pedir a SQL que ordene los resultados de una consulta incluyendo la clusula ORDER BY en la sentencia SELECT. La clusula ORDER BY posee la siguiente sintaxis: Observar que en el ordenamiento solamente se pueden especificar las columnas de la clusula SELECT.ORDER BY nombre de columna nmero de columna ASC DESC

,

Recopilado por: Ing. Claudia L. Benavidez Rugama

10

Bases de Datos I Mostrar las ventas de cada oficina, ordenadas en orden alfabtico por ciudad. SELECT ciudad, ventas FROM oficinas ORDER BY ciudad Como se observa en la sintaxis en un mismo ORDER BY pueden haber varios criterios de ordenamiento. Mostrar las ventas de cada oficina, ordenadas en orden alfabtico por regin y dentro de cada regin por ciudad. SELECT ciudad, regin, ventas FROM oficinas ORDER BY regin, ciudad Utilizando la clusula ORDER BY se puede solicitar la ordenacin en secuencia ascendente o descendente, y se puede ordenar con respecto a cualquier elemento en la lista de seleccin de la consulta. Por omisin, SQL ordena los datos en secuencia ascendente. Para solicitar en secuencia descendente, se incluye la palabra clave DESC en la especificacin de ordenacin, como en el siguiente ejemplo: Listar las oficinas, clasificadas en orden descendente de ventas, de modo que las oficinas con mayores ventas aparezcan en primer lugar. SELECT ciudad, region, ventas FROM oficinas ORDER BY ventas DESC Se puede utilizar la palabra clave ASC para especificar el orden ascendente, pero puesto que este es el orden por omisin, la palabra clave se suele omitir. Si la columna de resultados de la consulta utilizada para ordenar es una columna calculada, entonces se utiliza en lugar de un nombre el nmero que ocupa dentro de la clusula SELECT.

Recopilado por: Ing. Claudia L. Benavidez Rugama

11

Bases de Datos I Ejemplo: Listar las oficinas, clasificadas en orden descendente de rendimiento de ventas, el rendimiento de ventas es las ventas menos el objetivo. SELECT ciudad, regin, (ventas-objetivo) FROM oficinas ORDER BY 3 DESC Observar que los resultados estarn ordenados por la tercera columna, que es una columna calculada. Resumen parcial del modo de realizar una consulta: 1. Comenzar con la tabla designada en la clusula FROM. 2. Si hay clusula WHERE, aplicar su condicin de bsqueda a cada fila de la tabla, reteniendo aquellas filas para las cuales la condicin de bsqueda es TRUE, y descartando aquellas para las cuales es FALSE o NULL. 3. Para cada fila retenida, calcular el valor de cada elemento en la lista de seleccin para producir una nica fila de resultados. 4. Si se especifica SELECT DISTINCT, eliminar las filas duplicadas de los resultados que se hubieran producido. 5. Si hay una clusula ORDER BY, ordenar los resultados de la consulta segn se especifiquen. Combinacin de los resultados de una consulta Ocasionalmente, es conveniente combinar los resultados de dos o ms consultas en una nica tabla de resultados totales. SQL permite esta capacidad gracias a la caracterstica UNION. UNION es un operador que toma el resultado de dos consultas y los une en un nico resultado (acta de forma similar a la unin entre conjuntos). Ejemplo: Listar todos los productos en donde el precio del producto exceda de 2000 donde ms de 30000 del producto hayan sido incluidos en un solo pedido. Dividiremos esta consulta en dos partes: Listar todo los productos cuyo precio exceda de 2000. SELECT id_fab, id_producto FROM productos WHERE precio > 2000

Recopilado por: Ing. Claudia L. Benavidez Rugama

12

Bases de Datos I Listar los productos para los cuales ms de 30000 del producto hayan sido incluidos en un solo pedido. SELECT DISTINCT fab, producto FROM pedido WHERE importe > 30000 Como queremos los productos que satisfacen estos dos requerimientos, debemos tomar los resultados de las dos consultas: SELECT id_fab, id_producto FROM productos WHERE precio > 2000 UNION SELECT DISTINCT fab, producto FROM pedido WHERE importe > 30000 Hay varias restricciones sobre las tablas que pueden combinarse con una operacin UNION: a) Ambas tablas deben contener el mismo nmero de columnas. b) El tipo de datos de cada columna en la primera tabla debe ser el mismo que el tipo de datos de la columna correspondiente en la segunda tabla. c) Ninguna de las dos tablas puede estar ordenada con la clusula ORDER BY. Sin embargo, los resultados combinados pueden ser ordenados, segn se describe despus. Ya que la operacin UNION combina filas de dos conjuntos de resultados, pudiera suceder que los resultados tuvieran filas iguales. (Un caso es el ejemplo anterior, ver los resultados). Por omisin, la operacin UNION elimina las filas duplicadas como parte de su procesamiento. Si se desea obtener las filas duplicadas en una operacin UNION, se puede especificar la palabra clave ALL inmediatamente de la palabra UNION. La clusula ORDER BY no puede ser especificada en ninguna de las dos sentencias SELECT que combina una UNION. Sin embargo el conjunto combinado de resultados de la consulta producidos por la operacin UNION puede ser ordenado especificando una clusula ORDER BY despus de la segunda sentencia SELECT. Ya que las columnas producidas por la operacin UNION no tienen nombres, la clusula ORDER BY debe especificar las columnas por nmero. Listar todos los productos en donde el precio del producto exceda de 2000 donde ms de 30000 del producto hayan sido incluidos en un solo pedido, clasificados por fabricante y el identificador del producto..

Recopilado por: Ing. Claudia L. Benavidez Rugama

13

Bases de Datos I SELECT id_fab, id_producto FROM productos WHERE precio > 2000 UNION SELECT DISTINCT fab, producto FROM pedido WHERE importe > 30000 ORDER BY 1,2 La operacin UNION puede ser utilizada repetidamente para combinar tres o ms conjuntos de resultados, tal como se muestra en la figura siguiente: Tabla aBill

Tabla bBill Sue Julia Harry

ResultadosBill Mary

Mary George Fred

UNIONBill

George Fred Sue Julia Harry

Tabla cMary George Bill Harry

UNION

Sue Julia Harry Mary George

La consulta se escribira de la siguiente forma: SELECT * FROM a UNION ( SELECT * FROM b UNION SELECT * FROM c ) Los parntesis indican el orden en que deben ser realizadas las uniones. En este caso como todas las uniones eliminan duplicados no importa el orden. Hay que tener mucho cuidado con el orden cuando una de las operaciones UNION tiene el ALL.

Recopilado por: Ing. Claudia L. Benavidez Rugama

14

Bases de Datos I Funciones de Columna SQL permite resumir datos de la BD mediante un conjunto de funciones de columnas. Una funcin de columna acepta una columna entera de datos como argumento y produce un nico dato que resume la columna. Por ejemplo, la funcin AVG( ) acepta una columnas de datos y calcula su promedio. Cul es la cuota promedio y las ventas promedio de los vendedores? SELECT AVG(cuota), AVG(ventas) FROM vendedores SQL ofrece seis funciones de columna diferentes, tal como se muestra en el siguiente diagrama sintctico. Las funciones de columna ofrecen estos valores: SUM ( ) calcula la suma total de una columna. AVG( ) calcula el valor promedio de una columna. MAX( ) calcula el valor ms grande de la columna. MIN( ) calcula el valor ms pequeo de la columna. COUNT( ) cuenta el nmero de valores de una columna. COUNT(*) cuenta las filas de una consulta. SUM ( expresin DISTINCT nombre columna AVG ( expresin DISTINCT nombre columna MIN ( expresin ) MAX ( expresin ) COUNT ( DISTINCT COUNT ( * ) El argumento de una funcin columna, como se pude apreciar en el diagrama sintctico puede ser una expresin SQL. nombre de columna )

)

)

Recopilado por: Ing. Claudia L. Benavidez Rugama

15

Bases de Datos I Cul es el promedio del por ciento de cumplimiento de los vendedores? SELECT AVG(100*(ventas/cuota)) FROM vendedores Para procesar esta consulta SQL construye una columna temporal que contiene el valor de la expresin por cada fila de la tabla, luego calcula el promedio de la columna temporal. Ejemplos: Cules son las cuotas y ventas totales para todos los vendedores? SELECT SUM(cuota), SUM(ventas) FROM vendedores Cul es el precio promedio de los productos del fabricante ACI? SELECT AVG(precio) FROM productos WHERE id_fab=ACI Cules son las cuotas mnima y mxima asignadas a los vendedores? SELECT MIN(cuota), MAX(cuota) FROM vendedores Cuntos vendedores superan su cuota? SELECT COUNT(nombre) FROM vendedores WHERE ventas>cuotas SELECT COUNT(*) FROM vendedores WHERE ventas>cuotas Con la segunda consulta se cuentan filas en lugar de nombres como en la primera, lo que parece ms natural. Valores nulos y funciones de columna En las funciones de columna SUM( ), AVG( ), MIN( ), MAX( ) y COUNT( ) los valores nulos son ignorados.

Recopilado por: Ing. Claudia L. Benavidez Rugama

16

Bases de Datos I La siguiente consulta: SELECT COUNT(*), COUNT(ventas), COUNT(cuota) FROM vendedores arrojar los valores 10, 10 y 9, porque hay un vendedor con cuota nula. Ignorar los nulos tiene poca importancia en las funciones MAX y MIN, pero puede producir algunas sutilezas en las funciones SUM y AVG. Por ejemplo la consulta: SELECT SUM(ventas)-SUM(cuota), SUM(ventas-cuota) FROM vendedores Parece que debe dar dos valores similares, sin embargo en nuestro ejemplo produce resultados diferentes pues hay un vendedor que tiene un valor nulo en su cuota, por lo tanto es ignorado en SUM(cuota) y en SUM(ventas-cuota), no as el valor correspondiente de sus ventas que no es nulo. Eliminacin de filas duplicadas Al igual que se eliminaban las filas duplicadas en una consulta se pueden eliminar los valores duplicados de una columna antes de aplicarle una funcin de columna. Para ello se utiliza la palabra clave DISTINCT en el argumento de la funcin como se indica en el diagrama sintctico. Cuntos ttulos diferentes tienen los vendedores? SELECT COUNT(DISTINCT titulo) FROM vendedores Ejercicios: Desarrollar las siguientes consultas haciendo uso de las clausulas estudiadas de SQL Server y entregarlo en un reporte. 1. Listar las oficinas de ventas con sus objetivos y ventas reales. 2. Listar las oficinas de ventas de la regin Este con sus objetivos y ventas. 3. Listar las oficinas de ventas de la regin Este cuyas ventas exceden a sus objetivos. 4. Listar los nombres, oficinas y fechas de contrato de todos los vendedores. 5. Cul es el nombre, cuota y ventas del empleado nmero 107? 6. Listar el nombre y fecha de contrato de cualquier vendedor cuyas ventas sean superiores a 500 000. 7. Listar todos los nombres de los vendedores, sus cuotas y directores. 8. Mostrar que suceder si se eleva la cuota de cada vendedor en un 3% de sus ventas anuales 9. Muestra los empleados dirigidos por Bob Smith (empleado 104). 10. Halla los vendedores contratados antes de 1988.Recopilado por: Ing. Claudia L. Benavidez Rugama

17

Bases de Datos I 11. Listar las oficinas cuyas ventas estn por debajo del 80% del objetivo. 12. Cul es el nombre y el lmite de crdito del cliente nmero 2107? 13. Listar los pedidos cuyos importes estn entre 30000 y 40000. 14. Listar los pedidos obtenidos por los vendedores 107, 109, 101 y 103. 15. Listar todos lo vendedores cuyos nombres comience con B. 16. Listar todos los productos del fabricante QSA cuyo identificador comience por XK. 17. Listar los vendedores a los que se ha asignado oficina. 18. Hallar todos los vendedores que estn pro debajo de la cuota, pero cuyas ventas no son inferiores a 150000. 19. Listar los productos ordenados por su precio. 20. Listar los productos ordenador por su fabricante y dentro de estos por su cdigo. 21. Listar los vendedores en orden decreciente de su edad, dentro de la edad ordenarlos por el nombre. 22. Listar los productos ordenados por el valor de su inventario. 23. Listar los vendedores que atienden a algn cliente o que han tomado algn pedido. 24. Cul es el total de los pedidos aceptados por el vendedor 107? 25. Cul es la fecha de pedido ms antigua en la base de datos? 26. Cul es el mejor promedio de ventas entre todos los vendedores? 27. Cuntos clientes hay? 28. Cuntos pedidos de ms de 25000 hay en los registros? 29. Cuntas oficinas de ventas tienen vendedores que superan sus cuotas? 30. Cul es el promedio de los objetivos de las oficinas del Este? 31. Cul es el lmite de crdito ms pequeo entre los clientes? 32. Cul es el total de ventas de los vendedores que son Dir Ventas? 33. Cuntos vendedores han tomado algn pedido?

CONSULTAS AGRUPADAS En muchas ocasiones necesitamos obtener consultas con subtotales, cada uno de estos subtotales son grupos que formamos a partir de nuestra tabla. En la clase anterior hicimos consultas como la siguiente: Cul es el importe medio de los pedidos? SELECT AVG(importe) FROM pedidos Ahora supongamos que deseamos el importe medio de los pedidos aceptados por cada uno de los vendedores. Aqu tendramos que agrupar la tabla pedidos segn los vendedores que tomaron los pedidos y sacar el promedio de cada uno de los grupos.

Recopilado por: Ing. Claudia L. Benavidez Rugama

18

Bases de Datos I Para realizar tal consulta se utiliza la clusula GROUP BY que segn vimos en la sintaxis general del SELECT tiene el siguiente diagrama sintctico:GROUP BY

columna de agrupacin ,

Para nuestro caso la consultara quedara: SELECT vend, AVG(importe) FROM pedidos GROUP BY vend Esta consulta se lleva a cabo de la siguiente manera: 1. SQL divide los pedidos en grupos de pedidos, un grupo para cada vendedor como se especifica en la clusula GROUP BY, todos los pedidos de un grupo tienen el mismo valor en columna vend. 2. Por cada grupo, SQL calcula el valor promedio de la columna importe para todas las filas del grupo y genera una nica fila resumen de resultados. La fila contiene el valor de la columna vend del grupo y el importe medio calculado. Una consulta que contenga la clusula GROUP BY se denomina consulta agrupada. Las columnas indicadas en la clusula se llaman columnas de agrupacin. Ejemplos: Cul es el rango de cuotas asignadas a cada oficina? SELECT oficina_vend, MIN(cuota), MAX(cuota) FROM vendedores GROUP BY oficina_vend Cuntos vendedores estn asignados a cada oficina? SELECT oficina_vend, COUNT(*) FROM vendedores GROUP BY oficina_rep Hay una estrecha conexin entre las funciones de columna de SQL y la clusula GROUP BY. Cuando esta clusula est presente indica a SQL que debe agrupar las filas y aplicar la funcin de columna separadamente a cada grupo, produciendo un nico resultado por el grupo.

Recopilado por: Ing. Claudia L. Benavidez Rugama

19

Bases de Datos I Mltiples columnas de agrupacin Segn se puede ver en la sintaxis, SQL puede agrupar las filas basndose en contenidos de dos ms columnas.

Calcula los pedidos totales por cada cliente y por cada vendedor. SELECT vend, clie, SUM(importe) FROM pedidos GROUP BY vend, clie La consulta produce una fila resumen separada por cada pareja vendedor / cliente. Es imposible crear grupos y subgrupos con dos niveles de subtotales en SQL estndar. Es tambin imposible obtener resultados a la vez detallados y resumen en una consulta simple. En algunos dialectos como SQL Server se suple esta limitacin del SQL aadiendo una clusula COMPUTE al final de la sentencia SELECT, por ejemplo: Calcula los pedidos totales para cada cliente de cada vendedor, ordenados por vendedor, y dentro de cada vendedor por cliente. SELECT vend, clie, importe FROM pedidos ORDER BY vend, clie COMPUTE SUM(importe) BY vend, clie COMPUTE SUM(importe), AVG(importe) BY vend Esta consulta produce una fila de resultados detallados por cada fila de la tabla Pedidos, ordenados por clie dentro de vend. Adems calcula la suma de los pedidos por cada pareja cliente / vendedor (un subtotal de bajo nivel) y calcula la suma de pedidos y el tamao medio de pedido por cada vendedor (un subtotal de alto nivel). Los resultados tienen por tanto una mezcla de filas de detalles y de filas resumen, que incluyen tanto subtotales como totales. Al final de estas notas se brindan los resultados parciales de esta consulta. Esta clusula COMPUTE no es estndar en lo absoluto y segn muchos autores viola los principios bsicos de las consultas relacionales, pues el resultado no es una tabla, sino una extraa combinacin de diferentes tipos de filas. No obstante puede ser til en algunos casos.

Recopilado por: Ing. Claudia L. Benavidez Rugama

20

Bases de Datos I Restricciones en consultas agrupadas Las consultas agrupadas estn sujetas a algunas limitaciones bastantes estrictas: Las columnas de agrupacin deben ser columnas efectivas de las tablas designadas en la clusula FROM, no se pueden agrupar las filas basndose en el valor de una expresin calculada. Los elementos de seleccin en una consulta agrupada pueden ser: o Una constante. o Una funcin de columna, que produce un nico valor que resume las filas del grupo. o Una columna de agrupacin, que por definicin tiene el mismo valor en todas las filas del grupo. o Una expresin que afecte a combinaciones de los anteriores.

-

Valores NULOS en columnas de agrupacin Un valor NULL presenta un problema especial cuando aparece en una columna de agrupacin. Si el valor de la columna es desconocido, en qu grupo debera colocarse la fila? El estndar de SQL considera que dos valores NULL son iguales a efectos de la clusula GROUP BY. Si dos filas tiene NULL en las mismas columnas de agrupacin y valores idnticos en las columnas de agrupacin no NULL, se agrupan dentro del mismo grupo de filas. Veremos un ejemplo con una pequea tabla de muestra: Nombre Rosa Luisa Juan Sandra Juana Jorge Mara Paula Carlos Yoel Susana Mariana Pelo Castao NULL NULL NULL NULL Castao Castao Castao Castao Castao Rubio Rubio Ojos Azules Azules Azules NULL NULL NULL NULL NULL NULL Negros Azules Azules

SELECT pelo, ojos, COUNT(*) FROM ejemplo GROUP BY pelo, ojos

Recopilado por: Ing. Claudia L. Benavidez Rugama

21

Bases de Datos I Se obtiene como resultado de esta consulta la siguiente tabla: PELO -------Castao NULL NULL Castao Castao Rubio OJOS --------Azules Azules NULL NULL Negros Azules COUNT(*) -------------1 2 2 4 1 2

Observar el comportamiento del NULL con los diferentes valores y los grupos que se forman. Es importante que en los dialectos no siempre se siguen las mismas reglas (aunque stas que hemos especificado son las del estndar), por lo que es importante con ejemplos pequeos probar antes de decidir hacer aplicaciones importantes. Condiciones de bsqueda de grupos Al igual que la clusula WHERE puede ser utilizada para seleccionar y rechazar filas individuales que participan en una consulta, la clusula HAVING puede ser utilizada para seleccionar y rechazar grupos de filas. El formato de HAVING es similar al de WHERE, lo nico que la condicin de bsqueda funciona para los grupos. Ejemplo: Cul es el tamao de pedido promedio para cada vendedor cuyos pedidos totalizan ms de 30000? SELECT vend, AVG(importe) FROM pedidos GROUP BY vend HAVING SUM(importe) > 30000 Aqu la clusula GROUP BY dispone de los pedidos en grupos por cada vendedor. Entonces la clusula HAVING toma solamente los grupos en donde el total de los pedidos exceden de 30000, finalmente la clusula SELCT calcule el tamao de pedido medio para cada uno de los grupos que qued y genera los resultados de la consulta. Las condiciones de bsqueda de la clusula HAVING son las mismas que las estudiadas para la clusula WHERE.

Recopilado por: Ing. Claudia L. Benavidez Rugama

22

Bases de Datos I Para cada oficina con dos o ms vendedores calcular la cuota total y las ventas totales de los vendedores que trabajan en ella. SELECT oficina_vend, SUM(cuota), SUM(ventas) FROM vendedores GROUP BY oficina_vend HAVING COUNT(*) >= 2 Restricciones en condiciones de bsqueda de grupos Un elemento que aparezca dentro de la condicin de bsqueda en una clusula HAVING puede ser: - Una constante. - Una funcin de columna, que produzca un nico valor resumen de las filas del grupo. - Una columna de agrupacin, que por definicin tiene el mismo valor para todas las filas del grupo. - Una expresin que afecte a combinaciones de las anteriores. Valores nulos y condiciones de bsqueda de grupos La clusula HAVING puede producir uno de los tres resultados siguientes: Si la condicin de bsqueda es TRUE, se retiene el grupo de filas. Si la condicin de bsqueda es FALSE, el grupo de filas se descarta. Si la condicin de bsqueda es NULL, el grupo de filas se descarta. La clusula HAVING se utiliza casi siempre en conjunto con la clusula GROUP BY, pero la sintaxis no lo precisa. Si una clusula HAVING aparece sin una clusula GROUP BY, SQL considera el conjunto entero de resultados como un nico grupo. Y por lo tanto la clusula HAVING determina si este grupo se incluye o no. El uso de una clusula HAVING sin una clusula GROUP BY correspondiente nuca se ve en la prctica. Ejercicios: Desarrollar las siguientes consultas haciendo uso de las clausulas de SQL Server. 1. Obtener para cada vendedor cual es promedio de lmite de crdito de sus clientes. 2. Obtener el importe total para cada producto solicitado en pedidos. 3. Obtener el importe total de pedidos solicitados por cada uno de los clientes. 4. Cuntas oficinas hay en cada una de las ciudades? 5. Determinar la cantidad de productos pedidos por cada cliente con importe de pedidos mayor que 50000.

Recopilado por: Ing. Claudia L. Benavidez Rugama

23