Clase 09 · 19 minGratis
IN, EXISTS, ANY y ALL
Clase 9 del curso gratis SQL desde Cero: operadores que comparan contra el resultado de una subconsulta. IN con listas dinámicas, EXISTS para registros relacionados y cómo reemplazar ANY y ALL en SQLite.
Toca cualquier marca ▸ 0:00 de los apuntes y el video salta a ese momento. Abrir en YouTube
Estos operadores trabajan con conjuntos de valores, y ese conjunto puede salir de una subconsulta . La base tiene tres tablas :
productos (id, nombre, precio), clientes (id, nombre, ciudad, edad) y
ventas, que dice qué cliente compró qué producto, cuántas unidades y cuándo.
IN con una subconsulta
En la clase 4, la lista de IN estaba escrita a mano. Ahora sale de los datos:
los clientes que hicieron al menos una compra.
La subconsulta de un IN tiene que devolver una sola columna: un valor
por registro . Y con NOT IN, los que nunca compraron.
EXISTS: ¿hay al menos un registro relacionado?
EXISTS no compara valores: devuelve verdadero si la subconsulta trae al
menos una fila y falso si viene vacía . Por eso da
igual qué selecciones adentro; se acostumbra SELECT 1.
Los productos que alguna vez se vendieron en más de dos unidades :
La subconsulta mira, producto por producto, si hay una venta suya que cumpla
la condición. Solo el reloj de titanio . Lo mismo se
puede resolver con un INNER JOIN y un filtro :
Usa la que te resulte más intuitiva: las dos devuelven lo mismo .
ANY y ALL
precio > ANY (lista)— verdadero si es mayor que al menos uno de la lista. Basta con superar al mínimo .precio > ALL (lista)— verdadero si es mayor que todos. Hay que superar al máximo.
SQLite no tiene ANY ni ALL (PostgreSQL, SQL
Server y MySQL sí). La equivalencia con MIN y MAX funciona en cualquier
motor. Los productos más caros que alguno de los productos 1, 2 y 3 (que
cuestan 50, 120 y 300) :
Y los más caros que todos ellos :
Solo el reloj de titanio, de 400, supera a los tres . Siempre hay una forma de escribir la consulta sin el operador que tu motor no tiene .
Retos de esta clase
1. Los productos que nunca se han vendido.
2. Con EXISTS: los clientes que compraron algún producto de más de 100.
Todas las columnas de clientes.
3. Los clientes mayores que todos los clientes de Cuenca (sin ALL).
