Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

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






Используют форму <скалярное выражение> <оператор сравнения> <подзапрос>.






Конструкции < подзапрос> < оператор> < скалярное выражение> или < подзапрос> < оператор> < подзапрос> недопустимы.

 

Использование агрегатных функций в подзапросах.

Одним из видов функций, которые автоматически выдают единственное значение для любого количества строк - являются агрегатные функции. Любой запрос, использующий единственную агрегатную функцию без предложения GROUP BY, дает в результате единственное значение для использования его в основном предикате.

EX?

SELECT * FROM Orders

WHERE amt >

(SELECT AVG(amt)

FROM Orders

WHERE Odate = 02/28/2011)

 

При применении предложения GROUP BY агрегатные функции могут дать в результате множество значений. Поэтому их нельзя применять в подзапросах.

Такие команды отвергаются в принципе(при синтаксическом разборе запроса - без выборки данных). Несмотря на то, что применение GROUP BY и HAVING в некоторых случаях дает единственную группу в качестве результата подзапроса.

 

Использование подзапросов возвращающих более одной строки.

Для использования подзапросов возвращающих более одной записи можно применить оператор IN во внешнем запросе. (Нельзя применять BEETWEEN, LIKE, IS NULL). IN - определяет множество значений, которые тестируются на совпадение с другим значением для определения истинности предиката. Когда IN применяется

с подзапросом, SQL строит это множество из выходных данных этого подзапроса.

 

 

Orders

U_id Sl_num Part Amt Odate Client_num
N10 N5 N5 N10.2 D8 N5

 

Структура справочников:

 

Clients  
client_num N4
Nam_val C15
Sales_p  
Sl_num N6
Sl_nam C15
Sl_city C20

 

Найти все заказы для продавцов из Москвы

 

SELECT *

FROM Orders

WHERE Sl_num IN

(SELECT sl_num

FROM Sales_p

WHERE Sl_city=‘Москва’)

 

Данную задачу можно решить с использованием Join

 

SELECT Orders.U_id, Orders.part, Sales_p.sl_nam

FROM Orders, Sales_p

WHERE Orders.Sl_num = Sales_p.sl_num

AND Sales_p.Sl_city = ‘Москва’

 

(Достоинства и недостатки: результаты запроса непосредственно не видны и если есть ошибки в данных обнаружить их будет трудно).

Результат работы этих запросов должен быть одинаковым (с точностью до столбцов).

 

Эффективность: оптимизатор, зависящий от реализации, join -> подзапрос

 

Общим во всех рассмотренных подзапросах было использование в качестве результата единственного столбца. Это необходимо - поскольку выходные данные подзапроса сравниваются с единственным значением. Следовательно, вариант SELECT * нельзя использовать в подзапросе. (Исключением являются подзапросы с оператором EXISTS)

 

 


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

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал