domingo, 8 de abril de 2012

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



3 comentarios: