34 - Cláusulas limit y offset del comando select

Las cláusulas "limit" y "offset" se usan para restringir los registros que se retornan en una consulta "select".

La cláusula limit recibe un argumento numérico positivo que indica el número máximo de registros a retornar; la cláusula offset indica el número del primer registro a retornar. El número de registro inicial es 0 (no 1).

Si el limit supera la cantidad de registros de la tabla, se limita hasta el último registro.

Ejemplo:

 select * from libros limit 4 offset 0;

Muestra los primeros 4 registros, 0,1,2 y 3.

Si tipeamos:

 select * from libros limit 4 offset 5;

recuperamos 4 registros, desde el 5 al 8.

Si se coloca solo la cláusula limit retorna tantos registros como el valor indicado, comenzando desde 0. Ejemplo:

 select * from libros limit 8;

Muestra los primeros 8 registros.

Es conveniente utilizar la cláusula order by cuando utilizamos limit y offset, por ejemplo:

 select * from libros order by codigo limit 8;

Problema resuelto

Trabajar con la tabla "peliculas".

drop table if exists peliculas;

Crear la tabla con la siguiente estructura:

create table peliculas (
	codigo integer primary key,
	titulo text,
	actor text,
	duracion integer
);

Insertar estos 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','Julio Chavez',100);
 insert into peliculas (titulo,actor,duracion)
  values('Elsa y Fred','China Zorrilla',110);  

Realizar una consulta limitando la salida a sólo 5 registros:

 select * from peliculas limit 5;  

Mostrar los primeros 3 registros ordenado por el título:

 select * from peliculas order by titulo limit 3;

Mostrar los primeros 4 registros ordenado por el título a partir del segundo:

 select * from peliculas order by titulo limit 4 offset 1; 

Acotaciones

Podemos utilizar la siguiente sintaxis comprimida:

 select * from peliculas limit 2,5;  

El primer valor después de la cláusula limit indica el offset y el siguiente la cantidad de registros a recuperar.

Problema propuesto

Trabajar con la tabla "autos"

  1. Borrar la tabla "autos" si existe

  2. Crear la tabla autos con la siguiente estructura:

     create table autos(
    	patente text primary key,
    	marca text,
    	modelo integer,
    	precio real
     );
    
    
  3. Inserte estos registros:

     insert into autos(patente, marca, modelo, precio)
      values('AC123FG', 'Fiat 128', 1970, 15000);
     insert into autos(patente, marca, modelo, precio)
      values('AC234GG', 'Renault 11', 1980, 40000);
     insert into autos(patente, marca, modelo, precio)
      values('CD333QQ', 'Peugeot 505', 1990, 80000);
     insert into autos(patente, marca, modelo, precio)
      values('GD123TY', 'Renault Clio', 1990, 70000);
     insert into autos(patente, marca, modelo, precio)
      values('CC333MG', 'Renault Megane', 1998, 95000);
     insert into autos(patente, marca, modelo, precio)
      values('BV543TR', 'Fiat 128', '1975', 20000); 
    
  4. Imprimir los tres autos más caros.

  5. Imprimir el segundo auto con menor precio.

  6. Utilizar la sintaxis resumida para imprimir a partir del tercer auto más caro, los dos primeros.

Solución
drop table if exists autos;

 create table autos(
	patente text primary key,
	marca text,
	modelo integer,
	precio real
 );
 
 insert into autos(patente, marca, modelo, precio)
  values('AC123FG', 'Fiat 128', 1970, 15000);
 insert into autos(patente, marca, modelo, precio)
  values('AC234GG', 'Renault 11', 1980, 40000);
 insert into autos(patente, marca, modelo, precio)
  values('CD333QQ', 'Peugeot 505', 1990, 80000);
 insert into autos(patente, marca, modelo, precio)
  values('GD123TY', 'Renault Clio', 1990, 70000);
 insert into autos(patente, marca, modelo, precio)
  values('CC333MG', 'Renault Megane', 1998, 95000);
 insert into autos(patente, marca, modelo, precio)
  values('BV543TR', 'Fiat 128', '1975', 20000);  

 select * from autos order by precio desc limit 3;
 
 select * from autos order by precio limit 1 offset 1;
 
 select * from autos order by precio desc limit 2,2; 
 
   

Ejecución de ejercicios online

Puede ejecutar comandos de SQLite directamente en el sitio sin tener que instalar nada en su computadora.

Resultado.....