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” );
Вывод будет одинаков для всех трех условий.
ПРАВИЛЬНОЕ ПОНИМАНИЕ ANY И ALL
В SQL, сказать что — значение больше (или меньше) чем любое (ANY) из набора значений — тоже самое что сказать, что оно больше (или меньше) чем любое одно отдельное из этих значений. И наоборот, сказать что значение не равно всему (ALL) набору значений, тоже что сказать, что нет такого значения в наборе, которому оно равно.
КАК ANY, ALL, И EXIST ПОСТУПАЮТ С ОТСУТСТВУЮЩИМИ И НЕИЗВЕСТНЫМИ ДАННЫМИ
Как было сказано, имеются некоторые различия между EXISTS и операторами, представленными в этой главе, относительно того, как они обрабатывают оператор NULL. ANY и ALL также отличаются друг от друга тем, как они реагируют, если подзапрос не произвел никаких значений, чтобы использовать их в сравнении. Эти различия могут привести к непредвиденным результатам на Ваши запросы, если вы не будете их учитывать.
КОГДА ПОДЗАПРОС ВОЗВРАЩАЕТСЯ ПУСТЫМ
Одно значительное различие между ALL и ANY — способ действия в cитуации когда подзапрос не возвращает никаких значений. В принципе, всякий раз, когда допустимый подзапрос не в состоянии сделать вывод, ALL — автоматически верен, а ANY автоматически неправилен. Это означает, что следующий запрос
SELECT *
FROM Customers
WHERE rating > ANY ( SELECT rating
FROM Customers
WHERE city = “Boston” );
не произведет никакого вывода, в то время как запрос
SELECT
FROM Customers
WHERE rating > ALL ( SELECT rating
FROM Customers
WHERE city = 'Boston' );
выведет всю таблицу Заказчиков. Когда нет никаких заказчиков в Boston, естественно, ни одно из этих сравнений не имеет значення.
ANY И ALL ВМЕСТО EXISTS С ПУСТЫМ УКАЗАТЕЛЕМ (NULL)
Значения NULL также имеют некоторые проблемы с операторами наподобии этих. Когда SQL сравнивает два значения в предикате, одно из которых пустое (NULL), то результат неизвестен (смотрите Главу 5). Неизвестный предикат, подобен неверному и является причиной того, что строка не выбирается, но работать он будет иначе в некоторых похожих запросах, в зависимости от того, используют они ALL или ANY вместо EXISTS. Рассмотрим наш предыдущий пример:
Do'stlaringiz bilan baham: |