domingo, 15 de abril de 2012

35 - Agrupar registros (group by)

Hemos aprendido que las funciones de agrupamiento permiten contar registros, calcular sumas y promedios, obtener valores máximos y mínimos. También dijimos que dichas funciones operan sobre conjuntos de registros, no con datos individuales.

Generalmente esta funciones se combinan con la sentencia "group by", que agrupa registros para consultas detalladas.

Queremos saber la cantidad de visitantes de cada ciudad, podemos tipear la siguiente sentencia:

select count(*) from visitantes
  where ciudad='Cordoba';
 
y repetirla con cada valor de "ciudad":

select count(*) from visitantes
  where ciudad='Alta Gracia';
 select count(*) from visitantes
  where ciudad='Villa Dolores';
...
 
Pero hay otra manera, utilizando la cláusula "group by":

select ciudad, count(*)
  from visitantes
  group by ciudad;
 
Entonces, para saber la cantidad de visitantes que tenemos en cada ciudad utilizamos la función "count()", agregamos "group by" y el campo por el que deseamos que se realice el agrupamiento, también colocamos el nombre del campo a recuperar.

La instrucción anterior solicita que muestre el nombre de la ciudad y cuente la cantidad agrupando los registros por el campo "ciudad". Como resultado aparecen los nombres de las ciudades y la cantidad de registros para cada valor del campo.

Para obtener la cantidad visitantes con teléfono no nulo, de cada ciudad utilizamos la función "count()" enviándole como argumento el campo "telefono", agregamos "group by" y el campo por el que deseamos que se realice el agrupamiento (ciudad):

select ciudad, count(telefono)
  from visitantes
  group by ciudad;
 
Como resultado aparecen los nombres de las ciudades y la cantidad de registros de cada una, sin contar los que tienen teléfono nulo. Recuerde la diferencia de los valores que retorna la función "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 las compras agrupadas por sexo:

select sexo, sum(montocompra)
  from visitantes
  group by sexo;
 
Para saber el máximo y mínimo valor de compra agrupados por sexo:

select sexo, max(montocompra) from visitantes
  group by sexo;
 select sexo, min(montocompra) from visitantes
  group by sexo;
 
Se pueden simplificar las 2 sentencias anteriores en una sola sentencia, ya que usan el mismo "group by":

select sexo, max(montocompra),
  min(montocompra)
  from visitantes
  group by sexo;
 
Para calcular el promedio del valor de compra agrupados por ciudad:

select ciudad, avg(montocompra) from visitantes
  group by ciudad;
 
Podemos agrupar por más de un campo, por ejemplo, vamos a hacerlo por "ciudad" y "sexo":

select ciudad, sexo, count(*) from visitantes
  group by ciudad,sexo;
 
También es posible limitar la consulta con "where".

Vamos a contar y agrupar por ciudad sin tener en cuenta "Cordoba":

select ciudad, count(*) from visitantes
  where ciudad<>'Cordoba'
  group by ciudad;
 
Podemos usar las palabras claves "asc" y "desc" para una salida ordenada:

select ciudad, count(*) from visitantes
  group by ciudad desc;
 
 
 

Problema Resuleto:

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.

Eliminamos la tabla, si existe:

drop table if exists visitantes;
 
Creamos la tabla:

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
 );
 
Ingresamos 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);
 
Para saber la cantidad de visitantes que tenemos de cada ciudad tipeamos:

select ciudad, count(*)
  from visitantes
  group by ciudad;
 
El resultado muestra los nombres de las distintas ciudades y la cantidad de registros de cada una.
Necesitamos conocer la cantidad visitantes con teléfono no nulo, de cada ciudad:

select ciudad, count(telefono)
 from visitantes
  group by ciudad;
 
Queremos conocer el total de las compras agrupadas por sexo:

select sexo, sum(montocompra) from visitantes
  group by sexo;
 
Para obtener el máximo y mínimo valor de compra agrupados por sexo:

select sexo, max(montocompra) from visitantes
  group by sexo;
 select sexo, min(montocompra) from visitantes
  group by sexo;
 
Se pueden simplificar las 2 sentencias anteriores en una sola sentencia, ya que usan el mismo "group by":

select sexo, max(montocompra),
  min(montocompra)
  from visitantes
  group by sexo;
 
Queremos saber el promedio del valor de compra agrupados por ciudad:

select ciudad, avg(montocompra) from visitantes
  group by ciudad;
 
Contamos los registros y agrupamos por 2 campos, "ciudad" y "sexo":

select ciudad, sexo, count(*) from visitantes
  group by ciudad,sexo;
 
Limitamos la consulta, no incluimos los visitantes de "Cordoba", contamos y agrupar por ciudad:

select ciudad, count(*) from visitantes
  where ciudad<>'Cordoba'
  group by ciudad;
 
Usando la palabra clave "desc" obtenemos la salida ordenada en forma descendente:

select ciudad, count(*) from visitantes
  group by ciudad desc;
 
 
 
Problema Propuesto:
 
Una empresa tiene registrados sus clientes en una tabla llamada "clientes".

1- Elimine la tabla "clientes", si existe.

2- Créela con la siguiente estructura:
 
 create table clientes (
  codigo int unsigned auto_increment,
  nombre varchar(30) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar (20),
  telefono varchar(11),
  primary key(codigo)
 );

3- Ingrese algunos registros:
 
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Marcos', 'Colon 111', 'Córdoba','Cordoba','null');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba',
'4578585');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba',
'4578445');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null);
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono) 
  values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba',
'4253685');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba',
'4554455');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null);
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones',
'0457858745');

4- Obtenga el total de los registros (10):
 
5- Obtenga el total de los registros que no tienen valor nulo en los 
teléfonos (8):
 
6- Obtenga la cantidad de clientes agrupados por ciudad y provincia, 
ordenados por provincia: 
 
 
 
Otros problemas: 
A) En una página web se solicitan los siguientes datos para 
guardar información de sus visitas.

1- Elimine la tabla "visitas", si existe.

2- Créela con la siguiente estructura:
 
 create table visitas (
  numero int unsigned auto_increment,
  nombre varchar(30) not null,
  mail varchar(50),
  pais varchar (20),
  fecha date,
  primary key(numero)
);

3- Ingrese algunos registros:
 
 insert into visitas (nombre,mail,fecha)
  values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-10-10');
 insert into visitas (nombre,mail,fecha)
  values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-10-10');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-10-11');
 insert into visitas (nombre,mail,fecha)
  values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12');
 insert into visitas (nombre,mail,fecha)
  values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');

4- Obtenga el total de visitas.

5- Cantidad de visitas agrupadas por fecha:
 
6- Cantidad de visitas agrupadas por nombre y mes:
 


B) Una empresa registra los datos de sus empleados en una tabla 
llamada "empleados".

1- Elimine la tabla "empleados" si existe:
 
2- Cree la tabla:
 
 create table empleados(
  documento char(8) not null,
  nombre varchar(30) not null,
  sexo char(1),
  domicilio varchar(30),
  fechaingreso date,
  fechanacimiento date,
  sueldobasico decimal(5,2) unsigned,
  primary key(documento)
 );

3- Ingrese algunos registros:
 
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('22333111','Juan Perez','m','Colon 123','1990-02-01',
'1970-05-10',550);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01',
'1975-11-06',650);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01',
'1965-03-25',510);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('30000222','Luis Luque','m','Urquiza 456','1980-09-01',
'1980-03-29',700);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15',
'1965-12-22',700);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('30000234','Alberto Soto','m','Peru 232','2003-08-15',
'1989-10-10',420);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14',
'1976-09-21',350);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23',
'1974-05-12',390);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,
fechanacimiento,sueldoBasico)
  values ('30154269','Oscar Mendez','m','Colon 1245','2004-06-23',
'1984-05-14',300);

4- Es política de la empresa festejar cada fin de mes, los cumpleaños de 
todos los empleados que cumplen ese mes. Si los empleados son de sexo femenino, 
se les regala un ramo de rosas, si son de sexo masculino, una corbata. 
La secretaria de la Gerencia necesita saber cuántos ramos de rosas y 
cuántas corbatas debe comprar para el mes de mayo:
 
5- Se necesita conocer la cantidad de empleados agrupados por año de ingreso 
a la empresa: 
 
 C) 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 por factura:
 
5- Sume la cantidad de productos de las facturas:
 
6- Muestre el total en dinero de las facturas:
 
 
  

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":
 

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":
 

32 - Búsqueda de patrones (regexp)

Los operadores "regexp" y "not regexp" busca patrones de modo similar a "like" y "not like".
Para buscar libros que contengan la cadena "Ma" usamos:

select titulo from libros
  where titulo regexp 'Ma';
 
Para buscar los autores que tienen al menos una "h" o una "k" o una "w" tipeamos:

select autor from libros
  where autor regexp '[hkw]';
 
Para buscar los autores que no tienen ni "h" o una "k" o una "w" tipeamos:

select autor from libros
  where autor not regexp '[hkw]';
 
Para buscar los autores que tienen por lo menos una de las letras de la "a" hasta la "d",
es decir, "a,b,c,d", usamos:

select autor from libros
  where autor regexp '[a-d]';
 
Para ver los títulos que comienzan con "A" tipeamos:

select titulo from libros
  where titulo regexp '^A';
 
Para ver los títulos que terminan en "HP" usamos:

select titulo from libros
  where titulo regexp 'HP$';
 
Para buscar títulos que contengan una "a" luego un caracter cualquiera y luego una "e"
utilizamos la siguiente sentencia:

select titulo from libros
  where titulo regexp 'a.e';
 
El punto (.) identifica cualquier caracter.

Podemos mostrar los títulos que contienen una "a" seguida de 2 caracteres y luego una "e":

select titulo from libros
  where titulo regexp 'a..e';
 
Para buscar autores que tengan 6 caracteres exactamente usamos:

select autor from libros
  where autor regexp '^......$';
 
Para buscar autores que tengan al menos 6 caracteres usamos:

select autor from libros
  where autor regexp '......';
 
Para buscar títulos que contengan 2 letras "a" usamos:

select titulo from libros
  where titulo regexp 'a.*a';
 
El asterisco indica que busque el caracter inmediatamente anterior, en este caso cualquiera porque hay un punto.


Problema Resuelto:

Trabajamos con la tabla "libros" de una librería.


Eliminamos la tabla, si existe.

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,
  primary key(codigo)
 );
 
Ingresamos algunos registros:

insert into libros (titulo,autor,editorial,precio)
  values('El aleph','Borges','Planeta',15.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Emece',22.90);
 insert into libros (titulo,autor,editorial,precio)
  values('Antologia poetica','J.L. Borges','Planeta',39);
 insert into libros (titulo,autor,editorial,precio)
  values('Aprenda PHP','Mario Molina','Emece',19.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Cervantes y el quijote','Bioy Casare- J.L. Borges','Paidos',35.40);
 insert into libros (titulo,autor,editorial,precio)
  values('Manual de PHP', 'J.C. Paez', 'Paidos',19);
 insert into libros (titulo,autor,editorial,precio)
  values('Harry Potter y la piedra filosofal','J.K. Rowling','Paidos',45.00);
 insert into libros (titulo,autor,editorial,precio)
  values('Harry Potter y la camara secreta','J.K. Rowling','Paidos',46.00);
 insert into libros (titulo,autor,editorial,precio)
  values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',36.00);
 
Para buscar libros cuyos títulos contengan la cadena "Ma" usamos:

select titulo from libros
  where titulo regexp 'Ma';
 
Retorna 4 registros.

Para buscar los registros cuyos autores tienen al menos una "h" o una "k" o una "w" tipeamos:

select titulo,autor from libros
  where autor regexp '[hkw]';
 
4 registros devueltos.

Para buscar los libros cuyos autores no tienen ni "h" o una "k" o una "w" tipeamos:

select titulo,autor from libros
  where autor not regexp '[hkw]';
 
Selecciona 5 registros.

Para buscar los autores que tienen por lo menos una de las letras de la "a" hasta la "d", es decir, "a,b,c,d", usamos:

select autor from libros
  where autor regexp '[a-d]';
 
Selecciona 7 registros.


Para ver los títulos que comienzan con "A" tipeamos:

select titulo from libros
  where titulo regexp '^A';
 
Devuelve 3 registros.

Para ver los títulos que terminan en "HP" usamos:

select titulo from libros
  where titulo regexp 'HP$';
 
Retorna 2 registros.

Para buscar títulos que contengan una "a" luego un caracter cualquiera y luego una "e" utilizamos la siguiente sentencia:

select titulo from libros
  where titulo regexp 'a.e';
 
Retorna 2 registros.

Podemos mostrar los títulos que contienen una "a" seguida de 2 caracteres y luego una "e":

select titulo from libros
  where titulo regexp 'a..e';
 
Selecciona 3 registros.

Para buscar autores que tengan 6 caracteres exactamente usamos:

select autor from libros
  where autor regexp '^......$';
 
Devuelve 1 registro.

Para buscar autores que tengan al menos 6 caracteres usamos:

select autor from libros
  where autor regexp '......';
 
Selecciona 9 registros.

Para buscar títulos que contengan 2 letras "a" usamos:

select titulo from libros
  where titulo regexp 'a.*a';
 
Selecciona 6 registros.


Problema Propuesto:

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- Busque todos los mails que contengan la cadena "gmail":
 
5- Busque los nombres que no tienen "z" ni "g":
 
6- Busque los apellidos que tienen por lo menos una de las letras de la 
"v" hasta la "z" (v,w,x,y,z):
 
7- Seleccione los apellidos que terminen en "ez":
 
8- Seleccione los apellidos, nombres y domicilios de los amigos cuyos 
apellidos contengan 2 letras "i":
 
9- Seleccione los teléfonos que tengan 7 caracteres exactamente:
 
10- Seleccione el nombre y mail de todos los amigos cuyos mails 
tengan al menos 20 caracteres: 
 
 
Otros problemas: 
Un comercio que vende artículos de computación registra los datos 
de sus artículos en una tabla con ese nombre.

1- Elimine "articulos", si existe:
 
2- Cree la tabla, con la siguiente estructura:
 
 create table articulos(
  codigo int unsigned auto_increment,
  nombre varchar(25) not null,
  descripcion varchar(30),
  precio decimal(6,2) unsigned,
  cantidad tinyint unsigned,
  primary key(codigo)
 );

3- Ingrese algunos registros:
 insert into articulos (nombre, descripcion, precio,cantidad)
  values ('impresora','Epson Stylus C45',400.80,20);
 insert into articulos (nombre, descripcion, precio,cantidad)
  values ('impresora','Epson Stylus C85',500,30);
 insert into articulos (nombre, descripcion, precio,cantidad)
  values ('monitor','Samsung 14',800,10);
 insert into articulos (nombre, descripcion, precio,cantidad)
  values ('teclado','ingles Biswal',100,50);
 insert into articulos (nombre, descripcion, precio,cantidad)
  values ('teclado','español Biswal',90,50);
 insert into articulos (nombre, descripcion, precio,cantidad)
  values ('impresora multifuncion','HP 1410',300,20);

4- Seleccione todos los artículos que comienzan con "impresora":
 
5-Busque los artículos en los cuales el campo "descripcion" no tienen 
"H" ni "W":
 
6- Seleccione las descripciones que contengan una letra "s" seguida de 
un caracter cualquiera y luego una "n":
 
 

31 - Búsqueda de patrones (like y not like)

Hemos realizado consultas utilizando operadores relacionales para comparar cadenas. Por ejemplo, sabemos recuperar los libros cuyo autor sea igual a la cadena "Borges":

select * from libros
  where autor='Borges';
 
Los operadores relacionales nos permiten comparar valores numéricos y cadenas de caracteres. Pero al realizar la comparación de cadenas, busca coincidencias de cadenas completas.

Imaginemos que tenemos registrados estos 2 libros:

El Aleph de Borges;
 Antologia poetica de J.L. Borges;
 
Si queremos recuperar todos los libros cuyo autor sea "Borges", 
y especificamos la siguiente condición:


select * from libros
 where autor='Borges';
 
sólo aparecerá el primer registro, ya que la cadena "Borges" no es igual a la cadena "J.L. Borges".

Esto sucede porque el operador "=" (igual), también el operador "<>" (distinto) comparan cadenas de caracteres completas. Para comparar porciones de cadenas utilizamos los operadores "like" y "not like". 

Entonces, podemos comparar trozos de cadenas de caracteres para realizar consultas. Para recuperar todos los registros cuyo autor contenga la cadena "Borges" debemos tipear:

select * from libros
  where autor like "%Borges%";
 
El símbolo "%" (porcentaje) reemplaza cualquier cantidad de caracteres (incluyendo ningún caracter). Es un caracter comodín. "like" y "not like" son operadores de comparación que señalan igualdad o diferencia.

Para seleccionar todos los libros que comiencen con "A":

select * from libros
  where titulo like 'A%';
 
Note que el símbolo "%" ya no está al comienzo, con esto indicamos que el título debe tener como primera letra la "A" y luego, cualquier cantidad de caracteres.

Para seleccionar todos los libros que no comiencen con "A":

select * from libros
  where titulo not like 'A%';
 
Así como "%" reemplaza cualquier cantidad de caracteres, el guión bajo "_" reemplaza un caracter, es el otro caracter comodín. Por ejemplo, queremos ver los libros de "Lewis Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", entonces tipeamos esta condición:

select * from libros
  where autor like "%Carrol_";
 
Si necesitamos buscar un patrón en el que aparezcan los caracteres comodines, por ejemplo, queremos ver todos los registros que comiencen con un guión bajo, si utilizamos '_%', mostrará todos los registros porque lo interpreta como "patrón que comienza con un caracter cualquiera y sigue con cualquier cantidad de caracteres". Debemos utilizar "\_%", esto se interpreta como 'patrón que comienza con guión bajo y continúa con cualquier cantidad de caracteres". Es decir, si queremos incluir en una búsqueda de patrones los caracteres comodines, debemos anteponer al caracter comodín, la barra invertida "\", así lo tomará como caracter de búsqueda literal y no como comodín para la búsqueda. Para buscar el caracter literal "%" se debe colocar "\%".

Problema Resuelto: 

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla, si existe.

Creamos la tabla con la siguiente estructura:

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

insert into libros (titulo,autor,editorial,precio)
  values('El aleph','Borges','Planeta',15.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Emece',22.90);
 insert into libros (titulo,autor,editorial,precio)
  values('Antologia poetica','J.L. Borges','Planeta',39);
 insert into libros (titulo,autor,editorial,precio)
  values('Aprenda PHP','Mario Molina','Emece',19.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Cervantes y el quijote','Bioy Casare- J.L. Borges','Paidos',35.40);
 insert into libros (titulo,autor,editorial,precio)
  values('Manual de PHP', 'J.C. Paez', 'Paidos',19);
 insert into libros (titulo,autor,editorial,precio)
  values('Harry Potter y la piedra filosofal','J.K. Rowling','Paidos',45.00);
 insert into libros (titulo,autor,editorial,precio)
  values('Harry Potter y la camara secreta','J.K. Rowling','Paidos',46.00);
 insert into libros (titulo,autor,editorial,precio)
  values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',36.00);
Recuperamos los libros cuyo autor sea igual a la cadena "Borges":

select * from libros
  where autor='Borges';
Nos devuelve 1 registro.

Recuperamos todos los registros cuyo autor contenga la cadena "Borges":

select * from libros
  where autor like '%Borges%';
 
El resultado nos devuelve 3 registros.

Para seleccionar todos los libros que comiencen con "A":

select * from libros
 where titulo like 'A%';
 
Para seleccionar todos los libros que no comiencen con "A":

select * from libros
  where titulo not like 'A%';
 
Queremos los libros de "Lewis Carroll" y no recordamos si se escribe "Carroll" o "Carrolt", entonces tipeamos:

select * from libros
  where autor like '%Carrol_';
 
Buscamos todos los libros de "Harry Potter":

select * from libros
  where titulo like '%Harry Potter%';
 
Todos los libros sobre "PHP":

select * from libros
  where titulo like '%PHP%';


Problema Propuesto: 
Trabaje con la tabla llamada "medicamentos" de una farmacia.

1- Elimine la tabla, si existe:
 
2- Cree la tabla con la siguiente estructura:
 
 create table medicamentos(
  codigo int unsigned auto_increment,
  nombre varchar(20) not null,
  laboratorio varchar(20),
  precio decimal(6,2) unsigned,
  cantidad int unsigned,
  primary key(codigo)
);

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros:
 
 insert into medicamentos (nombre, laboratorio,precio)
  values('Sertal gotas','Roche',5.2);
 insert into medicamentos (nombre, laboratorio,precio)
  values('Buscapina','Roche',4.10);
 insert into medicamentos (nombre, laboratorio,precio)
  values('Amoxidal 500','Bayer',15.60);
 insert into medicamentos (nombre, laboratorio,precio)
  values('Paracetamol 500','Bago',1.90);
 insert into medicamentos (nombre, laboratorio,precio)
  values('Bayaspirina','Bayer',2.10); 
 insert into medicamentos (nombre, laboratorio,precio)
  values('Amoxidal jarabe','Bayer',5.10); 
 insert into medicamentos (nombre, laboratorio,precio)
  values('Sertal compuesto','Bayer',5.10); 
 insert into medicamentos (nombre, laboratorio,precio)
  values('Paracetamol 1000','Bago',2.90);
 insert into medicamentos (nombre, laboratorio,precio)
  values('Amoxinil','Roche',17.80);

5- Recupere los medicamentos cuyo nombre comiencen con "Amox":
 
Quedaron 3 registros seleccionados.

6- Recupere los medicamentos "Paracetamol" cuyo precio sea menor a 2:
 
7- Busque todos los medicamentos cuyo precio tenga .10 centavos:
 
8- Muestre todos los medicamentos que no contengan la cadena "compuesto":
 
9- Elimine todos los registros cuyo laboratorio contenga la letra "y":
 
10- Cambie el precio por 5, al "Paracetamol" cuyo precio es mayor a 2:
 
 
 
Otros problemas: 
A) 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- Visualice la estructura de la tabla "peliculas".

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

5- Actualice el valor del campo "actor" cambiando por 
'R. Gere- J. Roberts', de la película cuyo código es 5:
 
6- Seleccione todas las películas en las cuales trabaje 
el actor "Gere". Use "like". (2 registros seleccionados).

7- Recupere los registros que NO contengan la letra "y" en 
el título y contenga "ch" en el campo "actor" (2 registros):
 
8- Seleccione las películas que comiencen con "M" y cuya duración 
sea menor a 150 (3 registros):
 
9- Cambie el valor de la duración a 100 en las películas en las cuales 
el campo "actor" comience con "D":
 
10- Recupere los registros que cumplan la condición del punto anterior, 
para verificar el cambio de la duración:

11- Vea si existen películas con títulos nulos:
 
12- Vea si existen películas con valor nulo en el campo "actor": 
 
B) Trabaje con la tabla "usuarios" que almacena el nombre y clave 
de cada usuario.

1- Elimine la tabla, si existe.
 
 - Créela con la siguiente estructura:
 -nombre (cadena de 20),
 -clave (cadena de 10),
 -clave primaria (clave).

3- Visualice la estructura de la tabla "usuarios".

4- Ingrese los siguientes registros:
 
 insert into usuarios (nombre, clave) values ('Leonardo','payaso');
 insert into usuarios (nombre, clave) values ('MarioPerez','Marito');
 insert into usuarios (nombre, clave) values ('Marcelo','River');
 insert into usuarios (nombre, clave) values ('Gustavo','Boca');
 insert into usuarios (nombre, clave) values ('MarcosMercado','RealMadrid');
 insert into usuarios (nombre, clave) values ('Susana','chapita');
 insert into usuarios (nombre, clave) values ('Gonzalo','Z80');
 insert into usuarios (nombre, clave) values ('GustavoPereyra','RealMadrid');

5- Busque los registros cuya clave contenga sólo 5 letras:
 
6- Busque los registros cuyo nombre de usuario termine con "o":
 




 

domingo, 8 de abril de 2012

30 - Otros operadores relacionales (between - in)

Hemos visto los operadores relacionales:

= (igual), <> (distinto), > (mayor), < (menor), >= (mayor o igual), <= (menor o igual), is null/is not null (si un valor es NULL o no).

Existen otros que simplifican algunas consultas:

Para recuperar de nuestra tabla "libros" los registros que tienen precio mayor o igual a 20 y menor o igual a 40, usamos 2 condiciones unidas por el operador lógico "and":

select * from libros
  where precio>=20 and precio<=40;
 
Podemos usar "between":

select * from libros
  where precio between 20 and 40;
 
"between" significa "entre". Averiguamos si el valor de un campo dado (precio) está entre los valores mínimo y máximo especificados (20 y 40 respectivamente). 

Si agregamos el operador "not" antes de "between" el resultado se invierte. 

Para recuperar los libros cuyo autor sea 'Paenza' o 'Borges' usamos 2 condiciones:

select * from libros
  where autor='Borges' or autor='Paenza';
 
Podemos usar "in":

select * from libros
  where autor in('Borges','Paenza');
 
Con "in" averiguamos si el valor de un campo dado (autor) está incluido en la lista de valores especificada (en este caso, 2 cadenas).

Para recuperar los libros cuyo autor no sea 'Paenza' ni 'Borges' usamos:

select * from libros where autor<>'Borges' and autor<>'Paenza';
 
También podemos usar "in" :

select * from libros
 where autor not in ('Borges','Paenza');
 
Con "in" averiguamos si el valor del campo está incluido en la lista, con "not" antecediendo la condición, invertimos el resultado.


Problema: 

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla, si existe.

Creamos la tabla con la siguiente estructura:

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

insert into libros (titulo,autor,editorial,precio)
  values('El aleph','Borges','Planeta',15.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Emece',22.90);
 insert into libros (titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Planeta',39);
 insert into libros (titulo,autor,editorial,precio)
  values('Aprenda PHP','Mario Molina','Emece',19.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Cervantes y el quijote','Borges','Paidos',35.40);
 insert into libros (titulo,autor,editorial,precio)
  values('Matematica estas ahi', 'Paenza', 'Paidos',19);
 
Recuperamos los registros que tienen precio mayor o igual a 20 y menor o igual a 40, usando 2 condiciones:
 
select * from libros
  where precio>=20 and
  precio<=40;
 
Ahora usamos "between" y confirmamos que la salida es la misma:

select * from libros
  where precio between 20 and 40;
 
Recuperamos los libros cuyo autor es 'Paenza' o 'Borges' usando 2 condiciones:

select * from libros
  where autor='Borges' or
  autor='Paenza';
 
Usamos "in" y obtenemos el mismo resultado:

select * from libros
  where autor in('Borges','Paenza');
 
Seleccionamos los libros cuyo autor no es 'Paenza' ni 'Borges' usamos:

select * from libros
  where autor<>'Borges' and
  autor<>'Paenza';
 
Realizamos la misma consulta, pero esta vez con "in" :

select * from libros
  where autor not in ('Borges','Paenza');
 
 
 
Problema Propuesto:
 
 
Trabaje con la tabla llamada "medicamentos" de una farmacia.

1- Elimine la tabla, si existe.

2- Cree la tabla con la siguiente estructura:
 
 create table medicamentos(
  codigo int unsigned auto_increment,
  nombre varchar(20),
  laboratorio varchar(20),
  precio decimal(5,2) unsigned,
  cantidad int unsigned,
  primary key(codigo)
 );

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros:
 
 (nombre,laboratorio,precio,cantidad)
 Sertal,Roche,5.2,100
 Buscapina,Roche,4.10,200
 Amoxidal 500,Bayer,15.60,100
 Paracetamol 500,Bago,1.90,200
 Bayaspirina,Bayer,2.10,150
 Amoxidal jarabe,Bayer,5.10,250

5- Recupere los nombres y precios de los medicamentos cuyo precio 
esté entre 5 y 15:
 
6- Seleccione los registros cuyo laboratorio sea "Bayer" o "Bago":
 
7- Elimine los registros cuya cantidad esté entre 100 y 200:
 
 
Otros problemas: 
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:
 
 (patente,marca,modelo,precio)
  ACD123,Fiat 128,1970,15000
  ACG234,Renault 11,1990,40000
  BCD333,Peugeot 505,1990,80000
  GCD123,Renault Clio,1990,70000
  BCC333,Renault Megane,1998,95000
  BVF543,Fiat 128,1975,20000

4- Seleccione todos los autos cuyo año sea '1970' o '1975' 
usando el operador "in":
 
5- Seleccione todos los autos cuyo precio esté entre 50000 y 100000:


      
 
 

29 - Operadores Lógicos (and - or - not)

Hasta el momento, hemos aprendido a establer una condición con "where" utilizando operadores relacionales. 

Podemos establecer más de una condición con la cláusula "where", para ello aprenderemos los operadores lógicos.

Son los siguientes:

- and, significa "y",
- or, significa "y/o",
- xor, significa "o",
- not, significa "no", invierte el resultado
- (), paréntesis
 
Los operadores lógicos se usan para combinar condiciones.

Queremos recuperar todos los registros cuyo autor sea igual a "Borges" y cuyo precio no supere los 20 pesos, para ello necesitamos 2 condiciones:

select * from libros
  where (autor='Borges') and
  (precio<=20);
 
Los registros recuperados en una sentencia que une 2 condiciones con el operador "and", cumplen con las 2 condiciones.

Queremos ver los libros cuyo autor sea "Borges" y/o cuya editorial sea "Planeta":

select * from libros
  where autor='Borges' or
  editorial='Planeta';
 
En la sentencia anterior usamos el operador "or", indicamos que recupere los libros en los cuales el valor del campo "autor" sea "Borges" y/o el valor del campo "editorial" sea "Planeta", es decir, seleccionará los registros que cumplan con la primera condición, con la segunda condición o con ambas condiciones.

Los registros recuperados con una sentencia que une 2 condiciones con el operador "or", cumplen 1 de las condiciones o ambas.

Queremos ver los libros cuyo autor sea "Borges" o cuya editorial sea "Planeta":

select * from libros
  where (autor='Borges') xor 
  (editorial='Planeta');
 
En la sentencia anterior usamos el operador "xor", indicamos que recupere los libros en los cuales el valor del campo "autor" sea "Borges" o el valor del campo "editorial" sea "Planeta", es decir, seleccionará los registros que cumplan con la primera condición o con la segunda condición pero no los que cumplan con ambas condiciones. Los registros recuperados con una sentencia que une 2 condiciones con el operador "xor", cumplen 1 de las condiciones, no ambas.

Queremos recuperar los libros que no cumplan la condición dada, por ejemplo, aquellos cuya editorial NO sea "Planeta":

select * from libros
  where not (editorial='Planeta');
 
El operador "not" invierte el resultado de la condición a la cual antecede.

Los registros recuperados en una sentencia en la cual aparece el operador "not", no cumplen con la condición a la cual afecta el "NO".

Los paréntesis se usan para encerrar condiciones, para que se evalúen como una sola expresión.

Cuando explicitamos varias condiciones con diferentes operadores lógicos (combinamos "and", "or") permite establecer el orden de prioridad de la evaluación; además permite diferenciar las expresiones más claramente.
Por ejemplo, las siguientes expresiones devuelven un resultado diferente:

select * from libros
  where (autor='Borges') or
  (editorial='Paidos' and precio<20);

 select*from libros
  where (autor='Borges' or editorial='Paidos') and
  (precio<20);
 
Si bien los paréntesis no son obligatorios en todos los casos, se recomienda utilizarlos para evitar confusiones.
El orden de prioridad de los operadores lógicos es el siguiente: "not" se aplica antes que "and" y "and" antes que "or", si no se especifica un orden de evaluación mediante el uso de paréntesis.

El orden en el que se evalúan los operadores con igual nivel de precedencia es indefinido, por ello se recomienda usar los paréntesis.


Problema Resuelto: 

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla, si existe.

Creamos la tabla con la siguiente estructura:

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

insert into libros (titulo,autor,editorial,precio)
  values('El aleph','Borges','Planeta',15.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Emece',22.90);
 insert into libros (titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Planeta',39);
 insert into libros (titulo,autor,editorial,precio)
  values('Aprenda PHP','Mario Molina','Emece',19.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Cervantes y el quijote','Borges','Paidos',35.40);
 insert into libros (titulo,autor,editorial,precio)
  values('Matematica estas ahi', 'Paenza', 'Paidos',19);
 
Vamos a recuperar registros estableciendo 2 condiciones, necesitamos los operadores lógicos.

Para recuperar todos los registros cuyo autor sea igual a "Borges" y cuyo precio no supere los 20 pesos, tipeamos:

select * from libros
  where autor='Borges' and
  precio<=20;
 
Muestra un registro, porque sólo uno cumple con ambas condiciones.

Seleccionamos los libros cuyo autor sea "Paenza" y/o cuya editorial sea "Planeta":

select * from libros
  where autor='Paenza' or
  editorial='Planeta';
 
Muestra 3 registros, 1 de ellos cumple con la primera condición, 1 con la segunda y 1 con ambas.

Queremos ver los libros cuyo autor sea "Borges" o cuya editorial sea "Planeta":

select * from libros
  where (autor='Borges') xor
  (editorial='Planeta');
 
Muestra 2 registros, 1 cumple con la primera condición y 1 con la segunda. Los registros que cumplen con ambas condiciones no fueron seleccionados porque usamos el operador "xor".

Establecemos la condición que la editorial sea igual a "Planeta", y recuperamos con un "select" los libros que no cumplan la condición:

select * from libros
  where not (editorial='Planeta');
 
Muestra 4 registros que NO cumplen con la condición.

Los paréntesis sirven para establecer el orden de prioridad de evaluación de las condiciones.

Analicemos los siguientes ejemplos, estas sentencias devuelven resultados distintos:

select * from libros
  where (autor='Borges') or
  (editorial='Paidos' and precio<20);
select * from libros
  where (autor='Borges' or editorial='Paidos')
  and (precio<20);
 
En el primer caso selecciona primero los libros de "Paidos" con precio<20 y también los de "Borges", sin considerar el precio.

En el segundo caso selecciona los libros de "Borges" y/o "Paidos", si tienen precio<20.

El libro con código 5, no aparece en la segunda consulta porque el precio no es <20; si en la primera porque la condición referida al precio afecta a los libros de "Paidos".


Problema Propuesto:

Trabaje con la tabla llamada "medicamentos" de una farmacia.

1- Elimine la tabla, si existe.

2- Cree la tabla con la siguiente estructura: 
 
create table medicamentos(
  codigo int unsigned auto_increment,
  nombre varchar(20),
  laboratorio varchar(20),
  precio decimal(5,2) unsigned,
  cantidad int unsigned,
  primary key(codigo)
 );

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros (insert into):
 
 (nombre, laboratorio,precio,cantidad)
  Sertal,Roche,5.2,100
  Buscapina,Roche,4.10,200
  Amoxidal 500,Bayer,15.60,100
  Paracetamol 500,Bago,1.90,200
  Bayaspirina,Bayer,2.10,150
  Amoxidal jarabe,Bayer,5.10,250

5- Recupere los códigos y nombres de los medicamentos cuyo laboratorio 
sea 'Roche' y cuyo precio sea menor a 5:
 
6- Recupere los medicamentos cuyo laboratorio sea 'Roche' o cuyo precio 
sea menor a 5:
 
7- Muestre todos los registros que no sean de "Bayer" usando el operador "not".

8- Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer" y cuya 
cantidad sea=100:
 
9- Muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya 
cantidad NO sea=100:
 

10- Elimine todos los registros cuyo laboratorio sea igual a "Bayer" 
y su precio sea mayor a 10:
 

11- Cambie la cantidad por 200, a todos los medicamentos de "Roche" cuyo 
precio sea mayor a 5:
 
12- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio 
sea menor a 3. Antes veamos cuáles cumplen con la condición, los registros 
5 y 6 son de "Bayer, cumplen con la primera condición, los registros 4 y 5 
cumplen con la segunda condición, es decir, se borrarán 3 registros: 
 
el 4 porque cumple con la segunda condición, el 5 porque cumple con ambas 
y el 6 porque cumple con la primera. 
 
 
Otros problemas: 
 
 
A) Trabajamos con la tabla "peliculas" de un video club que alquila 
películas en video.

1- Elimine la tabla, si existe.

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

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

4- Recupere los registros cuyo actor sea "Tom Cruise" or "Richard Gere". 

5- Recupere los registros cuyo actor sea "Tom Cruise" y "Richard Gere". 
   
6- Cambie la duración a 200, de las películas cuyo actor sea "Daniel R." y 
cuya duración sea 180. 

8- Borre todas las películas donde el actor NO sea "Tom Cruise" y 
cuya duración sea mayor o igual a 100:
 
 

B) En una página web se solicitan los siguientes datos para guardar 
información de sus visitas:
 
 nombre, mail, pais.

1- Elimine la tabla "visitas", si existe.

2- Créela con la siguiente estructura:
 
 create table visitas (
  numero int unsigned auto_increment,
  nombre varchar(30) not null,
  mail varchar(50),
  pais varchar (20),
  fecha datetime,
  primary key(numero)
);

3- Ingrese algunos registros: 
 
(nombre,mail,pais,fecha)
'Ana Maria Lopez','AnaMaria@hotmail.com','Argentina','2006-10-10 10:10'
'Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','Chile','2006-10-10 21:30'
'Juancito','JuanJosePerez@hotmail.com','Argentina','2006-10-11 15:45'
'Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-10-12 08:15'
'Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-09-12 20:45'
'Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-12 16:20'
'Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-15 16:25'

4- Muestre los datos de las visitas de "Argentina" que hayan ingresado 
después del mes de septiembre (9):
 
5- Elimine todos los registros cuyo pais no sea "Mexico" y que hayan 
visitado la página antes de las 16 hs.:
 



28 - Cláusula order by del select.

Podemos ordenar el resultado de un "select" para que los registros se muestren ordenados por algún campo, para ello usamos la cláusula "order by".

Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el título:

select codigo,titulo,autor,editorial,precio from libros order by titulo;
 
Aparecen los registros ordenados alfabéticamente por el campo especificado.

También podemos colocar el número de orden del campo por el que queremos que se ordene en lugar de su nombre. Por ejemplo, queremos el resultado del "select" ordenado por "precio":

select codigo,titulo,autor,editorial,precio from libros order by 5;
 
Por defecto, si no aclaramos en la sentencia, los ordena de manera ascendente (de menor a mayor).

Podemos ordenarlos de mayor a menor, para ello agregamos la palabra clave "desc":

select codigo,titulo,autor,editorial,precio from libros order by 
editorial desc;
 
También podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial":

select codigo,titulo,autor,editorial,precio from libros order by 
titulo, editorial;
 
Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sentido ascendente y "editorial"
en sentido descendente:

select codigo,titulo,autor,editorial,precio 
from libros order by titulo asc, editorial desc;
 
Debe aclararse al lado de cada campo, pues estas palabras claves afectan al campo inmediatamente anterior.


Problema Resuelto: 

Trabajamos con la tabla "libros" de una librería.


Eliminamos la tabla, si existe:

drop table if exists libros;
 
Creamos la tabla estableciendo como clave primaria y "auto_increment" el campo "codigo":

create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40),
  autor varchar(30),
  editorial varchar(15),
  precio decimal (5,2) unsigned,
  primary key (codigo)
 );
 
Visualizamos su estructura:

describe libros;
 
Ingresamos algunos registros:

insert into libros (titulo,autor,editorial,precio)
  values('El aleph','Borges','Planeta',15.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Emece',22.90);
 insert into libros (titulo,autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Planeta',39);
 insert into libros (titulo,autor,editorial,precio)
  values('Aprenda PHP','Mario Molina','Emece',19.50);
 insert into libros (titulo,autor,editorial,precio)
  values('Cervantes y el quijote','Borges','Paidos',35.40);
 insert into libros (titulo,autor,editorial,precio)
  values('Matematica estas ahi', 'Paenza', 'Paidos',19);
 
Recuperamos los registros de la tabla "libros" ordenados por el título:

select codigo,titulo,autor,editorial,precio
  from libros order by titulo;
 
Aparecen los registros ordenados alfabéticamente por el campo especificado.

Ordenamos por "precio", colocando el número de orden del campo (5):

select codigo,titulo,autor,editorial,precio
 from libros order by 5;
 
Ordenamos los libros por 2 campos, "titulo" y "editorial":

select codigo,titulo,autor,editorial,precio
  from libros order by titulo, editorial;
 
Ahora los ordenamos en distintos sentidos, por "titulo" en sentido ascendente y "editorial" en sentido descendente:

select codigo,titulo,autor,editorial,precio
 from libros order by titulo asc, editorial desc;
 
 
 
Problema Propuesto:
 
Trabaje con la tabla llamada "medicamentos" que almacena la información 
de los productos que vende una farmacia.

1- Elimine la tabla, si existe.

2- Cree la tabla con la siguiente estructura:
 
 create table medicamentos(
  codigo int unsigned auto_increment,
  nombre varchar(20),
  laboratorio varchar(20),
  precio decimal(5,2),
  cantidad int unsigned,
  primary key(codigo)
 );

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros (insert into):
 
 (nombre, laboratorio,precio,cantidad)
  Sertal,Roche,5.2,100
  Buscapina,Roche,4.10,200
  Amoxidal 500,Bayer,15.60,100
  Paracetamol 500,Bago,1.90,200
  Bayaspirina,Bayer,2.10,150
  Amoxidal jarabe,Bayer,5.10,250

5- Ordene los registros por precio, de mayor a menor.

6- Ordene los medicamentos por número del campo "cantidad".

7- Ordene los registros por "laboratorio" (descendente) y cantidad (ascendente).
 

Otros problemas:

A) Trabaje con la tabla "peliculas" que guarda información de películas 
de video en alquiler.

1- Elimine la tabla, si existe.

2- Créela con la siguiente estructura:
 
-codigo (entero, sin signo, autoincrementable),
 -titulo (cadena de 40),
 -actor (cadena de 20),
 -duracion (integer sin signo, máximo valor 200 aprox.),
 -clave primaria (codigo).

3- Visualice la estructura de la tabla "peliculas".

4- Ingrese los siguientes registros: 
 
(titulo,actor,duracion)
 Mision imposible,Tom Cruise,120
 Harry Potter y la piedra filosofal,Daniel R.,180
 Harry Potter y la camara secreta,Daniel R.,190
 Mision imposible 2,Tom Cruise,120
 Mujer bonita,Richard Gere,120
 Tootsie,D. Hoffman,90
 Un oso rojo,Julio Chavez,100

5- Ordene los registros por el campo "actor".

6- Muestre las películas ordenadas por la duración, de mayor a menor.

 
B) En una página web se solicitan los siguientes datos para guardar 
información de sus visitas.

1- Elimine la tabla "visitas", si existe.

2- Créela con la siguiente estructura:
 
 create table visitas (
  numero int unsigned auto_increment,
  nombre varchar(30) not null,
  mail varchar(50),
  pais varchar (20),
  fecha date,
  primary key(numero)
);

3- Ingrese algunos registros: 
 
(nombre,mail,fecha)
  Ana Maria Lopez,AnaMaria@hotmail.com,2006-10-10
  Gustavo Gonzalez,GustavoGGonzalez@hotmail.com,2006-10-10
  Juancito,JuanJosePerez@hotmail.com,2006-10-11
  Fabiola Martinez,MartinezFabiola@hotmail.com,2006-10-12
  Fabiola Martinez,MartinezFabiola@hotmail.com,2006-09-12
  Juancito,JuanJosePerez@hotmail.com,2006-09-12
  Juancito,JuanJosePerez@hotmail.com,2006-09-15

4- Ordene los rergistros por fecha, en orden descendente:
 
5- Ordene por nombre en forma ascendente y fecha en orden descendente:
  

27 - Funciones para el uso de fecha y hora.

MySQL tiene algunas funciones para trabajar con fechas y horas. Estas son algunas:


-adddate(fecha, interval expresion): retorna la fecha agregándole el intervalo especificado. Ejemplos:

adddate('2006-10-10',interval 25 day) retorna "2006-11-04".

adddate('2006-10-10',interval 5 month) retorna "2007-03-10".

-adddate(fecha, dias): retorna la fecha agregándole a fecha "dias". Ejemplo:

adddate('2006-10-10',25), retorna "2006-11-04".

-addtime(expresion1,expresion2): agrega expresion2 a expresion1 y retorna el resultado.

-current_date: retorna la fecha de hoy con formato "YYYY-MM-DD" o "YYYYMMDD".

-current_time: retorna la hora actual con formato "HH:MM:SS" o "HHMMSS".

-date_add(fecha,interval expresion tipo) y date_sub(fecha,interval expresion tipo): el argumento "fecha" es un valor "date" o "datetime", "expresion" especifica el valor de intervalo a ser añadido o substraído de la fecha indicada (puede empezar con "-", para intervalos negativos), "tipo" indica la medida de adición o substracción. Ejemplo: 

date_add('2006-08-10', interval 1 month) retorna "2006-09-10";

date_add('2006-08-10', interval -1 day) retorna "2006-09-09";

date_sub('2006-08-10 18:55:44', interval 2 minute) retorna "2006-08-10 18:53:44";

date_sub('2006-08-10 18:55:44', interval '2:3' minute_second) retorna "2006-08-10 18:52:41".

Los valores para "tipo" pueden ser: second, minute, hour, day, month, year, minute_second (minutos y segundos), hour_minute (horas y minutos), day_hour (días y horas), year_month (año y mes), hour_second (hora, minuto y segundo), day_minute (dias, horas y minutos), day_second(dias a segundos).

-datediff(fecha1,fecha2): retorna la cantidad de días entre fecha1 y fecha2.

-dayname(fecha): retorna el nombre del día de la semana de la fecha. Ejemplo:

dayname('2006-08-10') retorna "thursday".

-dayofmonth(fecha): retorna el día del mes para la fecha dada, dentro del rango 1 a 31. Ejemplo:

dayofmonth('2006-08-10') retorna 10.


-dayofweek(fecha): retorna el índice del día de semana para la fecha pasada como argumento. Los valores de los índices son: 1=domingo, 2=lunes,... 7=sábado). Ejemplo:

dayofweek('2006-08-10') retorna 5, o sea jueves.

-dayofyear(fecha): retorna el día del año para la fecha dada, dentro del rango 1 a 366. Ejemplo:

dayofmonth('2006-08-10') retorna 222.

-extract(tipo from fecha): extrae partes de una fecha.

Ejemplos:

extract(year from '2006-10-10'), retorna "2006".
 extract(year_month from '2006-10-10 10:15:25') retorna "200610".
 extract(day_minute from '2006-10-10 10:15:25') retorna "101015";
 
Los valores para tipo pueden ser: second, minute, hour, day, month, year, minute_second, hour_minute, day_hour, year_month, hour_second (horas, minutos y segundos), day_minute (días, horas y minutos), day_second (días a segundos).

-hour(hora): retorna la hora para el dato dado, en el rango de 0 a 23.

Ejemplo: hour('18:25:09') retorna "18";

-minute(hora): retorna los minutos de la hora dada, en el rango de 0 a 59.

-monthname(fecha): retorna el nombre del mes de la fecha dada.

Ejemplo: monthname('2006-08-10') retorna "August".

-month(fecha): retorna el mes de la fecha dada, en el rango de 1 a 12.

-now() y sysdate(): retornan la fecha y hora actuales.

-period_add(p,n): agrega "n" meses al periodo "p", en el formato "YYMM" o "YYYYMM"; retorna un valor en el formato "YYYYMM". El argumento "p" no es una fecha, sino un año y un mes. Ejemplo: 

period_add('200608',2) retorna "200610".

-period_diff(p1,p2): retorna el número de meses entre los períodos "p1" y "p2", en el formato "YYMM" o "YYYYMM". Los argumentos de período no son fechas sino un año y un mes. Ejemplo: 

period_diff('200608','200602') retorna 6.

-second(hora): retorna los segundos para la hora dada, en el rango de 0 a 59.

-sec_to_time(segundos): retorna el argumento "segundos" convertido a horas, minutos y segundos. Ejemplo:

sec_to_time(90) retorna "1:30".

-timediff(hora1,hora2): retorna la cantidad de horas, minutos y segundos entre hora1 y hora2.

-time_to_sec(hora): retorna el argumento "hora" convertido en segundos.

-to_days(fecha): retorna el número de día (el número de día desde el año 0).

-weekday(fecha): retorna el índice del día de la semana para la fecha pasada como argumento. Los índices son: 0=lunes, 1=martes,... 6=domingo). Ejemplo: 

weekday('2006-08-10') retorna 3, o sea jueves.

-year(fecha): retorna el año de la fecha dada, en el rango de 1000 a 9999. Ejemplo:

year('06-08-10') retorna "2006".


Problema Resuelto: 

Una pequeña biblioteca de barrio registra los préstamos de sus libros en una tabla llamada "prestamos".
En ella almacena la siguiente información:


-título del libro,
 -documento de identidad del socio a quien se le presta el libro,
 -fecha de préstamo,
 -fecha de devolución del libro,
 -devuelto: si el libro ha sido o no devuelto.
 
Eliminamos la tabla "prestamos" si existe:

drop table if exists prestamos;
 
Creamos la tabla:

create table prestamos(
  titulo varchar(40) not null,
  documento char(8) not null,
  fechaprestamo date not null,
  fechadevolucion date,
  devuelto char(1) default 'n'
 );
 
Los libros se prestan por 5 días.

Ingresamos un registro con los 3 primeros datos y calculamos con una función la fecha de devolución:

insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion) 
values ('Manual de 1 grado','23456789','2006-08-10',date_add
('2006-08-10', interval 5 day));
 
Con un "select" vemos cómo quedó almacenado el registro ingresado anteriormente:

select * from prestamos;
 
Ingresemos otros registros de la misma manera:

insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion)
  values ('Alicia en el pais de las maravillas','23456789',
'2006-08-12',date_add('2006-08-12', interval 5 day));
 insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion) 
values ('El aleph','22543987','2006-08-15',date_add('2006-08-15', interval 5 day));
 insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion)
  values ('Manual de geografia 5 grado','25555666','2006-08-30',
date_add('2006-08-30', interval 5 day));
 
Ahora utilizaremos la función "current_date" para la fecha de préstamo:

insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion) 
values   ('Atlas universal','24000111',current_date,date_add
(current_date, interval 5 day));



Problema Propuesto:
 
Una empresa registra los datos de sus empleados en una tabla llamada 
"empleados".

1- Elimine la tabla "empleados" si existe.

2- Cree la tabla:
 
 create table empleados(
  documento char(8) not null,
  nombre varchar(30) not null,
  sexo char(1),
  domicilio varchar(30),
  fechaIngreso date,
  fechaNacimiento date,
  sueldoBasico decimal(5,2) unsigned,
  primary key(documento)
 );

3- Ingrese algunos registros:
 
 documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
 '22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550
 '25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11-06',650
 '20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25',510
 '30000222','Luis Luque','m','Urquiza 456','1980-09-01','1980-03-29',700
 '20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','1965-12-22',700
 '30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420
 '20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',350
 '24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05-12',390
 '306154269','Federico Gonzalez','m','Peru 390','1996-08-15','1985-05-01',580

4- Es política de la empresa festejar cada fin de mes, los cumpleaños de todos 
los empleados que cumplen ese mes. Necesitamos los nombres y fecha de nacimiento 
de los empleados que cumplen años en el mes de mayo:
 
5- También es política de la empresa, aumentar el 1% del sueldo básico a los 
empleados, cada vez que cumplen un año más de servicio. Necesitamos los nombres, 
fecha de ingreso a la empresa y sueldo básico de todos los empleados que cumplen 
un año más de servicio en el mes de agosto, y una columna calculando el incremento 
del sueldo:
 
6- Actualizamos el sueldo aumentando el 1% a los empleados que cumplen un 
año de servicio en el mes de agosto:
 
7- Verifique si la actualización se realizó:
 
8- Si el empleado cumple 10,20,30,40... años de servicio, se le regala 
una placa recordatoria. La secretaria de Gerencia necesita saber la 
cantidad de años de servicio que cumplen los empleados que ingresaron 
en el mes de agosto para encargar dichas placas:
 
En la sentencia anterior, extraemos el año de las fechas actual y de ingreso 
con la función "year ()" y las restamos, para calcular los años de servicio. 


Otros problemas:

A) Un instituto de enseñanza almacena los datos de sus estudiantes en una 
tabla llamada "alumnos".

1- Elimine la tabla "alumnos" si existe.

2- Cree la tabla con la siguiente estructura:
 
 create table alumnos(
  documento char(8) not null,
  nombre varchar(30),
  domicilio varchar(30),
  fechaNacimiento date,
  primary key (documento)
 );

3- Ingrese los siguientes registros:
 
 (documento,nombre,domicilio,fechaNacimiento)
  22345345,Mariana Perez,Colon 234,1986-10-08
  23545345,Marcos Morales,Avellaneda 348,1985-12-18
  24356345,Analia Gonzalez,Caseros 444,1976-06-28
  20254125,Ramiro Torres,Dinamarca 209,1978-01-28
  20445778,Carmen Miranda,Uspallata 999,1980-05-30
  28111444,Natalia Figueroa,Sarmiento 856,1986-04-29

4- El institulo quiere conocer las edades de los alumnos:
 
 
B) La empresa que provee de luz a los usuarios de un municipio la luz. 
Almacena en una tabla algunos datos de los usuarios:
 
- documento, cadena siempre de 8 caracteres, no nulo,
- monto a pagar, valor con decimales positivo,
- fecha de vencimiento.
 
Si la boleta no se paga hasta el día del vencimiento, inclusive, se 
incrementa al monto, un 1% del monto cada día de atraso.

1- Elimine la tabla, si existe.

2- Cree la tabla.

3- Ingrese algunos registros con fechas de vencimiento anterior a 
la fecha actual (vencidas) y 
posteriores a la fecha actual (no vencidas).

4- Muestre el documento del usuario, la fecha de vencimiento, 
la fecha actual (en que efectúa el pago), el monto, la cantidad 
de días de atraso (respecto de la fecha de vencimiento), el recargo y 
el total a pagar con el recargo:
 
 


C-) En una página web se solicitan los siguientes datos para 
guardar información de sus visitas: 
 
nombre, mail, pais.

1- Elimine la tabla "visitas", si existe.

2- Créela con la siguiente estructura:
 
 create table visitas (
  numero int unsigned auto_increment,
  nombre varchar(30) not null,
  mail varchar(50),
  pais varchar (20),
  fecha datetime,
  primary key(numero)
);

3- Ingrese algunos registros:
 (nombre,mail,fecha)
 Ana Maria Lopez,AnaMaria@hotmail.com,2006-10-10 10:10
 Gustavo Gonzalez,GustavoGGonzalez@hotmail.com,2006-10-10 21:30
 Juancito,JuanJosePerez@hotmail.com,2006-10-11 15:45
 Fabiola Martinez,MartinezFabiola@hotmail.com,2006-10-12 08:15
 Fabiola Martinez,MartinezFabiola@hotmail.com,2006-09-12 20:45
 Juancito,JuanJosePerez@hotmail.com,2006-09-12 16:20
 Juancito,JuanJosePerez@hotmail.com,2006-09-15 16:25

4- Se necesita el nombre de los usuarios y la hora de visita:
 
5- Se necesita conocer el nombre de los usuarios y el nombre del 
mes de cada visita:
 
6- Se necesita saber la cantidad de visitas por día (lunes, martes...), 
mostrando el nombre del día: