Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Подзапросы и структурированные запросы




 

Подзапрос – дополнительный метод манипулирования несколькими таблицами. Другими словами, это инструкция SELECT, вложенная:

· в предложение WHERE, HAVING или SELECT;

· в инструкцию INSERT, UPDATE или DELETE;

· в другой подзапрос.

Именно возможность вложение инструкций SQL друг в друга является причиной, по которой SQL получил свое название – Structured Query Language (структурированный язык запросов). Подзапросы могут иметь один из трех типов в зависимости от предложения WHERE внешнего запроса:

· подзапросы, которые не возвращают ни одного или возвращают несколько элементов и начинаются со слова IN или оператора сравнения и содержат ключевые слова ANY или ALL;

· подзапросы, которые возвращают единственное значение и начинаются с простого оператора сравнения;

· подзапросы, которые представляют собой проверку (тест) на существование и начинаются с ключевого слова EXISTS.

Рассмотрим примеры.

Чтобы узнать фамилии клиентов, которые останавливались в гостинице в феврале, можно выполнить следующий запрос:

 

SELECT Фамилия FROM Клиент

WHERE Код_клиента IN

(SELECT Код_клиента FROM Проживает

WHERE MONTH(П.Дата_прибытия) = 2

AND YEAR(П.Дата_прибытия) = 2006)

 

Рассмотрим, для чего нужны ключевые слова ANY и ALL. Если воспользоваться оператором сравнения >, то >ALL означает «больше, чем каждое значение». ANY означает «больше любого значения». Например, определим список клиентов, прибывших в гостиницу после Алексеева и Поповича.

 

SELECT К.Фамилия

FROM Проживает П, Клиент К

WHERE П.Код_клиента = К.Код_клиента

AND П.Дата_прибытия > ALL

(SELECT П1.Дата_прибытия

FROM Проживает П1, Клиент К1

WHERE П1.Код_клиента = К1.Код_клиента

AND К1.Фамилия IN ('Алексеев', 'Попович'))

 

Если внутренний подзапрос, стоящий после оператора сравнения и слова ALL, возвращает в качестве одного из значений NULL, то считается, что в целом запрос завершился неудачно.

Оператор ANY полностью эквивалентен оператору IN. Однако оператор <> ANY существенно отличается от оператора NOT IN. Например, следующие два запроса вернут разные результаты:

 

1. SELECT Код_клиента

FROM Клиент

WHERE Код_клиента NOT IN

(SELECT Код_клиента FROM Проживает

WHERE Дата_прибытия > '02/02/01')

 

Результат выборки:

 

Код_клиента

-----------

 

(3 row(s) affected)

 

2. SELECT Код_клиента

FROM Клиент

WHERE Код_клиента <> ANY

(SELECT Код_клиента FROM Проживает

WHERE Дата_прибытия > '02/02/01')

 

Второй запрос выводит коды всех клиентов. Это происходит потому, что оператор <>ANY трактуется как <>a ИЛИ <>b ИЛИ <>c, где a, b, c элементы списка, получаемые с помощью подзапроса.

Когда запрос начинается с ключевого слова EXISTS, он действует как «тест на существование». Другими словами, ключевое слово EXISTS в предложении WHERE выполняет проверку на существование (или отсутствие) данных, которые удовлетворяют критериям соответствующего подзапроса. Такие подзапросы имеют общую форму:

 

Начало инструкции SELECT, INSERT, UPDATE, DELETE или подзапроса

WHERE [NOT] EXISTS (подзапрос)

[Окончание инструкции SELECT, INSERT, UPDATE, DELETE или подзапроса]

 

Например, следующий запрос выводит список клиентов, проживавших в гостинице в 2006 году:

 

SELECT Фамилия

FROM Клиент

WHERE EXISTS

(SELECT * FROM Проживает

WHERE Код_клиента=Клиент.Код_клиента

AND YEAR(Дата_прибытия)=2006)

 

Синтаксис подзапросов, начинающихся с EXISTS, отличается от синтаксиса других подзапросов следующим:

· ключевому слову EXISTS не предшествует имя столбца, константа или какое-либо другое выражение;

· список выбора подзапроса практически всегда содержит только символ звездочки, поскольку выполняется лишь тест на существование строк, которые удовлетворяют условиям подзапроса.

Использование ключевых слов EXISTS и NOT EXISTS позволяет реализовать выполнение двух операций из теории множеств: поиск пересечения и разности. Пересечение двух множеств содержит все элементы, которые принадлежат обоим исходным множествам, а разность содержит элементы, принадлежащие только первому из двух множеств и не входящие во второе множество.

 




Поделиться с друзьями:


Дата добавления: 2014-11-20; Просмотров: 759; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.