domingo, 15 de abril de 2012

33 - Contar registros (count)

Existen en MySQL funciones que nos permiten contar registros, calcular sumas, promedios, obtener valores máximos y mínimos. Veamos algunas de ellas.

Imaginemos que nuestra tabla "libros" contiene muchos registros. Para averiguar la cantidad sin necesidad de contarlos manualmente usamos la función "count()":

select count(*) from libros;
 
La función "count()" cuenta la cantidad de registros de una tabla, incluyendo los que tienen valor nulo.
Para saber la cantidad de libros de la editorial "Planeta" tipeamos:

select count(*) from libros
  where editorial='Planeta';
 
También podemos utilizar esta función junto con la clausula "where" para una consulta más específica. Por ejemplo, solicitamos la cantidad de libros que contienen la cadena "Borges":

select count(*) from libros
  where autor like '%Borges%';
 
Para contar los registros que tienen precio (sin tener en cuenta los que tienen valor nulo), usamos la función "count()" y en los paréntesis 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.

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" de 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 averiguar la cantidad de registros de la tabla "libros" usamos la función "count(*)":

select count(*) from libros;
 
Retorna 9.

Para saber la cantidad de libros de la editorial "Planeta" tipeamos:

select count(*) from libros
  where editorial='Planeta';
 
Para averiguar la cantidad de libros que contienen la cadena "Borges" tipeamos:

select count(*) from libros where autor like '%Borges%';
 
Nos retorna 3.

Para obtener la cantidad de libros cuyo precio no tiene valor nulo usamos la función "count()" y dentro del paréntesis colocamos el nombre del campo correspondiente:

select count(precio) from libros;
 
Retorna 8, ya que uno de los libros tiene precio nulo y no se contabilizó.


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
 );

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- Solicite la cantidad de visitantes que tienen teléfono (valor no nulo) 
(8 registros):
 
Recuerde que no es lo mismo contar todos los registros que contar los que 
tienen teléfono, porque en el segundo caso no considera los registros con 
valor nulo en el campo "telefono".

6- Muestre la cantidad de visitantes de sexo masculino que acudieron al stand (3):
 
7- Muestre la cantidad de mujeres mayores de 25 años que acudieron al stand (4):
 
8- Muestre la cantidad de visitantes que no son de "Cordoba" (5):
 
9- Muestre la cantidad de visitantes que realizaron alguna compra (7):
 
10- Muestre la cantidad de visitantes que no realizaron compras (3):
 


Otros problemas:

A) Una pequeña biblioteca de barrio registra los préstamos de sus libros 
en una tabla llamada "prestamos".

1- Elimine la tabla "prestamos" si existe.

2- Cree la tabla:
 create table prestamos(
  titulo varchar(40) not null,
  documento char(8) not null,
  fechaprestamo date not null,
  fechadevuelto date
 );

La tabla registra el documento del socio a quien se le presta el libro, 
el título del libro prestado, la fecha de préstamo y la fecha en que se 
devuelve.

3- Ingrese los siguientes registros:
 
 insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
  values ('Manual de 1 grado','23456789','2006-07-10','2006-07-12');
 insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
  values ('El aleph','22245679','2006-07-15',null);
 insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
  values ('Alicia en el pais de las maravillas','24456789','2006-07-20',
'2006-07-22');
 insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
  values ('Manual de biologia','25456789','2006-08-14',null);
 insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
  values ('Manual de geografia 5 grado','27456789','2006-08-21',
'2006-08-25');
 insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
  values ('Antologia poetica','28456789','2006-08-26','2006-08-27');
 insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
  values ('Manual de 1 grado','23456789','2006-08-26','2006-08-28');
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
  values ('Manual de 1 grado','30456789','2006-09-01','2006-09-03');

4- Cuente la cantidad de veces que se prestó el libro "Manual de 1 grado":
 
5- Cuente la cantidad de libros devueltos (contando por fechadevuelto):
 
6- Cuente la cantidad de veces que se le prestaron libros a la persona con 
documento "23456789":
 
7- Cuente la cantidad de libros prestados en el mes de agosto: 
 
B) Trabaje con la tabla "agenda" que registra la información referente a 
sus amigos.

1- Elimine la tabla si existe.

2- Cree la tabla con la siguiente estructura:
 
 create table agenda(
  apellido varchar(30),
  nombre varchar(20) not null,
  domicilio varchar(30),
  telefono varchar(11),
  mail varchar(30)
 );

3- Ingrese los siguientes registros:
 
 insert into agenda values('Perez','Juan','Sarmiento 345','4334455',
'juancito@gmail.com');
 insert into agenda values('Garcia','Ana','Urquiza 367','4226677',
'anamariagarcia@hotmail.com');
 insert into agenda values('Lopez','Juan','Avellaneda 900',null,
'juancitoLopez@gmail.com');
 insert into agenda values('Juarez','Mariana','Sucre 123','0525657687',
'marianaJuarez2@gmail.com');
 insert into agenda values('Molinari','Lucia','Peru 1254','4590987',
'molinarilucia@hotmail.com');
 insert into agenda values('Ferreyra','Patricia','Colon 1534','4585858',null);
 insert into agenda values('Perez','Susana','San Martin 333',null,null);
 insert into agenda values('Perez','Luis','Urquiza 444','0354545256',
'perezluisalberto@hotmail.com');
 insert into agenda values('Lopez','Maria','Salta 314',null,
'lopezmariayo@gmail.com');

4- Cuente cuántos de sus amigos tienen mail:
 
5-Cuente cuántos de sus amigos tienen teléfono:
 
6- Cuente cuántos se apellidan "Perez":
 

No hay comentarios:

Publicar un comentario