60 - Funciones de control de flujo (if)


Problema:

Trabajamos con las tablas "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(30),
  precio decimal(5,2) unsigned,
  primary key (codigo)
 );

Ingresamos algunos registros:

 insert into libros (titulo, autor,editorial,precio)
  values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',50.5);
 insert into libros (titulo, autor,editorial,precio)
  values('Alicia a traves del espejo','Lewis Carroll','Emece',25);
 insert into libros (titulo, autor,editorial,precio) 
  values('El aleph','Borges','Paidos',15);
 insert into libros (titulo, autor,editorial,precio)
  values('Matemática estas ahi','Paenza','Paidos',10);
 insert into libros (titulo, autor,editorial)
  values('Antologia','Borges','Paidos');
 insert into libros (titulo, editorial)
  values('El gato con botas','Paidos');
 insert into libros (titulo, autor,editorial,precio)
  values('Martin Fierro','Jose Hernandez','Emece',90);

No nos interesa el precio exacto de cada libro, sino si el precio es menor o mayor a $50. Podemos utilizar estas sentencias:

 select titulo from libros
  where precio<50;

 select titulo from libros
  where precio >=50;

En la primera sentencia mostramos los libros con precio menor a 50 y en la segunda los demás.

Usamos la función "if":

 select titulo,
  if (precio>50,'caro','economico')
  from libros;

Si el precio del libro es mayor a 50 (primer argumento del "if"), coloca "caro" (segundo argumento del "if"), en caso contrario coloca "economico" (tercer argumento del "if").

Queremos mostrar los nombres de los autores y la cantidad de libros de cada uno de ellos; para ello especificamos el nombre del campo a mostrar ("autor"), contamos los libros con "autor" conocido con la función "count()" y agrupamos por nombre de autor:

 select autor, count(*)
  from libros
  group by autor;

El resultado nos muestra cada autor y la cantidad de libros de cada uno de ellos. Si solamente queremos mostrar los autores que tienen más de 1 libro, es decir, la cantidad mayor a 1, podemos usar esta sentencia:

 select autor, count(*)
  from libros
  group by autor
  having count(*)>1;

Pero si no queremos la cantidad exacta sino solamente saber si cada autor tiene más de 1 libro, podemos usar "if":

 select autor,
  if (count(*)>1,'Más de 1','1')
  from libros
  group by autor;

Si la cantidad de libros de cada autor es mayor a 1 (primer argumento del "if"), coloca "Más de 1" (segundo argumento del "if"), en caso contrario coloca "1" (tercer argumento del "if").

Podemos ordenar por la columna del "if":

 select autor,
  if (count(*)>1,'Más de 1','1') as cantidad
  from libros
  group by autor
  order by cantidad;

Para saber si la cantidad de libros por editorial supera los 4 o es menor:

 select editorial,
  if (count(*)>4,'5 o más','menos de 5') as cantidad
  from libros
  group by editorial
  order by cantidad;

Si la cantidad de libros de cada editorial es mayor a 4 (primer argumento del "if"), coloca "5 o más" (segundo argumento del "if"), en caso contrario coloca "menos de 5" (tercer argumento del "if"). Además, la sentencia ordena la salida por el alias "cantidad".




Retornar