РАВЕНСТВА И НЕРАВЕНСТВА ⇐ ПредыдущаяСтр 3 из 3
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' );
=============== SQL Execution Log ============ | | | 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' ); Вывод будет одинаков для всех трех условий. ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|