Subconsultas con varias filas y una columna
Si una subconsulta devuelve más de una fila, no se puede usar sin más con operadores de comparación, como hacíamos con las subconsultas escalares.
Sin embargo, con las subconsultas que devuelven varias filas y una columna se pueden usar 3 operadores adicionales.
La subconsulta y el operador ALL
Con el operador ALL podemos comparar un valor concreto con cada uno de los valores del conjunto que devuelve la subconsulta. Esta condición devuelve true solo si todas las comparaciones del valor con los valores del conjunto devuelven true.
Por ejemplo, la siguiente consulta artificial comprueba si todos los alojamientos cumplen la condición de costar menos de 200.
MySQL 8.4SELECT 200 > ALL(SELECT price FROM Rooms)
Veamos un ejemplo más práctico: tenemos que encontrar los nombres de todos los propietarios de alojamientos que nunca han reservado un alojamiento. Para obtener esta lista, podemos hacer lo siguiente:
-
Obtener la lista de nombres de todos los propietarios de alojamientos
MySQL 8.4SELECT DISTINCT name FROM Users INNER JOIN Rooms ON Users.id = Rooms.owner_id -
Obtener la lista de identificadores de todos los usuarios que han reservado algún alojamiento
MySQL 8.4SELECT DISTINCT user_id FROM Reservations -
Filtrar la primera lista de propietarios con la condición de que el identificador del propietario no coincida con ninguno de los identificadores de los usuarios que alguna vez han reservado un alojamiento
MySQL 8.4SELECT DISTINCT name FROM Users INNER JOIN Rooms ON Users.id = Rooms.owner_id WHERE Users.id <> ALL ( SELECT DISTINCT user_id FROM Reservations )
La subconsulta y el operador IN
El operador IN comprueba si un valor concreto forma parte de un conjunto de valores. Ese conjunto puede ser, precisamente, una subconsulta que devuelva varias filas con una columna.
Por ejemplo, si necesitamos obtener toda la información sobre los propietarios de alojamientos que cuestan más de 150 unidades monetarias, podemos hacerlo así:
MySQL 8.4SELECT * FROM Users WHERE id IN ( SELECT DISTINCT owner_id FROM Rooms WHERE price >= 150 )
La subconsulta y el operador ANY
Una condición con ANY se comporta de forma parecida, pero devuelve true si al menos una de las comparaciones del valor con los valores del conjunto devuelve true.
Con él escribiremos la misma consulta que hicimos con el operador IN: buscaremos a los usuarios que tienen al menos un alojamiento que cuesta más de 150.
MySQL 8.4SELECT * FROM Users WHERE id = ANY ( SELECT DISTINCT owner_id FROM Rooms WHERE price >= 150 )