domingo, 15 de abril de 2012

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

1 comentario:

  1. Muy bueno, Jhon. Para comprender la sintaxis de los patrones, genial

    ResponderEliminar