Равенства и неравенства

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) набору значений, тоже, что сказать, что нет такого значения в наборе которому оно равно.    
 

‹ Специальный оператор ALL
Вверх
Правильное понимание ANY и ALL ›

Оцените статью
Айтистанция
Добавить комментарий

Adblock
detector