domingo, 15 de abril de 2012

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




 

4 comentarios:

  1. Opino lo mismo: GENIAL, 10 y EXCELENTE. Yo también te agradezco este blog

    ResponderEliminar
  2. si tuviera que listar nombres pero que no muestre el nombre juan, maria, ni pedro como seria?

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar