Программирование >>  Понятие sql 

1 ... 31 32 33 [ 34 ] 35 36 37 ... 95


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);

onum

odate

cnum

snum

3002

1900.10

10/03/1990

2007

1004

3005

5160.45

10/03/1990

2003

1002

3009

1713.23

10/04/1990

2002

1003

3008

4723.00

10/05/1990

2006

1001

3011

9891.88

10/06/1990

2006

1001

Рисунок 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). Затем, основной за-



1 ... 31 32 33 [ 34 ] 35 36 37 ... 95

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика