Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Вложенные подзапросы с предикатом IN




Простые вложенные подзапросы используются для представления множества значений, исследование которых должно осуществляться в каком-либо предикате IN 1. Подзапрос с одним уровнем вложенности Выдать название и телефон поставщиков продукта с кодом 9, т.е. моркови.

SELECT Поставщик, Телефон

FROM Поставщики

WHERE КодПост IN

(SELECT КодПост

FROM Поставки

WHERE КодПрод=9);

Как уже отмечалось, при обработке полного запроса система выполняет прежде всего вложенный подзапрос. Этот подзапрос выдает множество номеров поставщиков, которые поставляют продукт с кодом КодПрод = 9, а именно множество (1, 2, 3). Поэтому первоначальный запрос эквивалентен такому простому запросу:

SELECT Поставщик, Телефон

FROM Поставщики

WHERE КодПост IN (1,2,3);

Результат запроса

 

2. Подзапрос с несколькими уровнями вложенности

Пусть требуется узнать не поставщиков продукта 9, как это делалось в предыдущем запросе, а поставщиков моркови

SELECT Поставщик, Телефон

FROM Поставщики

WHERE КодПост IN

(SELECT КодПост

FROM Поставки

WHERE КодПрод IN

(SELECT КодПрод

FROM Продукты

WHERE Продукт = 'Морковь'));

В данном случае результатом самого внутреннего подзапроса является только одно значение (9). Как уже было показано выше, подзапрос следующего уровня в свою очередь дает в результате множество (1, 2, 3). Последний, самый внешний SELECT, вычисляет приведенный выше окончательный результат. Вообще допускается любая глубина вложенности подзапросов.

SQL позволяет одни и те же запросы формулировать несколькими способами.

Тот же результат можно получить с помощью следующего запроса:

SELECT Поставщик, Телефон

FROM Поставщики, Поставки, Продукты

WHERE Поставщики.КодПост = Поставки.КодПост

AND Поставки.КодПрод = Продукты.КодПрод

AND Продукт = 'Морковь';

При выполнении этого компактного запроса система должна одновременно обрабатывать данные из трех таблиц, тогда как в предыдущем примере эти таблицы обрабатываются поочередно. Естественно, что для их реализации требуются различные ресурсы памяти и времени, однако этого невозможно ощутить при работе с ограниченным объемом данных в иллюстративной БД «Магазин».

3. Пересечение двух таблиц

Найти продукты, которые есть и в таблице Продукты, и в таблице НовыеПродукты

SELECT Продукт

FROM Продукты

WHERE Продукт IN

(SELECT Продукт

FROM НовыеПродукты);

Или

SELECT Продукты.Продукт

FROM Продукты, НовыеПродукты

WHERE Продукты.Продукт = НовыеПродукты.Продукт;

 

4. Разность двух таблиц

Найти продукты, которые есть в таблице Продукты, но отсутствуют в таблице НовыеПродукты

SELECT Продукт

FROM Продукты

WHERE Продукт NOT IN

(SELECT Продукт

FROM НовыеПродукты);

Вложенный подзапрос с оператором сравнения, отличным от IN

Выдать продукты, имеющие ту же единицу измерения, что и молоко.

SELECT Продукт

FROM Продукты

WHERE ЕдИзм =

(SELECT ЕдИзм

FROM Продукты

WHERE Продукт = 'Молоко');

Результат запроса

 

В подобных запросах можно использовать и другие операторы сравнения (<>, <=, <, >= или >), однако, если вложенный подзапрос возвращает более одного значения и не используется оператор IN, будет возникать ошибка.

 

 


Поделиться:

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





lektsii.com - Лекции.Ком - 2014-2024 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты