Базы данных
и язык SQL

Функции ALL и ANY в SQL: больше всех, равно хотя бы какому-либо

Действие кванторных функций SQL ALL и ANY

Функции SQL ALL и ANY называются кванторными функциями. Аргументом такой функции является множество значений некоторого учитываемого столбца в подзапросе вида

... ALL (SELECT ИМЯ_УЧИТЫВАЕМОГО СТОЛБЦА FROM ИМЯ_ТАБЛИЦЫ [WHERE УСЛОВИЕ])

Приведённая часть запроса может быть прочитана как "все значения учитываемого столбца"

По аналогии поясним действие функции ANY. Часть запроса

... ANY (SELECT ИМЯ_УЧИТЫВАЕМОГО СТОЛБЦА FROM ИМЯ_ТАБЛИЦЫ [WHERE УСЛОВИЕ])

может быть прочитана как "хотя бы какое-либо значения учитываемого столбца". У функции ANY есть синоним - SOME (действует полностью идентично).

Функции ALL и ANY применяются с операторами сравнения (>, <, >=, <=, =).

ALL в SQL: больше всех

Функция ALL применяется обычно для получения выборки, характеризуемой значениями учитываемого столбца, которые больше (или меньше) всех значений того же столбца другой выборки, которая извлекается подзапросом.

В примерах работаем с базой данных "Недвижимость". Таблица Object содержит данные об объектах, причём Space_Total - это общая площадь объекта, а District - район, в котором он находится. Таблица Deal содержит данные о сделках, причём значение столбца Type может быть или Sale (продажа), или Rent (аренда).Таблица Client содержит данные соответственно о клиентах.

Пример 1. Требуется получить общую площадь и районы объектов, у которых общая площадь больше общей площади всех (любого из) объектов, расположенных в районе "Сосновка". Пишем запрос с использованием функции ALL:

SELECT Space_Total, District FROM OBJECT WHERE Space_Total > ALL (SELECT Space_Total FROM OBJECT WHERE District='Сосновка'

В нашей базе данных объекты, расположенные в Сосновке, имеют значения общей площади 120, 33, 60, 44, 33. При помощи сравнения со всем множеством этих значений получена следующая выборка:

Space_TotalDistrict
146Волжский
210Волжский

ANY в SQL: равно хотя бы какому-либо

Функция ANY (или её полный аналог SOME) применяется для получения выборки, характеризуемой значениями учитываемого столбца, которые равны хотя бы какому-либо из значений того же столбца другой выборки, которая извлекается подзапросом.

Пример 2. Требуется найти клиентов, которые заключили сделки на аренду недвижимости. Напомним: в таблице Deal (сделка) значение столбца Type может быть или Sale (продажа), или Rent (аренда). Пишем запрос с использованием функции ANY, в котором основной запрос обращён к таблице CLIENT, а подзапрос - к таблице DEAL:

SELECT Client_ID FROM CLIENT WHERE Client_ID = ANY (SELECT Client_ID FROM DEAL WHERE Type='rent'

В нашей базе нашлись два клиента, заключившие сделки на аренду недвижимости. Получена следующая выборка:

Client_ID
3
8

Сравнение с результатом, возвращаемым функцией ANY можно инвертировать при помощи ключевого слова NOT. Тогда прочтение смысла запроса с использованием этой функции будет следующим: "не равно ни одному из каких-либо".

Пример 3. Требуется найти объекты, с которыми не были заключены сделки. Пишем запрос с использованием функции ANY, в котором основной запрос обращён к таблице OBJECT, а подзапрос - к таблице DEAL:

SELECT Obj_ID FROM OBJECT WHERE NOT Obj_ID = ANY (SELECT Object_ID FROM DEAL

В нашей базе нашёлся один объект, с которым ещё не заключена сделка. Получена следующая выборка:

Obj_ID
13

Поделиться с друзьями

Реляционные базы данных и язык SQL