КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Вложенные подзапросы с предикатом 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, будет возникать ошибка.
|