Los operadores "exists" y "not exists" se emplean para determinar si hay o no datos en una lista de valores.
Estos operadores pueden emplearse con subconsultas correlacionadas para restringir el resultado de una consulta exterior a los registros que cumplen la subconsulta (consulta interior). Estos operadores retornan "true" (si las subconsultas retornan registros) o "false" (si las subconsultas no retornan registros).
Cuando se coloca en una subconsulta el operador "exists", SQLite analiza si hay datos que coinciden con la subconsulta, no se devuelve ningún registro, es como un test de existencia; SQLite termina la recuperación de registros cuando por lo menos un registro cumple la condición "where" de la subconsulta.
La sintaxis básica es la siguiente:
... where exists (SUBCONSULTA);
Un comercio que vende artículos de librería y papelería almacena la información de sus ventas en una tabla llamada "facturas" y otra "detalles".
Eliminamos las tablas si existen:
drop table if exists facturas; drop table if exists detalles;
Creamos las dos tablas con la siguiente estructura:
create table facturas( numero integer primary key, cliente text ); create table detalles( numerofactura integer not null, numeroitem integer not null, articulo text, precio real, cantidad integer, primary key(numerofactura,numeroitem) );
Almacenamos algunas filas para pruebas:
insert into facturas(numero,cliente) values(1200,'Juan Lopez'); insert into facturas(numero,cliente) values(1201,'Luis Torres'); insert into facturas(numero,cliente) values(1202,'Ana Garcia'); insert into facturas(numero,cliente) values(1300,'Juan Lopez'); insert into detalles(numerofactura,numeroitem,articulo,precio,cantidad) values(1200,1,'lapiz',1,100); insert into detalles(numerofactura,numeroitem,articulo,precio,cantidad) values(1200,2,'goma',0.5,150); insert into detalles(numerofactura,numeroitem,articulo,precio,cantidad) values(1201,1,'regla',1.5,80); insert into detalles(numerofactura,numeroitem,articulo,precio,cantidad) values(1201,2,'goma',0.5,200); insert into detalles(numerofactura,numeroitem,articulo,precio,cantidad) values(1201,3,'cuaderno',4,90); insert into detalles(numerofactura,numeroitem,articulo,precio,cantidad) values(1202,1,'lapiz',1,200); insert into detalles(numerofactura,numeroitem,articulo,precio,cantidad) values(1202,2,'escuadra',2,100); insert into detalles(numerofactura,numeroitem,articulo,precio,cantidad) values(1300,1,'lapiz',1,300);
Empleamos una subconsulta correlacionada con un operador "exists" en la cláusula "where" para devolver la lista de clientes que compraron el artículo "lapiz":
select cliente,numero from facturas as f where exists (select *from detalles as d where f.numero=d.numerofactura and d.articulo='lapiz');
Buscamos los clientes que NO han comprado el artículo "lapiz":
select cliente,numero from facturas as f where not exists (select *from detalles as d where f.numero=d.numerofactura and d.articulo='lapiz');
Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada "inscriptos" en la cual almacena el número de "socio", el código del deporte en el cual se inscribe y la cantidad de cuotas pagas (desde 0 hasta 10 que es el total por todo el año), y una tabla denominada "socios" en la que guarda los datos personales de cada socio.
Borrar las tablas "socios" e "inscriptos".
Crear las tablas con las siguientes estructuras:
create table socios( numero integer primary key, documento text, nombre text, domicilio text ); create table inscriptos ( numerosocio integer not null, deporte text not null, cuotas integer, primary key(numerosocio,deporte) );
Almacenar algunas filas de ejemplo:
insert into socios(documento,nombre,domicilio) values('23333333','Alberto Paredes','Colon 111'); insert into socios(documento,nombre,domicilio) values('24444444','Carlos Conte','Sarmiento 755'); insert into socios(documento,nombre,domicilio) values('25555555','Fabian Fuentes','Caseros 987'); insert into socios(documento,nombre,domicilio) values('26666666','Hector Lopez','Sucre 344'); insert into inscriptos values(1,'tenis',1); insert into inscriptos values(1,'basquet',2); insert into inscriptos values(1,'natacion',1); insert into inscriptos values(2,'tenis',9); insert into inscriptos values(2,'natacion',1); insert into inscriptos values(2,'basquet',0); insert into inscriptos values(2,'futbol',2); insert into inscriptos values(3,'tenis',8); insert into inscriptos values(3,'basquet',9); insert into inscriptos values(3,'natacion',0); insert into inscriptos values(4,'basquet',10);
Emplee una subconsulta con el operador "exists" para devolver la lista de socios que se inscribieron en 'natacion'.
Busque los socios que NO se han inscripto en 'natacion' empleando "not exists".
Muestre todos los datos de los socios que han pagado todas las cuotas.
drop table if exists socios; drop table if exists inscriptos; create table socios( numero integer primary key, documento text, nombre text, domicilio text ); create table inscriptos ( numerosocio integer not null, deporte text not null, cuotas integer, primary key(numerosocio,deporte) ); insert into socios(documento,nombre,domicilio) values('23333333','Alberto Paredes','Colon 111'); insert into socios(documento,nombre,domicilio) values('24444444','Carlos Conte','Sarmiento 755'); insert into socios(documento,nombre,domicilio) values('25555555','Fabian Fuentes','Caseros 987'); insert into socios(documento,nombre,domicilio) values('26666666','Hector Lopez','Sucre 344'); insert into inscriptos values(1,'tenis',1); insert into inscriptos values(1,'basquet',2); insert into inscriptos values(1,'natacion',1); insert into inscriptos values(2,'tenis',9); insert into inscriptos values(2,'natacion',1); insert into inscriptos values(2,'basquet',0); insert into inscriptos values(2,'futbol',2); insert into inscriptos values(3,'tenis',8); insert into inscriptos values(3,'basquet',9); insert into inscriptos values(3,'natacion',0); insert into inscriptos values(4,'basquet',10); select nombre from socios as s where exists (select *from inscriptos as i where s.numero=i.numerosocio and i.deporte='natacion'); select nombre from socios as s where not exists (select *from inscriptos as i where s.numero=i.numerosocio and i.deporte='natacion'); select s.* from socios as s where exists (select *from inscriptos as i where s.numero=i.numerosocio and i.cuotas=10);
Puede ejecutar comandos de SQLite directamente en el sitio sin tener que instalar nada en su computadora.