|
Программирование >> Понятие sql
SQL Execution Log WHERE amt > ANY (SELECT amt FROM Orders a. Customers b WHERE a.cnum = b.cnum AND b.city = San Jose); onum 3001 3003 3002 3006 3009 3007 3008 3010 18.69 767.10 1900.10 1098.10 1713.23 75.10 4723.00 1309.88 odate 10/03/1990 10/03/1990 10/03/1990 10/03/1990 10/04/1990 10/04/1990 10/05/1990 10/06/1990 1007 1001 1004 1007 1003 1002 1001 1002 Рисунок 13.7: Использование ANY с объединением cnum 2008 2001 2007 2008 2002 2004 2006 2004 snum Фактически, вышеуказанные команды весьма похожи на следующее - (вывод показан на Рисунке 13.8): SELECT * FROM Orders WHERE amt < ( SELECT MAX amt FROM Orders A, Customers b WHERE a.cnum = b.cnum AND b.city = San Jose ); SQL Execution Log WHERE amt < (SELECT MAX (amt) FROM Orders a. Customers b WHERE a.cnum = b.cnum AND b.city = San Jose);
Рисунок 13.8: Использование агрегатной функции вместо ANY СПЕЦИАЛЬНЫЙ ОПЕРАТОР ALL С помощью ALL, предикат является верным, если каждое значение выбранное подзапросом удовлетворяет условию в предикате внешнего запроса. Если мы хотим пересмотреть наш предыдущий пример чтобы вывести только тех заказчиков чьи оценки, фактически, выше чем у каждого заказчика в Париже, мы можем ввести следующее чтобы произвести вывод показанный в Рисунке 13.9: SELECT * FROM Customers WHERE rating > ALL ( SELECT rating FROM Customers WHERE city = Rome ); SQL Execution Log SELECT * FROM Customers WHERE rating > ALL (SELECT rating FROM Customers WHERE city = Rome); cnum 2004 2008 cname Grass Cisneros city rating snum Berlin San Jose 300 300 1002 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 < AND inner.city inner.rating Rome ); SQL Execution Log SELECT * FROM Customers outer WHERE NOT EXISTS (SELECT * FROM Customers inner WHERE outer rating = inner.rating AND inner.city = Rome); cnum 2004 2008 cname Grass Cisneros city rating snum Berlin San Jose 300 300 1002 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 ); SQL Execution Log SELECT * FROM Customers WHERE rating <> ALL (SELECT rating FROM Customers WHERE city = San Jose); 2001 2006 2007 cnum cname Hoffman Clemens Pereira city London London Rome rating snum 100 100 100 1001 1001 1004 Рисунок 13.11: Использование ALL с <> Вышеупомянутый подзапрос выберает все оценки для города San Jose. Он выводит набор из двух значений: 200 (для Liu) и 300 (для Cisneros). Затем, основной за-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |