|
Программирование >> Понятие sql
ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ ANY, ALL И SOME ТЕПЕРЬ, КОГДА ВЫ ОВЛАДЕЛИ ОПЕРАТОРОМ EXISTS, Вы узнаете приблизительно три специальных оператора ориентируемых на подзапросы.(Фактически, имеются только два, так как ANY и SOME - одно и то же.) Если вы поймете работу этих операторов, вы будете понимать все типы подзапросов предиката используемых в SQL. Кроме того, вы будете представлены различным способам где данный запрос может быть сформирован используя различные типы подзапросов предиката, ивы поймете преимущества и недостатки каждого из этих подходов. ANY, ALL, и SOME напоминают EXISTS который воспринимает подзапросы как аргументы; однако они отличаются от EXISTS тем, что используются совместно с реляционными операторами. В этом отношении, они напоминают оператор IN когда тот используется с подзапросами; они берут все значения выведенные подзапросом и обрабатывают их как модуль. Однако, в отличие от IN, они могут использоваться только с подзапросами. СПЕЦИАЛЬНЫЕ ОПЕРАТОРЫ ANY или SOME Операторы SOME и ANY - взаимозаменяемы везде и там где мы используем ANY, SOME будет работать точно так же. Различие в терминологии состоит в том чтобы позволить людям использовать тот термин который наиболее однозначен. Это может создать проблему; потому что, как мы это увидим, наша интуиция может иногда вводить в заблуждение. Имеется новый способ нахождения продавца с заказчиками размещенными в их городах (вывод для этого запроса показывается в Рисунке 13.1): SELECT * FROM Salespeople WHERE city = ANY (SELECT city FROM Customers ); Оператор ANY берет все значения выведенные подзапросом,(для этого случая - это все значения city в таблице Заказчиков), и оценивает их как верные если любой (ANY) из их равняется значению города текущей строки внешнего запроса. SELECT * FROM Salespeople WHERE city = ANY (SELECT city FROM Customers); 1001 1002 1004 SQL Execution Log cnum cname Peel Serres Motika city comm London San Jose London 0.12 0.13 0.11 Рисунок 13.1: Использование оператора ANY Это означает, что подзапрос должен выбирать значения такого же типа как и те, которые сравниваются в основном предикате. Вэтомего отличие от EXISTS, который просто определяет, производит ли подзапрос результаты или нет, ифактическине использует эти результаты. ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ IN ИЛИ ВМЕСТО ОПЕРАТОРА ANY EXISTS Мы можем также использовать оператор IN чтобы создать запрос аналогичный предыдущему : SELECT * FROM Salespeople WHERE city IN ( SELECT city FROM Customers ); Этот запрос будет производить вывод показанный в Рисунке 13.2. SQL Execution Log SELECT * FROM Salespeople WHERE city IN (SELECT city FROM Customers); cnum 1001 1002 1004 cname Peel Serres Motika city comm London San Jose London 0.12 0.13 0.11 Рисунок 13.2: Использование IN в качестве альтернативы к ANY Однако, оператор ANY может использовать другие реляционные операторы кроме равняется (=), и таким образом делать сравнения которые являются выше возможностей IN. Например, мы могли бы найти всех продавцов с их заказчиками, которые следуют в алфавитном порядке (вывод показан на Рисунке 13.3) SELECT * FROM Salespeople WHERE sname < ANY ( SELECT cname FROM Customers ); SQL Execution Log SELECT * FROM Salespeople WHERE sname < ANY (SELECT cname FROM Customers); cnum 1001 1004 1003 cname Peel Motika Axelrod city comm London London New York 0.12 0.11 0.10 Рисунок 13.3: Использование оператора ANY с оператором неравно (<) Все строки были выбраны для Serres и Rifkin, потому что нет других заказчиков чьи имена следовали бы за ими в алфавитном порядке. Обратите внимание что это является основным эквивалентом следующему запросу с EXISTS, чей вывод показывается в Рисунке 13.4:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |