Вы находитесь на странице: 1из 26

Unidades Tecnolgicas de Santander.

Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

PRCTICA ORACLE)
OBJETIVO

07

(Base

de

Datos

Relacional

Realizacin de Consultas resumen o de agrupacin. Las consultas de resumen (I) En ORACLE y de la mayora de los motores de bases de datos relacionales, podemos definir un tipo de consultas cuyas filas resultantes son un resumen de las filas de la tabla origen, por eso las denominamos consultas de resumen, tambin se conocen como consultas sumarias. Es importante entender que las filas del resultado de una consulta de resumen tienen una naturaleza distinta a las filas de las dems tablas resultantes de consultas, ya que corresponden a varias filas de la tabla orgen. Para simplificar, veamos el caso de una consulta basada en una sola tabla, una fila de una consulta 'no resumen' corresponde a una fila de la tabla origen, contiene datos que se encuentran en una sola fila del origen, mientras que una fila de una consulta de resumen corresponde a un resumen de varias filas de la tabla origen, esta diferencia es lo que va a originar una serie de restricciones que sufren las consultas de resumen y que veremos a lo largo del tema. En el ejemplo que viene a continuacin tienes un ejemplo de consulta normal en la que se visualizan las filas de la tabla oficinas ordenadas por region, en este caso cada fila del resultado se corresponde con una sola fila de la tabla oficinas, mientras que la segunda consulta es una consulta resumen, cada fila del resultado se corresponde con una o varias

Las consultas de resumen introducen dos nuevas clusulas a la sentencia SELECT, la clusula GROUP BY y la clusula HAVING, son clusulas que slo se pueden utilizar en una consulta de resumen, se tienen que escribir entre la clusula WHERE y la clusula ORDER BY y tienen la siguiente sintaxis:

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

Las detallaremos en la pgina siguiente del tema, primero vamos a introducir otro concepto relacionado con las consultas de resumen, las funciones de columna. Funciones de columna En la lista de seleccin de una consulta de resumen aparecen funciones de columna tambin denominadas funciones de dominio agregadas. Una funcin de columna se aplica a una columna y obtiene un valor que resume el contenido de la columna. Tenemos las siguientes funciones de columna:

El argumento de la funcin indica con qu valores se tiene que operar, por eso expresin suele ser un nombre de columna, columna que contiene los valores a resumir, pero tambin puede ser cualquier expresin vlida que devuelva una lista de valores. La funcin SUM() calcula la suma de los valores indicados en el argumento. Los datos que se suman deben ser de tipo numrico (entero, decimal, coma flotante o monetario...). El resultado ser del mismo tipo aunque puede tener una precisin mayor. Ejemplo: SELECT SUM(ventas) FROM oficinas Obtiene una sola fila con el resultado de sumar todos los valores de la columna ventas de la tabla oficinas. La funcin AVG() calcula el promedio (la media arimtica) de los valores indicados en el argumento, tambin se aplica a datos numricos, y en este caso el tipo de dato del resultado puede cambiar segn las necesidades del sistema para representar el valor del resultado.

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. StDev() y StDevP() calculan la desviacin estndar de una poblacin o de una muestra de la poblacin representada por los valores contenidos en la columna indicada en el argumento. Si la consulta base (el origen) tiene menos de dos registros, el resultado es nulo. Es interesante destacar que el valor nulo no equivale al valor 0, las funciones de columna no consideran los valores nulos mientras que consideran el valor 0 como un valor, por lo tanto en las funciones AVG(), STDEV(), STDEVP() los resultados no sern los mismos con valores 0 que con valores nulos. Vemoslo con un ejemplo: Si tenemos esta tabla:

La consulta SELECT AVG(col1) AS media FROM tabla1 Devuelve:

En este caso los (10+5+0+3+6+0)/6 = 4 Con esta otra tabla:

ceros

entran

en

la

media

por

lo

que

sale

igual

SELECT AVG(col1) AS media FROM tabla2 Devuelve:

En este caso los ceros se han sustituido por valores nulos y no entran en el clculo por lo que la media sale igual a6 (10+5+3+6)/4 = 6

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Las funciones MIN() y MAX() determinan los valores menores y mayores respectivamente. Los valores de la columna pueden ser de tipo numrico, texto o fecha. El resultado de la funcin tendr el mismo tipo de dato que la columna. Si la columna es de tipo numrico MIN() devuelve el valor menor contenido en la columna, si la columna es de tipo texto MIN() devuelve el primer valor en orden alfabtico, y si la columna es de tipo fecha, MIN() devuelve la fecha ms antigua y MAX() la fecha ms reciente. La funcin COUNT(nb columna) cuenta el nmero de valores que hay en la columna, los datos de la columna pueden ser de cualquier tipo, y la funcin siempre devuelve un nmero entero. Si la columna contiene valores nulos esos valores no se cuentan, si en la columna aparece un valor repetido, lo cuenta varias veces. COUNT(*) permite contar filas en vez de valores. Si la columna no contiene ningn valor nulo, COUNT(nbcolumna) y COUNT(*) devuelven el mismo resultado, mientras que si hay valores nulos en la columna, COUNT(*) cuenta tambin esos valores mientras que COUNT(nb columna) no los cuenta. Ejemplo: Cuntos empleados tenemos? SELECT COUNT(numemp) FROM empleados o bien SELECT COUNT(*) FROM empleados En este caso las dos sentencias devuelen el mismo resultado ya que la columna numemp no contiene valores nulos (es la clave principal de la tabla empleados). Cuntos empleados tienen una oficina asignada? SELECT COUNT(oficina) FROM empleados Esta sentencia por el contrario, nos devuelve el nmero de valores no nulos que se encuentran en la columna oficina de la tabla empleados, por lo tanto nos dice cuntos empleados tienen una oficina asignada. Se pueden combinar varias funciones de columna en una expresin pero no se pueden anidar funciones de columna, es decir: SELECT (AVG(ventas) * 3) + SUM(cuota) FROM ... es correcto SELECT AVG(SUM(ventas)) FROM ... NO es correcto, no se puede incluir una funcin de columna dentro de una funcin de columna Seleccin en el origen de datos. Si queremos eliminar del origen de datos algunas filas, basta incluir la clusula WHERE que ya conocemos despus de la clusula FROM. Ejemplo: Queremos saber el acumulado de ventas de los empleados de la oficina 12.

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


SELECT SUM(ventas) FROM empleados WHERE oficina = 12 Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

Las consultas de resumen ( La clusula GROUP BY

Hasta ahora las consultas de resumen que hemos visto utilizan todas las filas de la tabla y producen una nica fila resultado. Se pueden obtener subtotales con la clusula GROUP BY. Una consulta con una clusula GROUP BY se denomina consulta agrupada ya que agrupa los datos de la tabla origen y produce una nica fila resumen por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupacin. Ejemplo: SELECT SUM(ventas) FROM repventas Obtiene la suma de las ventas de todos los empleados. SELECT SUM(ventas) FROM repventas GROUP BY oficina Se forma un grupo para cada oficina, con las filas de la oficina, y la suma se calcula sobre las filas de cada grupo. El ejemplo anterior obtiene una lista con la suma de las ventas de los empleados de cada oficina. La consulta quedara mejor incluyendo en la lista de seleccin la oficina para saber a qu oficina corresponde la suma de ventas: SELECT oficina,SUM(ventas) FROM repventas GROUP BY oficina Un columna de agrupacin no puede ser de tipo memo u OLE. La columna de agrupacin se puede indicar mediante un nombre de columna o cualquier expresin vlida basada en una columna pero no se pueden utilizar los alias de campo. Ejemplo: SELECT importe/cant , SUM(importe) FROM pedidos GROUP BY importe/cant Est permitido, equivaldra a agrupar las lneas de pedido por precio unitario y sacar de cada precio unitario el importe total vendido.

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. SELECT importe/cant AS precio, SUM(importe) FROM pedidos GROUP BY precio No est permitido, no se puede utilizar un alias campo. En la lista de seleccin slo pueden aparecer: valores constantes funciones de columna columnas de agrupacin (columnas que aparecen en la clusula GROUP BY) o cualquier expresin basada en las anteriores. SELECT SUM(importe),rep*10 FROM pedidos GROUP BY rep*10 Est permitido SELECT SUM(importe),rep FROM pedidos GROUP BY rep*10 No est permitido, rep es una columna simple que no est encerrrada en una funcin de columna, ni est en la lista de columnas de agrupacin. Se pueden agrupar las filas por varias columnas, en este caso se indican las columnas separadas por una coma y en el orden de mayor a menor agrupacin. Se permite incluir en la lista de agrupacin hasta 10 columnas. Ejemplo: Queremos obtener la suma de las ventas de las oficinas agrupadas por region y ciudad: SELECT SUM(ventas) FROM oficinas GROUP BY region,ciudad Se agrupa primero por regin, y dentro de cada regin por ciudad. Es Todas las filas que tienen valor nulo en el campo de agrupacin, pasan a formar un nico grupo. decir, considera el valor nulo como un valor cualquiera a efectos de agrupacin.

Ejemplo: SELECT oficina,SUM(ventas) AS ventas_totales FROM repventas GROUP BY oficina En el resultado aparece una fila con el campo oficina sin valor y a continuacin una cantidad en el campo ventas_totales, esta cantidad corresponde a la suma de las ventas de los empleados que no tienen oficina asignada (campo oficina igual a nulo). La clusula HAVING

La clusula HAVING nos permite seleccionar filas de la tabla resultante de una consulta de resumen.

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Para la condicin de seleccin se pueden utilizar los mismos tests de comparacin descritos en la clusula WHERE, tambin se pueden escribir condiciones compuestas (unidas por los operadores OR, AND, NOT), pero existe una restriccin. En la condicin de seleccin slo pueden aparecer : valores constantes funciones de columna columnas de agrupacin (columnas que aparecen en la clusula GROUP BY) o cualquier expresin basada en las anteriores La clusula HAVING nos permite seleccionar filas de la tabla resultante de una consulta de resumen. Para la condicin de seleccin se pueden utilizar los mismos tests de comparacin descritos en la clusula WHERE, tambin se pueden escribir condiciones compuestas (unidas por los operadores OR, AND, NOT), pero existe una restriccin. En la condicin de seleccin slo pueden aparecer : valores constantes funciones de columna columnas de agrupacin (columnas que aparecen en la clusula GROUP BY) o cualquier expresin basada en las anteriores. Ejemplo: Queremos saber las oficinas con un promedio de ventas de sus empleados mayor que 500.000 ptas. SELECT oficina FROM empleados GROUP BY oficina HAVING AVG(ventas) > 500000 NOTA: Para obtener lo que se pide hay que calcular el promedio de ventas de los empleados de cada oficina, por lo que hay que utilizar la tabla empleados. Tenemos que agrupar los empleados por oficina y calcular el promedio para cada oficina, por ltimo nos queda seleccionar del resultado las filas que tengan un promedio superior a 500.000 ptas. Resumen del tema

Cmo se ejecuta internamente una consulta de resumen?

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. - Primero se forma la tabla origen de datos segn la clusula FROM, - se seleccionan del origen de datos las filas segn la clusula WHERE, - se forman los grupos de filas segn la clusula GROUP BY, - por cada grupo se obtiene una fila en la tabla resultante con los valores que aparecen en las clusulas GROUP BY, HAVING y en la lista de seleccin, - se seleccionan de la tabla resultante las filas segn la clusula HAVING, - se eliminan de la tabla resultante las columnas que no aparecen en la lista de seleccin, - se ordenan las filas de la tabla resultante segn la clusula ORDER BY Una consulta se convierte en consulta de resumen en cuanto aparece GROUP BY, HAVING o una funcin de columna. En una consulta de resumen, la lista de seleccin y la clusula HAVING slo pueden contener: valores constantes funciones de columna columnas de agrupacin (columnas que aparecen en la clusula GROUP BY) o cualquier expresin basada en las anteriores.

Contar registros (count)


Existen en Oracle funciones que nos permiten contar registros, calcular sumas, promedios, obtener valores mximos y mnimos. Estas funciones se denominan funciones de grupo y operan sobre un conjunto de valores (registros), no con datos individuales y devuelven un nico valor. Imaginemos que nuestra tabla "libros" contiene muchos registros. Para averiguar la cantidad sin necesidad de contarlos manualmente usamos la funcin "count()": select count(*) from libros; La funcin "count()" cuenta la cantidad de registros de una tabla, incluyendo los que tienen valor nulo. Tambin podemos utilizar esta funcin junto con la clausula "where" para una consulta ms especfica. Queremos saber la cantidad de libros de la editorial "Planeta": select count(*) from libros where editorial='Planeta'; Para contar los registros que tienen precio (sin tener en cuenta los que tienen valor nulo), usamos la funcin "count()" y en los parntesis colocamos el nombre del campo que necesitamos contar: select count(precio) from libros; Note que "count(*)" retorna la cantidad de registros de una tabla (incluyendo los que tienen valor "null") mientras que "count(precio)" retorna la cantidad de registros en los cuales el campo "precio" no es nulo. No es lo mismo. "count(*)" cuenta registros, si en lugar de un asterisco colocamos como argumento el nombre de un campo, se contabilizan los registros cuyo valor en ese campo NO es nulo.

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


Problema:
Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Trabajamos con la tabla "libros" de una librera.

Eliminamos la tabla: drop table libros; Creamos la tabla: create table libros( titulo varchar2(40) not null, autor varchar2(20) default 'Desconocido', editorial varchar(20), precio number(6,2) ); Ingresamos algunos registros: insert insert insert insert insert insert insert into into into into into into into libros libros libros libros libros libros libros values('El aleph','Borges','Emece',15.90); values('Antologa potica',null,'Planeta',null); values('Alicia en el pais de las maravillas','Lewis Carroll',null,19.90); values('Matematica estas ahi','Paenza','Siglo XXI',15); values('Martin Fierro','Jose Hernandez',default,40); values('Aprenda PHP',default,'Nuevo siglo',null); values('Uno','Richard Bach','Planeta',20);

Averiguemos la cantidad de libros usando la funcin "count()": select count(*) from libros; Note que incluye todos los libros aunque tengan valor nulo en algn campo. Contamos los libros de editorial "Planeta": select count(*) from libros where editorial='Planeta'; Existen 2 libros de editorial "Planeta". Contamos los registros que tienen precio (sin tener en cuenta los que tienen valor nulo), usando la funcin "count(precio)": select count(precio) from libros; La consulta nos retorna el valor 5. Contamos los registros que tienen valor diferente de "null" en "editorial": select count(editorial) from libros; La consulta nos retorna el valor 5.

Prctica 07, Base de Datos Relacional UTS.

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Ejercicios Propuestos: Trabaje con la tabla llamada "medicamentos" de una farmacia. 1- Elimine la tabla: drop table medicamentos; 2- Cree la tabla con la siguiente estructura: create table medicamentos( codigo number(5), nombre varchar2(20), laboratorio varchar2(20), precio number(6,2), cantidad number(3), fechavencimiento date not null, numerolote number(6) default null, primary key(codigo) ); 3- Ingrese algunos registros: insert insert insert insert insert insert into into into into into into medicamentos medicamentos medicamentos medicamentos medicamentos medicamentos values(120,'Sertal','Roche',5.2,1,'01/02/2005',123456); values(220,'Buscapina','Roche',4.10,3,'01/02/2006',null); values(228,'Amoxidal 500','Bayer',15.60,100,'01/05/2007',null); values(324,'Paracetamol 500','Bago',1.90,20,'01/02/2008',null); values(587,'Bayaspirina',null,2.10,null,'01/12/2009',null); values(789,'Amoxidal jarabe','Bayer',null,null,'15/12/2009',null);

4- Muestre la cantidad de registros empleando la funcin "count(*)" (6 registros) 5- Cuente la cantidad de medicamentos que tienen laboratorio conocido (5 registros) 6- Cuente la cantidad de medicamentos que tienen precio y cantidad, con alias (5 y 4 respectivamente) 7- Cuente la cantidad de remedios con precio conocido, cuyo laboratorio comience con "B" (2 registros) 8- Cuente la cantidad de medicamentos con nmero de lote distinto de "null" (1 registro) 9- Cuente la cantidad de medicamentos con fecha de vencimiento conocida (6 registros)

Prctica 07, Base de Datos Relacional UTS.

10

Unidades Tecnolgicas de Santander. Funciones de grupo (count - max - min - sum - avg)
Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

Hemos visto que Oracle dispone de funciones que nos permiten contar registros, calcular sumas, promedios, obtener valores mximos y mnimos, las funciones de grupo. Las funciones de grupo operan sobre un conjunto de valores (registros) y retornan un solo valor. Ya hemos aprendido una de ellas, "count()", veamos otras. Se pueden usar en una instruccin "select" y combinarlas con la clusula "group by" (la veremos posteriormente). Todas estas funciones retornan "null" si ningn registro cumple con la condicion del "where" (excepto "count" que en tal caso retorna cero). El tipo de dato del campo determina las funciones que se pueden emplear con ellas. Las relaciones entre las funciones de agrupamiento y los tipos de datos es la siguiente: - count: se puede emplear con cualquier tipo de dato. - min y max: con cualquier tipo de dato. - sum y avg: slo en campos de tipo numrico. La funcin "sum()" retorna la suma de los valores que contiene el campo especificado. Si queremos saber la cantidad total de libros que tenemos disponibles para la venta, debemos sumar todos los valores del campo "cantidad": select sum(cantidad) from libros; Para averiguar el valor mximo o mnimo de un campo usamos las funciones "max()" y "min()" respectivamente. Queremos saber cul es el mayor precio de todos los libros: select max(precio) from libros; Entonces, dentro del parntesis de la funcin colocamos el nombre del campo del cul queremos el mximo valor. La funcin "avg()" retorna el valor promedio de los valores del campo especificado. Queremos saber el promedio del precio de los libros referentes a "PHP": select avg(precio) from libros where titulo like '%PHP%'; Ahora podemos entender porque estas funciones se denominan "funciones de grupo", porque operan sobre conjuntos de registros, no con datos individuales. Tratamiento de los valores nulos:

Prctica 07, Base de Datos Relacional UTS.

11

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Si realiza una consulta con la funcin "count" incluyendo entre parntesis un campo y la tabla contiene 18 registros, 2 de los cuales contienen valor nulo en "precio", el resultado devuelve un total de 16 filas porque no considera aquellos con valor nulo. Todas las funciones de grupo, excepto "count(*)", excluye los valores nulos de los campos; "count(*)" cuenta todos los registros, incluidos los que contienen "null". Problema: Trabajamos con la tabla "libros" de una librera. Eliminamos la tabla: drop table libros; Creamos la tabla: create table libros( codigo number(4) not null, titulo varchar2(40) not null, autor varchar2(30) default 'Desconocido', editorial varchar2(15), edicion date, precio number(5,2), cantidad number(3), primary key(codigo) ); Ingresamos algunos registros: insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into libros libros libros libros libros libros libros libros libros libros values(1562,'El aleph','Borges','Planeta','10/10/1980',15,null); values(1878,'Martin Fierro','Jose Hernandez','Emece',null,22.20,200); values(2587,'Antologia poetica','J.L. Borges','Planeta',null,null,150); values(3654,'Aprenda PHP','Mario Molina',null,'05/05/1999',18.20,null); values(3921,'Cervantes y el quijote',default,'Paidos','15/02/2000',null,null); values(4582,'Manual de PHP', 'J.C. Paez', 'Siglo XXI','21/04/2005',31.80,120); values(5963,'Harry Potter y la piedra filosofal','J.K. Rowling',default,null,45.00,90); values(6211,'Harry Potter y la camara secreta','J.K. Rowling','Emece',null,0,100); values(8851,'Alicia en el pais de las maravillas','Lewis Carroll',null,null,null,220); values(9920,'PHP de la A a la Z',default,default,default,null,0);

Para conocer la cantidad total de libros, sumamos las cantidades de cada uno: select sum(cantidad) from libros; Retorna 880; verifique la suma, sumando los valores de todos los registros del campo "cantidad". Queremos saber cuntos libros tenemos de la editorial "Emece": select sum(cantidad) from libros where editorial='Emece'; retorna 300.

Prctica 07, Base de Datos Relacional UTS.

12

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Queremos saber el precio del libro ms costoso; usamos la funcin "max()": select max(precio) from libros; retorna 45. Para conocer el precio mnimo de los libros de "Rowling" tipeamos: select min(precio) from libros where autor like '%Rowling%'; retorna 0 (cero). Queremos saber el promedio del precio de los libros referentes a "PHP": select avg(precio) from libros where titulo like '%PHP%'; Devuelve 25. Note que hay 3 libros sobre "PHP", pero uno de ellos tiene precio nulo entonces Oracle no lo incluye para calcular el promedio. Averiguamos el mnimo valor del campo "edicion": select min(edicion) from libros; Retorna 10/10/80. Necesitamos conocer el mayor valor de "codigo": select max(codigo) from libros; Retorna 9920.

Problema Propuesto: Una empresa almacena los datos de sus empleados en una tabla "empleados".
1- Elimine la tabla y crela con la siguiente estructura: drop table empleados; 2- Creamos la tabla: create table empleados( nombre varchar2(30), documento char(8), domicilio varchar2(30), seccion varchar2(20), sueldo number(6,2),

Prctica 07, Base de Datos Relacional UTS.

13

Unidades Tecnolgicas de Santander.


cantidadhijos number(2), fechaingreso date, primary key(documento) ); Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

3- Ingrese algunos registros: insert into empleados values('Juan Perez','22333444','Colon 123','Gerencia',5000,2,'10/10/1980'); insert into empleados values('Ana Acosta','23444555','Caseros 987','Secretaria',2000,0,'15/08/1998'); insert into empleados values('Lucas Duarte','25666777','Sucre 235','Sistemas',4000,1,null); insert into empleados values('Pamela Gonzalez','26777888','Sarmiento 873','Secretaria',2200,3,null); insert into empleados values('Marcos Juarez','30000111','Rivadavia 801','Contaduria',3000,0,'26/08/2000'); insert into empleados values('Yolanda Perez','35111222','Colon 180','Administracion',3200,1,'25/09/2001'); insert into empleados values('Rodolfo Perez','35555888','Coronel Olmedo 588','Sistemas',4000,3,null); insert into empleados values('Martina Rodriguez','30141414','Sarmiento 234','Administracion',3800,4,'14/12/2000'); insert into empleados values('Andres Costa','28444555',default,'Secretaria',null,null,'08/08/1990'); 4- Muestre la cantidad de empleados usando "count" (9 empleados) 5- Muestre la cantidad de empleados con fecha de ingreso conocida (6 empleados) 6- Muestre la cantidad de empleados con sueldo (8 empleados) 7- Muestre la cantidad de empleados con sueldo de la seccin "Secretaria" (2 empleados) 8- Muestre el sueldo ms alto y el ms bajo colocando un alias (5000 y 2000 respectivamente) 9- Muestre el valor mayor de "cantidadhijos" de los empleados "Perez" (3 hijos) 10- Muestre la fecha de ingreso ms reciente (max) y la ms lejana (min) (25/09/01 y 10/10/80 respectivamente) 11- Muestre el documento menor (22333444) 12- Muestre el promedio de sueldos de todo los empleados (3400. Note que hay un sueldo nulo y no es tenido en cuenta) 13- Muestre el promedio de sueldos de los empleados de la seccin "Secretara" (2100. Note que hay 3 registros de la seccin solicitada, pero como uno de ellos tiene sueldo nulo, no es tenido en cuenta) 14- Muestre el promedio de hijos de todos los empleados de "Sistemas" (retorna 2) 15- Muestre la cantidad de empleados, la cantidad de empleados con domicilio conocido, la suma de los hijos, el promedio de los sueldos y los valores mnimo y mximo del campo "fechaingreso" de todos los empleados. Empleamos todas las funciones de grupo en una sola consulta y nos retorna 9, 8, 14, 3400, 10/10/80 y 25/09/01. 16- Realice la misma consulta anterior pero ahora de los empleados de la seccin "Recursos". Al no existir tal seccin, "count(*)" y "count(domicilio)" retornan 0 (cero) y las dems funciones de grupo retornan "null".

Prctica 07, Base de Datos Relacional UTS.

14

Unidades Tecnolgicas de Santander.


Agrupar registros (group by)
Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

Hemos aprendido que las funciones de grupo permiten realizar varios clculos operando con conjuntos de registros. Las funciones de grupo solas producen un valor de resumen para todos los registros de un campo. Podemos generar valores de resumen para un solo campo, combinando las funciones de agregado con la clusula "group by", que agrupa registros para consultas detalladas. Queremos saber la cantidad de libros de cada editorial, podemos tipear la siguiente sentencia: select count(*) from libros where editorial='Planeta'; y repetirla con cada valor de "editorial": select count(*) from libros where editorial='Emece'; select count(*) from libros where editorial='Paidos'; ... Pero hay otra manera, utilizando la clusula "group by": select editorial, count(*) from libros group by editorial; La instruccin anterior solicita que muestre el nombre de la editorial y cuente la cantidad agrupando los registros por el campo "editorial". Como resultado aparecen los nombres de las editoriales y la cantidad de registros para cada valor del campo. Los valores nulos se procesan como otro grupo. Entonces, para saber la cantidad de libros que tenemos de cada editorial, utilizamos la funcin "count()", agregamos "group by" (que agrupa registros) y el campo por el que deseamos que se realice el agrupamiento, tambin colocamos el nombre del campo a recuperar; la sintaxis bsica es la siguiente: select CAMPO, FUNCIONDEAGREGADO from NOMBRETABLA group by CAMPO; Tambin se puede agrupar por ms de un campo, en tal caso, luego del "group by" se listan los campos, separados por comas. Todos los campos que se especifican en la clusula "group by" deben estar en la lista de seleccin. select CAMPO1, CAMPO2, FUNCIONDEAGREGADO from NOMBRETABLA group by CAMPO1,CAMPO2;

Prctica 07, Base de Datos Relacional UTS.

15

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Para obtener la cantidad libros con precio no nulo, de cada editorial utilizamos la funcin "count()" envindole como argumento el campo "precio", agregamos "group by" y el campo por el que deseamos que se realice el agrupamiento (editorial): select editorial, count(precio) from libros group by editorial; Como resultado aparecen los nombres de las editoriales y la cantidad de registros de cada una, sin contar los que tienen precio nulo. Recuerde la diferencia de los valores que retorna la funcin "count()" cuando enviamos como argumento un asterisco o el nombre de un campo: en el primer caso cuenta todos los registros incluyendo los que tienen valor nulo, en el segundo, los registros en los cuales el campo especificado es no nulo. Para conocer el total de libros agrupados por editorial: select editorial, sum(cantidad) from libros group by editorial; Para saber el mximo y mnimo valor de los libros agrupados por editorial: select editorial, max(precio) as mayor, min(precio) as menor from libros group by editorial; Para calcular el promedio del valor de los libros agrupados por editorial: select editorial, avg(precio) from libros group by editorial; Es posible limitar la consulta con "where". Si incluye una clusula "where", slo se agrupan los registros que cumplen las condiciones. Vamos a contar y agrupar por editorial considerando solamente los libros cuyo precio sea menor a 30 pesos: select editorial, count(*) from libros where precio<30 group by editorial; Note que las editoriales que no tienen libros que cumplan la condicin, no aparecen en la salida. Entonces, usamos "group by" para organizar registros en grupos y obtener un resumen de dichos grupos. Oracle produce una columna de valores por cada grupo, devolviendo filas por cada grupo especificado.

Prctica 07, Base de Datos Relacional UTS.

16

Unidades Tecnolgicas de Santander.


Ejemplo:
Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Trabajamos con la tabla "libros" de una librera.

Eliminamos la tabla: drop table libros; Creamos la tabla: create table libros( codigo number(5), titulo varchar2(40), autor varchar2(30) default 'Desconocido', editorial varchar2(15), precio number(5,2), cantidad number(3), primary key(codigo) ); Ingresamos algunos registros: insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into libros libros libros libros libros libros libros libros libros libros values(100,'El aleph','Borges','Planeta',15,null); values(234,'Martin Fierro','Jose Hernandez','Emece',22.20,200); values(354,'Antologia poetica',default,'Planeta',null,150); values(478,'Aprenda PHP','Mario Molina','Emece',18.20,null); values(512,'Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',28,100); values(643,'Manual de PHP', default, 'Siglo XXI',31.80,120); values(646,'Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); values(753,'Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100); values(889,'Alicia en el pais de las maravillas','Lewis Carroll','Paidos',22.50,200); values(893,'PHP de la A a la Z',null,null,55.90,0);

Queremos saber la cantidad de libros de cada editorial, utilizando la clusula "group by": select editorial, count(*) from libros group by editorial; Aparece el siguiente resultado: EDITORIAL COUNT(*) -------------------------Paidos 2 2 Planeta 2 Emece 3 Siglo XXI 1 El resultado muestra los nombres de las editoriales y la cantidad de registros para cada valor del campo. Note que los valores nulos se procesan como otro grupo. Obtenemos la cantidad libros con precio no nulo de cada editorial: select editorial, count(precio)

Prctica 07, Base de Datos Relacional UTS.

17

Unidades Tecnolgicas de Santander.


from libros group by editorial; La salida es la siguiente: EDITORIAL COUNT(PRECIO) -----------------------------Paidos 2 2 Planeta 1 Emece 2 Siglo XXI 1 Aparecen los nombres de las editoriales y la cantidad de registros de cada una, sin contar los que tienen precio nulo. Para conocer el total de libros agrupados por editorial, tipeamos: select editorial, sum(cantidad) from libros group by editorial; Obtenemos el mximo y mnimo valor de los libros agrupados por editorial, en una sola sentencia: select editorial, max(precio) as mayor, min(precio) as menor from libros group by editorial; Calculamos el promedio del valor de los libros agrupados por editorial: select editorial, avg(precio) from libros group by editorial; Es posible limitar la consulta con "where". Vamos a contar y agrupar por editorial considerando solamente los libros cuyo precio es menor a 30 pesos: select editorial, count(*) from libros where precio<30 group by editorial; Note que las editoriales que no tienen libros que cumplan la condicin (sus precios superan los 30 pesos), no aparecen en la salida. Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

Prctica 07, Base de Datos Relacional UTS.

18

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Ejercicios: Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. 1- Elimine la tabla "visitantes" y crela con la siguiente estructura: drop table visitantes; create table visitantes( nombre varchar2(30), edad number(2), sexo char(1) default 'f', domicilio varchar2(30), ciudad varchar2(20) default 'Cordoba', telefono varchar2(11), mail varchar2(30) default 'no tiene', montocompra number(6,2) ); 3- Ingrese algunos registros: insert into visitantes values ('Susana Molina',35,default,'Colon 123',default,null,null,59.80); insert into visitantes values ('Marcos Torres',29,'m',default,'Carlos Paz',default,'marcostorres@hotmail.com',150.50); insert into visitantes values ('Mariana Juarez',45,default,default,'Carlos Paz',null,default,23.90); insert into visitantes (nombre, edad,sexo,telefono, mail) values ('Fabian Perez',36,'m','4556677','fabianperez@xaxamail.com'); insert into visitantes (nombre, ciudad, montocompra) values ('Alejandra Gonzalez','La Falda',280.50); insert into visitantes (nombre, edad,sexo, ciudad, mail,montocompra) values ('Gaston Perez',29,'m','Carlos Paz','gastonperez1@gmail.com',95.40); insert into visitantes values ('Liliana Torres',40,default,'Sarmiento 876',default,default,default,85); insert into visitantes values ('Gabriela Duarte',21,null,null,'Rio Tercero',default,'gabrielaltorres@hotmail.com',321.50); 4- Queremos saber la cantidad de visitantes de cada ciudad utilizando la clusula "group by" (4 filas devueltas) 5- Queremos la cantidad visitantes con telfono no nulo, de cada ciudad (4 filas devueltas) 6- Necesitamos el total del monto de las compras agrupadas por sexo (3 filas) Note que los registros con valor nulo en el campo "sexo" se procesan como un grupo diferente. 7- Se necesita saber el mximo y mnimo valor de compra agrupados por sexo y ciudad (6 filas) 8- Calcule el promedio del valor de compra agrupados por ciudad (4 filas) 9- Cuente y agrupe por ciudad sin tener en cuenta los visitantes que no tienen mail (3 filas)

Prctica 07, Base de Datos Relacional UTS.

19

Unidades Tecnolgicas de Santander.


Seleccionar grupos (Having)
Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

As como la clusula "where" permite seleccionar (o rechazar) registros individuales; la clusula "having" permite seleccionar (o rechazar) un grupo de registros. Si queremos saber la cantidad de libros agrupados por editorial usamos la siguiente instruccin ya aprendida: select editorial, count(*) from libros group by editorial; Si queremos saber la cantidad de libros agrupados por editorial pero considerando slo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instruccin: select editorial, count(*) from libros group by editorial having count(*)>2; Se utiliza "having", seguido de la condicin de bsqueda, para seleccionar ciertas filas retornadas por la clusula "group by". Veamos otros ejemplos. Queremos el promedio de los precios agrupados por editorial, pero solamente de aquellos grupos cuyo promedio supere los 25 pesos: select editorial, avg(precio) from libros group by editorial having avg(precio)>25; En algunos casos es posible confundir las clusulas "where" y "having". Queremos contar los registros agrupados por editorial sin tener en cuenta a la editorial "Planeta". Analicemos las siguientes sentencias: select editorial, count(*) from libros where editorial<>'Planeta' group by editorial; select editorial, count(*) from libros group by editorial having editorial<>'Planeta'; Ambas devuelven el mismo resultado, pero son diferentes. La primera, selecciona todos los registros rechazando los de editorial "Planeta" y luego los agrupa para contarlos. La segunda, selecciona todos los registros, los agrupa para contarlos y finalmente rechaza fila con la cuenta correspondiente a la editorial "Planeta". No debemos confundir la clusula "where" con la clusula "having"; la primera establece condiciones para la seleccin de registros de un "select"; la segunda establece condiciones para la seleccin de registros de una salida "group by". Veamos otros ejemplos combinando "where" y "having". Queremos la cantidad de libros, sin considerar los que tienen precio nulo, agrupados por editorial, sin considerar la editorial "Planeta": select editorial, count(*) from libros

Prctica 07, Base de Datos Relacional UTS.

20

Unidades Tecnolgicas de Santander.


where precio is not null group by editorial having editorial<>'Planeta'; Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

Aqu, selecciona los registros rechazando los que no cumplan con la condicin dada en "where", luego los agrupa por "editorial" y finalmente rechaza los grupos que no cumplan con la condicin dada en el "having". Se emplea la clusula "having" con funciones de grupo, esto no puede hacerlo la clusula "where". Por ejemplo queremos el promedio de los precios agrupados por editorial, de aquellas editoriales que tienen ms de 2 libros: select editorial, avg(precio) from libros group by editorial having count(*) > 2; En una clusula "having" puede haber varias condiciones. Cuando utilice varias condiciones, tiene que combinarlas con operadores lgicos (and, or, not). Podemos encontrar el mayor valor de los libros agrupados y ordenados por editorial y seleccionar las filas que tengan un valor menor a 100 y mayor a 30: select editorial, max(precio) as mayor from libros group by editorial having min(precio)<100 and min(precio)>30 order by editorial;

Entonces, usamos la clausula "having" para restringir las filas que devuelve una salida "group by". Va siempre despus de la clusula "group by" y antes de la clusula "order by" si la hubiere.

Ejemplo: Trabajamos con la tabla "libros" de una librera.


Eliminamos la tabla: drop table libros; Creamos la tabla: create table libros( titulo varchar2(40), autor varchar2(30), editorial varchar2(15), precio number(5,2), cantidad number(3) ); Ingresamos algunos registros: insert into libros values('El aleph','Borges','Planeta',35,null); insert into libros values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Martin Fierro','Jose Hernandez','Planeta',40,200);

Prctica 07, Base de Datos Relacional UTS.

21

Unidades Tecnolgicas de Santander.


insert insert insert insert insert insert insert insert insert into into into into into into into into into libros libros libros libros libros libros libros libros libros Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. values('Antologia poetica','J.L. Borges','Planeta',null,150); values('Aprenda PHP','Mario Molina','Emece',18,null); values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',56,120); values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); values('Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100); values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',42,80); values('PHP de la A a la Z',null,null,110,0); values('Uno','Richard Bach','Planeta',25,null);

Queremos saber la cantidad de libros agrupados por editorial: select editorial, count(*) from libros group by editorial; Nos devuelve: EDITORIAL COUNT(*) -----------------------Paidos 2 2 Planeta 4 Emece 3 Siglo XXI 1 Queremos saber la cantidad de libros agrupados por editorial pero considerando slo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instruccin: select editorial, count(*) from libros group by editorial having count(*)>2; La salida es la siguiente: EDITORIAL COUNT(*) ------------------------Planeta 4 Emece 3 Compare esta salida con la de la sentencia anterior. Queremos el promedio de los precios de los libros agrupados por editorial, pero solamente de aquellos grupos cuyo promedio supere los 25 pesos: select editorial, avg(precio) from libros group by editorial having avg(precio)>25; Queremos la cantidad de libros, sin considerar los que tienen precio nulo (where), agrupados por editorial (group by), sin considerar la editorial "Planeta" (having): select editorial, count(*) from libros where precio is not null

Prctica 07, Base de Datos Relacional UTS.

22

Unidades Tecnolgicas de Santander.


group by editorial having editorial<>'Planeta'; Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro.

Necesitamos el promedio de los precios agrupados por editorial, de aquellas editoriales que tienen ms de 2 libros: select editorial, avg(precio) from libros group by editorial having count(*) > 2; Buscamos el mayor valor de los libros agrupados y ordenados por editorial y seleccionamos las filas que tienen un valor menor a 100 y mayor a 30: select editorial, max(precio) as mayor from libros group by editorial having max(precio)<100 and max(precio)>30 order by editorial;

Prctica 07, Base de Datos Relacional UTS.

23

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. TALLER EJERCICIOS CONSULTAS AGRUPACIN Modelo de Ventas

Consultas: 1. El promedio de las ventas, iva y descuento por Cliente. 2. Calcular el total del iva por tipo de artculo. 3. Calcular el total de la venta, el costo y la cantidad de los productos por proveedor mostrando su nit y nombre ordenndolo por ventas mayores en forma ascendente y luego por costo total en forma descendente. 4. Calcula el total de venta, iva y cantidad asi como el promedio de cantidad por nombre de clasificacion1, nombre de clasificacion2 y nombre de clasificacion3, ordenndola primero por el nombre de clasificacion1, luego por nombre de clasificacion2 y por ultimo por nombre de clasificacion3. 5. Si aun cliente se le va ha dar por cada 1000 (mil) pesos un punto por cada compra, listar la cdula del cliente, el nombre del cliente, el total de la compras realizadas y la cantidad de puntos ganadas en el mes de enero de 2005, ordenar por puntos en forma descendente y luego por nombre de cliente en forma ascendente. 6. Listar el nit del proveedor, el nombre del proveedor las ventas totales realizadas y el promedio de las misma del primer semestre del ao 2005 7. Quiero sacar un listado del nombre del producto, la cantidad vendida y el total de venta por precio y costo de los productos del proveedor DISTRIBUIDORA GALVIS CASTILLO, donde las ventas sean mayores a 10000 (diez mil) pesos. 8. Quisiera sacar el reporte de las ventas y el valor del iva a pagar agrupados por IVA (16%,10%, etc) del mes de abril de 2006 9. Listar la cedula y nombre del cliente as como su total de compra durante el ao 2006, de aquellos que tuviesen un total de compra mayor a 300000. 10. Listar el nit y nombre del proveedor as como su total de venta durante el ao 2006, de aquellos que tuviesen un total de venta mayor a 500000. 11. Totalizar las compras pagadas a crdito, identificando el nit y el nombre de la empresa, donde el total de los pagos de crdito sean mayores a 100000. 12. Totalizar y contar las ventas realizadas agrupndolas por su forma de pago.

Prctica 07, Base de Datos Relacional UTS.

24

Unidades Tecnolgicas de Santander.


Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. 13. Totalizar el iva pagado por cada uno de los artculos, identificndolo con el nombre y cdigo del artculo, ordenndolo por total de iva en forma descendente. 14. Contabilizar cuantos clientes tiene asociado cada empresa, mostrando el nit y nombre de la empresa ordenando por total de clientes en forma descendente y luego por nombre de empresa en forma ascendente. Modelo de Central de Taxi

Consultas: 1. Totalizar por cliente el valor de la tarifa cobrada y la cantidad de servicios prestados, identificndolos por el nombre, direccin y telfono 2. Totalizar por vehiculo el valor de la tarifa cobrada y la cantidad de servicios prestados y cuyo estado de servicio sea atendidos identificndolos por placa y nombre, direccin y telfono del propietario del vehiculo. Ordenados por Nombre de propietario ascendente y luego por placa en forma descendente. 3. Totalizar el numero de servicios prestado, as como el promedio de tiempo utilizado por cada uno de los conductores de los vehculos, agrupndolos por nombre y cedula del conductor de fecha de recibido el da 3 de mayo de 2005. Ordenndolos por cedula en forma ascendente. 4. Quiero sacar el promedio y valor total de la tarifa pagada, as como el promedio y total de tiempo por da. 5. Quiero identificar el valor del mnimo y mximo valor pagado por tarifa, el nombre del cliente, la placa del vehiculo, el da de ocurrencia y el nombre del conductor. 6. Quiero identificar el valor del mnimo y mximo tiempo, el nombre del cliente, la placa del vehiculo, el da de ocurrencia y el nombre del conductor de los servicios con estado atendidos. 7. Totalizar la cantidad de servicios cancelados, el tiempo promedio gastado y el valor total de las tarifas, agrupadas por nombre y telfono del cliente, as como la placa y el nombre del propietario, Ordenado por nombre del cliente en forma descendente y luego por nombre del propietario en forma ascendente. 8. Cantidad de servicios prestado, total de tarifa, nombre y cedula de los conductor suspendidos. 9. Cantidad de servicios prestado, total de tarifa, placa de los vehculos suspendidos.

Prctica 07, Base de Datos Relacional UTS.

25

Unidades Tecnolgicas de Santander.


10. 11. 12. 13. 14. Ingeniera en Telecomunicaciones. Docente: Ingeniero Rogerio Orlando Beltrn Castro. Listar el nombre, direccin y cliente, as como la cantidad de servicios cancelados, el total de tarifa y el promedio de tiempo utilizado entre el 15 de junio al 30 de junio del 2005. Ordenado por Nombre de Cliente en forma descendente. Hallar el valor mximo y mnimo de la tarifa pagada de los servicios prestados. Hallar el valor mximo y mnimo del tiempo usado de los servicios prestados. Hallar el valor mximo y mnimo de la tarifa pagada de los servicios prestados por vehiculo (placa) ordenados por placa en forma descendente. Hallar el valor mximo y mnimo del tiempo usado de los servicios prestados por vehiculo (placa) ordenados por placa en forma descendente.

Prctica 07, Base de Datos Relacional UTS.

26