Скачиваний:
25
Добавлен:
01.04.2014
Размер:
761.34 Кб
Скачать

160 Понимание sql

______________________________________________________________________

ГЛ. 13

РАВЕНСТВА И НЕРАВЕНСТВА

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

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ ANY, ALL, И SOME 161

______________________________________________________________________

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:

Соседние файлы в папке ПОНИМАНИЕ SQL