========= СПЕЦИАЛЬНЫЙ ОПЕРАТОР ALL ==========
С помощью ALL, предикат является верным, если каждое
значение выбранное подзапросом удовлетворяет условию в предикате внешнего запроса. Если мы хотим
пересмотреть наш
предыдущий пример чтобы вывести только тех заказчиков чьи оценки, фактически, выше чем у каждого
заказчика в Париже,
мы можем ввести следующее чтобы произвести вывод показанный в Рисунке 13.9:
SELECT * FROM Customers WHERE rating
> ALL (SELECT rating FROM Customers WHERE city = Rome ):
cnum |
cname |
city |
rating |
snum |
2004 |
Grass |
Berlin |
300 |
1002 |
2008 |
Cisneros |
San Jose |
300 |
1007 |
Рисунок 13.9: Использование оператора ALL
Этот оператор проверяет значения оценки всех заказчиков в Риме. Затем он находит
заказчиков с оценкой большей чем у любого из заказчиков в Риме. Самая высокая оценка в Риме - у
Giovanni( 200 ).
Следовательно, выбираются только значения выше этих 200. Как и в случае с ANY, мы можем использовать
EXISTS для
производства альтернативной формулировки такого же запроса - ( вывод показан на Рисунке 13.10 ):
SELECT * FROM Customers outer
WHERE NOT EXISTS
( SELECT * FROM Customers inner WHERE outer.rating < = inner.rating AND inner.city = .Romeю );
cnum |
cname |
city |
rating |
snum |
2004 |
Grass |
Berlin |
300 |
1002 |
2008 |
Cisneros |
San Jose |
300 |
1007 |
Рисунок 13.10: Использование EXISTS в качестве альтернативы к ALL
РАВЕНСТВА И НЕРАВЕНСТВА ALL используется в основном
с неравенствами чем с равенствами, так как значение может быть "равным для всех" результатом подзапроса
только если
все результаты, фактически, идентичны. Посмотрите следующий запрос:
SELECT * FROM Customers WHERE rating = ALL (
SELECT rating FROM Customers WHERE city = " San Jose' );
Эта команда допустима, но , c этими данными, мы не получим
никакого вывода. Только в единственом случае вывод будет выдан этим запросом - если все значения
оценки в San Jose
окажутся идентичными. В этом случае, можно сказать следующее :
SELECT * FROM Customers WHERE rating = ( SELECT
DISTINCT rating FROM Customers WHERE city = " San Jose' );
Основное различие в том, что эта последняя команда должна
потерпеть неудачу если подзапрос выведет много значений, в то время как вариант с ALL просто не даст
никакого вывода. В
общем, не самая удачная идея использовать запросы которые работают только в определенных ситуациях
подобно этой. Так
как ваша база данных будет постоянно меняться, это неудачный способ, чтобы узнать о ее содержании.
Однако, ALL может
более эффективно использоваться с неравенствами, то есть с оператором "< >". Но учтите что сказанное в
SQL что -
значение которое не равняется всем результатам подзапроса, - будет отличаться от того же но сказанного
с учетом
граматики Английского языка. Очевидно, если подзапрос возвращает много различных значений, как это
обычно бывает, ни
одно отдельное значение не может быть равно им всем в обычном смысле. В SQL, выражение - < > ALL - в
действительности соответствует " не равен любому " результату подзапроса. Другими словами, предикат
верен, если данное
значение не найдено среди результатов подзапроса. Следовательно, наш предыдущий пример противоположен
по смыслу
этому примеру (с выводом показанным в Рисунке 13.11):
SELECT * FROM Customers WHERE rating < > ALL ( SELECT rating
FROM Customers WHERE city = " San Jose' );
cnum |
cname |
city |
rating |
snum |
2001 |
Hoffman |
London |
100 |
1001 |
2006 |
Clemens |
London |
100 |
1001 |
2007 |
Pereira |
Rome |
100 |
1004 |
Рисунок 13.11: Использование ALL с < >
Вышеупомянутый
подзапрос выберает все оценки для города San Jose. Он выводит набор из двух значений: 200 ( для Liu )
и 300 (для Cisneros).
Затем, основной запрос, выбирает все строки, с оценкой не совпадающей ни с одной из них - другими
словами все строки с
оценкой 100. Вы можете сформулировать тот же самый запрос используя оператор NOT IN:
SELECT* FROM Customers
WHERE rating NOT IN ( SELECT rating FROM Customers WHERE city = " San Jose' );
Вы могли бы также
использовать оператор
ANY:
SELECT * FROM Customers WHERE NOT rating = ANY ( SELECT rating FROM Customers WHERE city = " San Jose' );
Вывод будет одинаков для всех трех условий.