Вход/Регистрация
Понимание SQL
вернуться

Грубер Мартин

Шрифт:

FROM Customers outer

WHERE NOT EXISTS

( SELECT *

FROM Customers inner

WHERE outer.rating <=inner.rating

AND inner.city=|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

cname

city

rating

snum

2004

Grass

Berlin

300

1002

2008

Cisneros

San Jose

300

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

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

Вывод будет одинаков для всех трех условий.

ПРАВИЛЬНОЕ ПОНИМАНИЕ ANY И ALL

В SQL, сказать что - значение больше( или меньше ) чем любое(ANY) из набора значений - тоже самое что сказать, что оно больше( или меньше ) чем любое одно отдельное из этих значений. И наоборот, сказать что значение не равно всему(ALL) набору значений, тоже что сказать, что нет такого значения в наборе которому оно равно.

КАК ANY, ALL, И EXIST ПОСТУПАЮТM С ОТСУТСТВУЮЩИМИ И НЕИЗВЕСТНЫМИ ДАННЫМИ

Как было сказано, имеются некоторые различия между EXISTS и операторами представленными в этой главе относительно того как они обрабатывают оператор NULL. ANY и ALL также отличаются друг от друга тем как они реагируют если подзапрос не произвел никаких значений чтобы использовать их в сравнении. Эти различия могут привести к непредвиденным результатам на Ваши запросы если вы не будете их учитывать.

КОГДА ПОДЗАПРОС ВОЗВРАЩАЕТСЯ ПУСТЫМ
  • Читать дальше
  • 1
  • ...
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: