Listado completo de tutoriales

72 - Variables de usuario.


Ver video

Cuando buscamos un valor con las funciones de agrupamiento, por ejemplo "max()", la consulta nos devuelve el máximo valor de un campo de una tabla, pero no nos muestra los valores de otros campos del mismo registro. Por ejemplo, queremos saber todos los datos del libro con mayor precio de la tabla "libros" de una librería, tipeamos:

 select max(precio) from libros;

Para obtener todos los datos del libro podemos emplear una variable para almacenar el precio más alto:

 select @mayorprecio:=max(precio) from libros;

y luego mostrar todos los datos de dicho libro empleando la variable anterior:

 select * from libros
  where precio=@mayorprecio;

Es decir, guardamos en la variable el precio más alto y luego, en otra sentencia, mostramos los datos de todos los libros cuyo precio es igual al valor de la variable.

Las variables nos permiten almacenar un valor y recuperarlo más adelante, de este modo se pueden usar valores en otras sentencias.

Las variables de usuario son específicas de cada conexión, es decir, una variable definida por un cliente no puede ser vista ni usada por otros clientes y son liberadas automáticamente al abandonar la conexión.

Las variables de usuario comienzan con "@" (arroba) seguido del nombre (sin espacios), dicho nombre puede contener cualquier caracter.

Para almacenar un valor en una variable se coloca ":=" (operador de asignación) entre la variable y el valor a asignar.

En el ejemplo, mostramos todos los datos del libro con precio más alto, pero, si además, necesitamos el nombre de la editorial podemos emplear un "join":

 select l.titulo,l.autor,e.nombre
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo
  where l.precio = @mayorprecio;

La utilidad de las variables consiste en que almacenan valores para utilizarlos en otras consultas.

Por ejemplo, queremos ver todos los libros de la editorial que tenga el libro más caro. Debemos buscar el precio más alto y almacenarlo en una variable, luego buscar el nombre de la editorial del libro con el precio igual al valor de la variable y guardarlo en otra variable, finalmente buscar todos los libros de esa editorial:

 select @mayorprecio:=max(precio) from libros;

 select @editorial:=e.nombre
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo
  where precio=@mayorprecio;

 select l.titulo,l.autor,e.nombre
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo
  where e.nombre=@editorial;

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:

 drop table if exists libros, editoriales;

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40),
  autor varchar(20),
  codigoeditorial tinyint unsigned,
  precio decimal(5,2) unsigned,
  primary key(codigo)
 );

 create table editoriales(
  codigo tinyint unsigned auto_increment,
  nombre varchar(20),
  primary key(codigo)
 );

 insert into editoriales values(1,'Planeta');
 insert into editoriales values(2,'Emece');
 insert into editoriales values(3,'Paidos');

 insert into libros values (1,'El aleph','Borges',2,23);
 insert into libros values (2,'Alicia en el pais de las maravillas',
                            'Lewis Carroll',1,15);
 insert into libros values (3,'Matematica estas ahi','Paenza',2,12);
 insert into libros values (4,'Martin Fierro','Jose Hernandez',3,34);
 insert into libros values (5,'Martin Fierro','Jose Hernandez',2,55);
 insert into libros values (6,'Aprenda PHP','Molina Mario',1,45);
 insert into libros values (7,'Java en 10 minutos','Molina Mario',3,42);

 -- Guardamos en una variable el valor de precio más alto:
 select @mayorprecio:=max(precio) from libros;

 -- Mostramos todos los datos de dicho libro empleando la variable anterior:
 select * from libros
  where precio=@mayorprecio;

 -- Empleamos ahora un "join" para ver, además, el nombre de la editorial:
 select l.titulo,l.autor,e.nombre
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo
  where l.precio = @mayorprecio;

 select @mayorprecio:=max(precio) from libros;

 select @editorial:=e.nombre
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo
  where precio=@mayorprecio;

 select l.titulo,l.autor,e.nombre
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo
  where e.nombre=@editorial;
 

Genera una salida similar a esta:

MySQL variables de usuario

Retornar