Применение агрегатных функций и вложенных запросов в SELECT



В SQL добавлены дополнительные функции, которые позволяют вычислять обобщенные групповые значения. Для применения агрегатных функций предполагается предварительная операция группировки. При группировке все множество кортежей отношения разбивается на группы, в которых собираются кортежи, имеющие одинаковые значения атрибутов, которые заданы в списке группировки.

Агрегатные функции вычисляют одиночное значение для всей группы таблицы!!!

Таблица    Агрегатные функции
Функция   Результат
COUNT   Кол-во строк пли непустых значений полей, которые выбрал запрос
SUM   Сумма всех выбранных значений данного поля
AVG   Среднеарифм.-е значение всех выбранных значений данного поля
MIN   Наименьшее из всех выбранных значений данного поля
MAX   Наибольшее из всех выбранных значений данного поля

 

Агрегатные функции используются подобно именам полей в операторе SELECT, но с одним исключением: они берут имя поля как аргумент. С функциями SUM и AVG могут использоваться только числовые поля. С функциями COUNT, MAX и MIN могут использоваться как числовые, так и символьные поля.

!!!  Нельзя использовать агрегатные функции в предложении WHERE, потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции — в терминах групп строк.

Предложение GROUP BY позволяет определять подмножество значений в особом поле в терминах другого поля и применять функцию агрегата к подмножеству. Это дает возможность объединять поля и агрегатные функции в едином предложении SELECT. Агрегатные функции могут применяться как в выражении вывода результатов строки SELECT, так и в выражении условия обработки сформированных групп HAVING. В этом случае каждая агрегатная функция вычисляется для каждой выделенной группы.

Вложенные запросы

С помощью SQL можно вкладывать запросы внутрь друг друга. Обычно внутренний запрос генерирует значение, которое проверяется в предикате внешнего запроса (в предложении WHERE или HAVING), определяющего, верно оно или нет. Совместно с подзапросом можно использовать предикат EXISTS, который возвращает истину, если вывод подзапроса не пуст.

Предикат EXISTS (SubQuery) истинен, когда подзапрос SubQuery не пуст, то есть содержит хотя бы один кортеж, в противном случае предикат EXISTS ложен.

Предикат NOT EXISTS обратно — истинен только тогда, когда подзапрос SubQuery пуст.

В стандарте SQL92 операторы сравнения расширены до многократных сравнений с использованием ключевых слов ANY и ALL. Это расширение используется при сравнении значения определенного столбца со столбцом данных, возвращаемым вложенным запросом.

ANY в любом предикате сравнения, означает, что предикат будет истинен, если хотя бы для одного значения из подзапроса предикат сравнения истинен.    ALL требует, чтобы предикат сравнения был бы истинен при сравнении со всеми строками подзапроса.

Внешние соединения

Стандарт SQL2 расширил понятие условного соединения. В SQL1 при соединении отношений использовались только условия, задаваемые в части WHERE оператора SELECT, и в этом случае в результирующее отношение попадали только сцепленные по заданным условиям кортежи исходных отношений, для которых эти условия были определены и истинны. Однако часто необходимо соединять таблицы таким образом, чтобы в результат попали все строки из первой таблицы, а вместо тех строк второй таблицы, для которых не выполнено условие соединения, в результат попадали бы неопределенные значения. Или наоборот.

Такие объединения были названы внешними в противоположность соединениям, определенным стандартом SQL1, которые стали называться внутренними.

В общем случае синтаксис части FROM в стандарте SQL2 выглядит следующим образом:

FROM <список исходных табл> |

< выражение естественного соединения > | выражение соединения > |

< выражение перекрестного соединения > | выражение запроса на соединение>

<выражение естественного соединения:: =

<имя_табл1> NATURAL {INNER | FULL [OUTER] |

LEFT [OUTER] | RIGHT [OUTER]} JOIN <имя_табл_2>

<выражение перекрестного объединения>:: =

<имя табл_1>CROSS JOIN <имя табл_2>

<выражение запроса на соединение>::=

<имя_табл_1> UNION JOIN <имя_табл_2>

<выражение соединения>::= <имя_табл_1>

 {INNER |FULL [OUTER] | LEFT [OUTER] | RIGHT [OUTER]}

JOIN (ON условие | [USING (список столбцов)]} <имя_табл_2>

В этих определениях INNER — означает внутреннее объединение, LEFT — левое объединение, то есть в результат входят все строки таблицы 1, а части результирующих кортежей, для которых не было соответствующих значений в таблице 2, дополняются значениями NULL (не определено). Ключевое слово RIGHT означает правое внешнее объединение, и в отличие от левого объединения в этом случае в результирующее отношение включаются все строки таблицы 2, а недостающие части из таблицы 1 дополняются неопределенными значениями, Ключевое слово FULL определяет полное внешнее объединение: и левое и правое. При полном внешнем объединении выполняются и правое и левое внешние объединения ив результирующее отношение включаются все строки из таблицы 1, дополненные неопределенными значениями, и все строки из таблицы 2, также дополненные неопределенными значениями.

Ключевое слово OUTER означает внешнее, но если заданы ключевые слова FULL, LEFT, RIGHT, то объединение всегда считается внешним.


Дата добавления: 2018-04-15; просмотров: 345; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!