Saltearse al contenido

Palabras clave

Usando ANY

La palabra clave ANY (algún, alguno) funciona como un modificador del operador a su izquierda, para que funcione con un conjunto de valores en lugar de solo un valor. Su sintaxis es la siguiente:

1
operando operador ANY (subconsulta)

Donde operador es cualquiera de los operadores de comparación: =, >, <, >=, <=, <> o !=.

Su funcionalidad es la siguiente: el operando se va a comparar con todos los valores que devuelva la subconsulta, y devolverá TRUE si al menos uno (alguno) cumple con la condición.

Por ejemplo, digamos que tenemos la siguiente consigna sobre la base de datos World: obtener todas las ciudades cuya población es mayor que la de al menos un país con GNP mayor a 250.000.

Podemos aplicar ANY para resolverla, de la siguiente forma:

1
SELECT city.Name
2
FROM city
3
WHERE Population > ANY (
4
SELECT Population
5
FROM country
6
WHERE GNP > 250000
7
);

Quiere decir que se va a comparar la población de cada ciudad, con la población de todos los países que tengan un GNP mayor a $250.000. Si la población de la ciudad es mayor que al menos uno, se añadirá su nombre al result-set final.

Veamos otro ejemplo:

Digamos que queremos encontrar todas las ciudades que tienen el mismo nombre que algún país (existen varias que se llaman igual que el país al que pertenecen).

Podemos ejecutar la siguiente consulta:

1
SELECT city.Name
2
FROM city
3
WHERE city.Name = ANY (
4
SELECT Name FROM country
5
);

Esta consulta devuelve un result-set de 8 ciudades cuyos nombres son iguales a los de algún país.

Como veremos en la siguiente sección, esta forma particular de ANY (con el operador =) funciona exactamente igual al operador IN.

Usando IN

El operador IN () evalúa a TRUE si el operando a su izquierda aparece al menos una vez en el conjunto de valores a su derecha (en este caso una subconsulta), sino evalúa a FALSE.

1
operando IN (subconsulta)

Como anticipamos, la forma = ANY () genera los mismos resultados que IN () (cuando se utiliza con subconsultas), como podemos observar al ejecutar la misma consulta, sustituyendo = ANY por IN:

1
SELECT city.Name
2
FROM city
3
WHERE city.Name IN (
4
SELECT Name FROM country
5
);

También es posible agregar el operador NOT a la izquierda de IN para obtener el resultado opuesto al operador.

1
operando NOT IN (subconsulta)

Usando ALL

Similar al concepto de ANY, este modificador devuelve TRUE si la condición del operador a su izquierda devuelve TRUE para todos los valores del resultado de la subconsulta a su derecha.

1
operando operador ALL (subconsulta)

Por ejemplo, usando la base de datos World, queremos obtener una lista de las ciudades cuya población es mayor que la población de todas las ciudades del país “Argentina”:

1
SELECT city.Name
2
FROM city
3
WHERE Population > ALL (
4
SELECT city.Population
5
FROM city
6
WHERE city.CountryCode = (
7
SELECT Code
8
FROM country
9
WHERE country.Name = "Argentina"
10
)
11
);

En este caso decidimos utilizar subconsultas anidadas. Como dijimos, podemos utilizar subconsultas dentro de otras subconsultas.

Bibliografía

  1. MySQL Docs - Any in some subqueries
  2. MySQL Docs - All subqueries