Ключевое слово all
Можно использовать ключевое слово ALL, чтобы определить, меньше или больше значение, чем все значения в результате запроса.
Параметры для запросов, которые используют ключевое слово ALL:
1) ALL изменяет оператор сравнения в тесте запроса и сопровождает его операторами =, <>, <, <=, > или >=;
2) комбинация оператора сравнения и ключевого слова ALL сообщает СУБД, как применить тест сравнения ко всем значениям, которые считал запрос. Например, < ALL обозначает, что сравнение должно быть меньше, чем любое значение в результате запроса, > ALL – сравнение должно быть больше, чем
любое значение в результате запроса;
3) сравнение = ALL возможно, но используется нечасто. = ALL всегда будет ложным условием, только если все значения, считанные запросом, не идентичны (и не равны значению при тестировании);
4) список столбцов команды SELECT запроса может включать только одно выражение или название столбца;
5) если результат запроса не считывает строки, условие ALL становится истинным.
Сравнение всех значений запроса
WHERE test_expr op ALL (subquery)
test_expr – это буквенное значение, название столбца, выражение или запрос, который считывает одно значение;
op – оператор сравнения (=, <>, <, <=, > или >=);
subquery – скалярный запрос, который считывает один столбец.
Если все значения, считанные с помощью запроса, соответствуют условию ALL или результат запроса пустой (имеет строки с нулями), условие ALL задается как истинное. Условие ALL задается как ложное, если какое-либо (хотя бы одно) значение запроса не соответствует условию ALL или если любое значение запроса равно нулю.
Предложение HAVING имеет такую же структуру:
HAVING test_expr op ALL (subquery).
Примеры:
1) Отобразить список авторов, которые живут в городе, где нет ни одного издательства.
SELECT au_id, au_lname, au_fname, city
FROM authors
WHERE city <> ALL
(SELECT city
FROM publishers);
2) Отобразить список книг (не биографий), цена которых меньше, чем цена биографий.
SELECT title_id, title_name
FROM titles
WHERE type <> 'biography'
AND price < ALL
(SELECT price
FROM titles
WHERE type = 'biography'
AND price IS NOT NULL);
Ключевое слово ALL является эквивалентом оператора NOT IN.
Выражения, эквивалентные ALL
Выражение ALL Функция столбца
< ALL (subquery) < MIN (subquery values)
> ALL (subquery) > MAX (subquery values)
Ключевое слово any
Можно использовать слово ANY аналогично ALL. Это слово определяет, равно ли, меньше или больше значение, чем любое (хотя бы одно) значение в результате
Наиболее важные параметры запросов, которые используют это ключевое слово:
1) ANY изменяет оператор сравнения в тесте запроса и сопровождает его операторами =, <>, <, <=, > или >=;
2) комбинация оператора сравнения и ANY сообщает СУБД, как применить тест сравнения ко всем значениям, которые считал запрос. Например, < ANY означает, что сравнение должно быть меньше, чем хотя бы одно значение в результате запроса; > ANY означает, что сравнение должно быть больше, чем хотя бы одно значение в результате запроса;
3) если ANY используется с операторами <, <=, > или >=, сравнение будет эквивалентно расчету максимального или минимального значения в результате запроса. < ANY свидетельствует о том, что значение меньше, чем хотя бы одно значение в запросе, то есть меньше минимального значения; > ANY – больше максимального значения;
4) сравнение = ANY эквивалентно IN;
5) если результат запроса не считывает строки, условие ANY становится ложным.
Сравнение некоторых значений запроса
WHERE test_expr op ANY (subquery).
test_expr – буквенное значение, название столбца, выражение или запрос, который считывает одно значение;
op – оператор сравнения (=, <>, <, <=, > или >=);
subquery – скалярный запрос, который считывает один столбец.
Если хотя бы одно значение, считанное с помощью запроса, соответствует условию ANY, то это условие задается как истинное. Условие ANY задается как ложное, если ни одно значение запроса не соответствует условию или если запрос пуст (содержит строки с нулями) либо содержит только нули.
Предложение HAVING имеет такую же структуру:
HAVING test_expr op ANY (subquery)
Примеры:
1) Отобразить список всех авторов, которые живут в городе, где расположено издательство.
SELECT au_id, au_lname, au_fname, city
FROM authors
WHERE city = ANY
(SELECT city
FROM publishers);
2) Отобразить список всех книг (не биографий), цена которых меньше, чем цена хотя бы одной биографии.
SELECT title_id, title_name
FROM titles
WHERE type <> 'biography'
AND price < ANY
(SELECT price
FROM titles
WHERE type = 'biography');
В отличие от примера с ALL, условие IS NOT NULL здесь не нужно.
Ключевое слово ANY эквивалентно IN, однако <> ANY не является эквивалентом NOT IN. Если запрос считал значения x, y, z, то выражение:
test_expr <> ANY (subquery)
является эквивалентом
test_expr <> x OR
test_expr <> y OR
test_expr <> z
Но выражение
test_expr NOT IN (subquery)
является эквивалентом
test_expr <> x AND
test_expr <> y AND
test_expr <> z
(NOT IN эквивалентно <> ALL).
