Грубер Мартин
Шрифт:
SELECT * FROM Salespeople WHERE city=ANY
(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. 1: Использование оператора ANY
Это означает, что подзапрос должен выбирать значения такого же типа как и те, которые сравниваются в основном предикате. В этом его отличие от EXISTS, который просто определяет, производит ли подзапрос результаты или нет, и фактически не использует эти результаты.
ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ 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);
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
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, потому что нет других заказчиков чьи имена следовали бы за ими в алфавитном порядке.
Обратите внимание что это является d основнjм эквивалентом следующему запросу с EXISTS, чей вывод показывается в Таблице 13.4:
SELECT *
FROM Salespeople outer
WHERE EXISTS
( SELECT *
FROM Customers inner
WHERE outer.sname < inner.cname );
SELECT * FROM Salespeople outer
WHERE EXISTS (SELECT *
FROM Customers inner WHERE outer.sname < inner.cname);
cnum | cname | city | comm |
1001 | Peel | London | 0.12 |
1004 | Motika | London | 0.11 |
1003 | Axelrod | New York | 0.10 |