Основы SQL


ИСПОЛЬЗОВАНИЕ IN ИЛИ EXISTS ВМЕСТО ANY


Мы можем также использовать оператор IN для создания запроса, аналогичного предыдущему:

SELECT * FROM Salespeople WHERE city IN (SELECT city FROM Customers);

Этот запрос даст вывод, показанный на Рисунке 13.2.

Однако оператор ANY может использовать другие реляционные операторы, помимо равно (=), и, таким образом, делать сравнения, которые превосходят возможности IN. Например, мы могли бы найти всех продавцов с их заказчиками, которые следуют в алфавитном порядке (вывод показан на Рисунке 13.3).

SELECT * FROM Salespeople WHERE sname < ANY (SELECT cname FROM Customers);

=============== SQL Execution Log ============ | SELECT * | | FROM Salespeople | | WHERE city IN | | (SELECT city | | FROM Customers); | | ============================================= | | cnum cname city comm | | ----- -------- ---- -------- | | 1001 Peel London 0.12 | | 1002 Serres San Jose 0.13 | | 1004 Motika London 0.11 | =============================================

Рисунок 13.2 Использование IN в качестве альтернативы ANY

=============== SQL Execution Log ============ | SELECT * | | FROM Salespeople | | WHERE sname < ANY | | (SELECT cname | | FROM Customers); | | ============================================= | | cnum cname city comm | | ----- -------- ---- -------- | | 1001 Peel London 0.12 | | 1004 Motika London 0.11 | | 1003 Axelrod New York 0.10 | =============================================

Рисунок 13.3 Использование оператора ANY с операцией "меньше" (<)

продавцов для их заказчиков, которые упорядочены в алфавитном порядке (вывод показан на Рисунке 13.3).

SELECT * FROM Salespeople WHERE sname < ANY (SELECT cname FROM Customers);

Все строки были выбраны для Serres и Rifkin, потому что нет других заказчиков, чьи имена следовали бы за ними в алфавитном порядке. Обратите внимание, что это является основным эквивалентом следующему запросу с EXISTS, вывод которого показан на Рисунке 13.4:

SELECT * FROM Salespeople outer WHERE EXISTS (SELECT * FROM Customers inner WHERE outer.sname < inner.cname);




Начало  Назад  Вперед