domingo, 15 de abril de 2012

34 - Funciones de agrupamiento (count - max - min - sum - avg)

Existen en MySQL funciones que nos permiten contar registros, calcular sumas, promedios, obtener valores máximos y mínimos. Ya hemos aprendido "count()", veamos otras.

La función "sum()" retorna la suma de los valores que contiene el campo especificado. Por ejemplo, queremos saber la cantidad de libros que tenemos disponibles para la venta:

select sum(cantidad) from libros;
 
También podemos combinarla con "where". Por ejemplo, queremos saber cuántos libros tenemos de la editorial "Planeta":

select sum(cantidad) from libros
  where editorial ='Planeta';
 
Para averiguar el valor máximo o mínimo de un campo usamos las funciones "max()" y "min()" respectivamente. Ejemplo, queremos saber cuál es el mayor precio de todos los libros:

select max(precio) from libros;
 
Queremos saber cuál es el valor mínimo de los libros de "Rowling":

select min(precio) from libros
  where autor like '%Rowling%';
 
La función avg() retorna el valor promedio de los valores del campo especificado. Por ejemplo, queremos saber el promedio del precio de los libros referentes a "PHP":

select avg(precio) from libros
  where titulo like '%PHP%';
 
Estas funciones se denominan "funciones de agrupamiento" porque operan sobre conjuntos de registros, no con datos individuales.

Tenga en cuenta que no debe haber espacio entre el nombre de la función y el paréntesis, porque puede confundirse con una referencia a una tabla o campo. Las siguientes sentencias son distintas:

select count(*) from libros;
 select count (*) from libros;
 
La primera es correcta, la segunda incorrecta.


Problema Resuelto:

Trabajamos con la tabla "libros" que registra la información de los libros que vende una librería.
Eliminamos la tabla, si existe:

drop table if exists libros;
 
Creamos la tabla:

create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  precio decimal(5,2) unsigned,
  cantidad mediumint unsigned,
  primary key(codigo)
 );
 
Ingresamos algunos registros:

insert into libros (titulo,autor,editorial,precio,cantidad)
  values('El aleph','Borges','Planeta',15,100);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Martin Fierro','Jose Hernandez','Emece',22.20,200);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Antologia poetica','J.L. Borges','Planeta',40,150);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Aprenda PHP','Mario Molina','Emece',18.20,200);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Cervantes y el quijote','Bioy Casares- J.L. Borges',
'Paidos',36.40,100);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Manual de PHP', 'J.C. Paez', 'Paidos',30.80,120);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Harry Potter y la piedra filosofal','J.K. Rowling',
'Paidos',45.00,50);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Harry Potter y la camara secreta','J.K. Rowling',
'Paidos',46.00,100);
 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Alicia en el pais de las maravillas','Lewis Carroll',
'Paidos',null,200);
 
Para conocer la suma de las cantidades de libros que tenemos disponibles tipeamos:

select sum(cantidad) from libros;
 
Retorna 1220; verifique la suma, sumando los valores de todos los registros del campo "cantidad".

Solicitamos la suma de las cantidades de los libros de la editorial "Planeta":

select sum(cantidad) from libros
  where editorial ='Planeta';
 
Retorna 250; verifique el total sumando las cantidades de los libros cuya editorial sea "Planeta".
Si queremos saber cuál es el mayor precio de los libros usamos:

select max(precio) from libros;
Devuelve 46.

Verifiquemos lo anterior realizando una consulta ordenada por precio de forma descendente:

select * from libros
  order by precio desc;
 
Para obtener el valor mínimo de los libros de "Rowling" utilizamos la siguiente sentencia:

select min(precio) from libros
  where autor like '%Rowling%';
 
Retorna 45.

Verifiquemos el resultado realizando una consulta "select" con la condición anterior ordenada por precio:

select * from libros
  where autor like '%Rowling%'
  order by 5;
 
Solicitamos el promedio del precio de los libros que tratan sobre "PHP":

select avg(precio) from libros
  where titulo like '%PHP%';
 
Retorna 24.50...

Verifiquemos el resultado seleccionado los libros de "PHP" y calculando el promedio manualmente:

select * from libros
  where titulo like '%PHP%';
 
Recuerde que no debe haber espacio entre el nombre de la función y el paréntesis. Pruebe las siguientes sentencias:

select count(*) from libros;
 select count (*) from libros;
 
La segunda no se ejecuta, aparece un mensaje de error.


Problema Propuesto :
 
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", si existe.

2- Créela con la siguiente estructura:
 
 create table visitantes(
  nombre varchar(30),
  edad tinyint unsigned,
  sexo char(1),
  domicilio varchar(30),
  ciudad varchar(20),
  telefono varchar(11),
  montocompra decimal (6,2) unsigned
 );

Note que no tiene clave primaria, no la necesita.

3- Ingrese algunos registros:
 
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Susana Molina', 28,'f','Colon 123','Cordoba',null,45.50); 
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',0);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25); 
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Teresa Garcia',33,'f','Gral. Paz 123','Alta Gracia','03547123456',0);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',25);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','03547121212',53.50);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Roxana Lopez',20,'f','Triunvirato 345','Alta Gracia',null,0);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Juan Torres',43,'m','Sarmiento 876','Cordoba','4988778',15.30);

4- Solicite la cantidad de visitantes al stand (10 registros):
 
5- Muestre la suma de la compra de todos los visitantes de "Alta Gracia" (78.5):
 
6- Muestre el valor máximo de las compras efectuadas (53.50):
 
7- Muestre la edad menor de los visitantes (20):
 
8- Muestre el promedio de edades de los visitantes (33.66):
 
9- Muestre el promedio del monto de compra (24.55): 
 
 
 
Otros problemas: 
A) Una academia de informática dicta distintos cursos y almacena en una tabla 
llamada "inscripciones" la siguiente información: nombre del curso, 
documento del alumno, fecha en que se inscribe el alumno, monto del 
pago (algunos dejan una seña, otros pagan el curso completo).

1- Elimine la tabla si existe.

2- cree la tabla:
 
 create table inscripciones(
  nombre varchar(30),
  documento char(8),
  fechainscripto date,
  pago decimal(5,2) unsigned not null
 );

3- Ingrese algunos registros:
 
 insert into inscripciones values('PHP básico', '22333444','2006-08-10',50);
 insert into inscripciones values('PHP básico', '23333444','2006-08-10',50);
 insert into inscripciones values('PHP básico', '24333444','2006-08-11',30);
 insert into inscripciones values('PHP experto', '25333444','2006-08-11',0);
 insert into inscripciones values('PHP experto', '26333444','2006-08-12',200);
 insert into inscripciones values('JavaScript básico', '22333444','2006-08-10',100);
 insert into inscripciones values('Operador de PC', '27333444','2006-08-12',10);
 insert into inscripciones values('Operador de PC', '28333444','2006-08-13',50);
 insert into inscripciones values('Operador de PC', '29333444','2006-08-14',40);
 insert into inscripciones values('Operador de PC', '30333444','2006-08-14',0);
 insert into inscripciones values('Diseño web', '29333444','2006-08-14',200);
 insert into inscripciones values('Diseño web', '30333444','2006-08-14',0);

4- calcule la cantidad de inscriptos para el curso de "Operador de PC":
  
5- Calcule la suma recaudada por los pagos de los cursos el día "2006-08-10":
  
6- Calcule el promedio de los pagos de los inscriptos:
  
7- Muestre el máximo y el mínimo valor de pago, sin considerar quienes no pagan:
  
8- Vea en cuántos cursos se inscribió el alumno con documento "22333444" y cuánto 
abonó en total:
  


B) Trabaje con la tabla "peliculas" de un video club.

1- Elimine la tabla, si existe.

2- Créela con la siguiente estructura:
 
 -codigo (entero sin signo, autoincrementable),
 -titulo (cadena de 30), not null,
 -actor (cadena de 20),
 -duracion (entero sin signo no mayor a 200 aprox.),
 -clave primaria (codigo).

3- Ingrese los siguientes registros:
 
 insert into peliculas (titulo,actor,duracion)
  values('Mision imposible','Tom Cruise',120);
 insert into peliculas (titulo,actor,duracion)
  values('Harry Potter y la piedra filosofal','Daniel R.',180);
 insert into peliculas (titulo,actor,duracion)
  values('Harry Potter y la camara secreta','Daniel R.',190);
 insert into peliculas (titulo,actor,duracion)
  values('Mision imposible 2','Tom Cruise',120);
 insert into peliculas (titulo,actor,duracion)
  values('Mujer bonita','Richard Gere',120);
 insert into peliculas (titulo,actor,duracion)
  values('Tootsie','D. Hoffman',90);
 insert into peliculas (titulo,actor,duracion)
  values('Un oso rojo',null,100);
 insert into peliculas (titulo,actor,duracion)
  values('Elsa y Fred','China Zorrilla',110);
 insert into peliculas (titulo,actor,duracion)
  values('Mrs. Johns','Richard Gere',180);

4- Muestre el valor de duración más grande:
 
5- Muestre el promedio de duración de las películas:
 
6- Cuente la cantidad de películas que comiencen con la cadena "Harry Potter":
 
7- Un socio alquiló todas las películas en las cuales trabaja "Richard Gere", 
quiere saber el total de minutos que duran todas sus películas:
 

C) Una concesionaria de autos vende autos usados y almacena la información 
en una tabla llamada "autos".

1- Elimine la tabla "autos" si existe.

2- Cree la tabla con la siguiente estructura:
 
 create table autos(
  patente char(6),
  marca varchar(20),
  modelo char(4),
  precio decimal(8,2) unsigned,
  primary key(patente)
 );

3- Ingrese los siguientes registros:
 
 insert into autos
  values('ACD123','Fiat 128','1970',15000);
 insert into autos
  values('ACG234','Renault 11','1990',40000);
 insert into autos
  values('BCD333','Peugeot 505','1990',80000);
 insert into autos
  values('GCD123','Renault Clio','1990',70000);
 insert into autos
  values('BCC333','Renault Megane','1998',95000);
 insert into autos
  values('BVF543','Fiat 128','1975',20000);

4- Muestre el valor del auto más caro y más barato:
 
5- Muestre el valor de auto más caro de 1990:
 
6- Muestre el promedio de los precios de los autos "Fiat 128":
 
7- Calcule el valor en dinero de todos los autos marca "Renault" con 
modelos menores a "1995": 
 
D) Un comercio guarda la información de sus ventas en una tabla llamada 
"facturas" en la que registra el número de factura, la descripción de los 
items comprados, el precio por unidad de los items y la cantidad.

1- Elimine la tabla si existe.

2- Cree la tabla:
 
 create table facturas(
  numero int(10) zerofill,
  descripcion varchar(30),
  precioporunidad decimal(5,2) unsigned,
  cantidad tinyint unsigned
 );

3- Ingrese algunos registros:
 
 insert into facturas values(504,'escuadra 20 cm.',2.5,100);
 insert into facturas values(504,'escuadra 50 cm.',5,80);
 insert into facturas values(2002,'compas plastico',8,120);
 insert into facturas values(2002,'compas metal',15.4,100);
 insert into facturas values(2002,'escuadra 20 cm.',2.5,100);
 insert into facturas values(4567,'escuadra 50 cm.',5,200);

4- Cuente la cantidad de items de la factura número "2002":
 
5- Sume la cantidad de productos de la factura número "2002":
 
6- Muestre el total en dinero de la factura "504":
 

No hay comentarios:

Publicar un comentario