double arrow

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

Предложение HAVING без GROUP BY

Значения NULL и условия поиска групп

Ограничения на условия поиска групп

Предложение having используется для того, чтобы включать и исключать группы строк из результатов запроса, поэтому используемое в нем условие поиска применяется не к отдельным строкам, а к группе в целом. Это значит, что в условие поиска может входить:

· константа',

· агрегатная функция, возвращающая одно значение для всех строк, входящих в группу; I

· столбец группировки, который, по определению, имеет одно и то же значение во всех строках труппы;

· выражение, включающее в себя перечисленные выше элементы.

На практике условие поиска предложения having всегда должно включать в себя как минимум одну агрегатную функцию. Если это не так, условие поиска можно переместить в предложение where. Чтобы определить, где следует указать условие поиска — в предложении where или having, необходимо вспомнить, как применяются эти предложения:

· предложение where применяется к отдельным строкам, поэтому выражения, содержащиеся в нем, должны вычисляться для отдельных строк;

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

Как и условие поиска в предложении where, условие поиска в предложении having может дать один из следующих результатов:

Если условие поиска имеет значение true, группа строк остается и для нее генерируется одна строка в результатах запроса.

Если условие поиска имеет значение false, группа строк исключается, и строка в результатах запроса для нее не генерируется.

Если условие поиска имеет значение null, группа строк исключается, и строка в результатах запроса для нее не генерируется.

Правила обработки значений null в условиях поиска для предложения having точно такие же, как и для предложения where

Предложение having почти всегда используется в сочетании с предложением group by, однако синтаксис оператора select не требует этого. Если предложение having используется без предложения group by, SQL рассматривает полные результаты запроса как одну группу. Другими словами, агрегатные функции, содержащиеся в предложении having, применяются к одной и только одной группе, и эта группа состоит из всех строк. На практике предложение having очень редко используется без соответствующего предложения group by.

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

• Оператор SQL с вложенным запросом зачастую является самым естественным способом выражения запроса, так как он лучше всего соответствует словесному описанию запроса.

• Вложенные запросы облегчают написание операторов select, поскольку они позволяют разбивать запрос на части (на запрос и вложенных запросы), а затем складывать эти части вместе.

• Существуют запросы, которые нельзя сформулировать на SQL, не прибегая к помощи вложенных запросов.

ПРИМЕНЕНИЕ ВЛОЖЕННЫХ ЗАПРОСОВ

Вложенным, или подчиненным, запросом называется запрос, содержащийся в предложении where или having другого оператора SQL. Вложенные запросы позволяют естественным образом обрабатывать запросы, выраженные через результаты других запросов. Вот пример такого запроса:

"Вывести список офисов, в которых плановый объем продаж превышает сумму плановых объемов продаж всех служащих."

В данном запросе требуется получить список офисов из таблицы of fices, для которых значение столбца target удовлетворяет некотором условию. Логично предположить, что оператор select, выражающий данный запрос, должен выглядеть примерно так, как показано ниже.

Здесь величина "???" равна сумме плановых объемов продаж всех служащих, работающих в данном офисе. Как можно задать ее в этом запросе? Сумму плановых объемов продаж для отдельного офиса (скажем, офиса с идентификатором 21) можно получить с помощью следующего запроса:

Но как результаты этого запроса вставить в предыдущий запрос вместо вопросительных знаков? По-видимому, было бы разумно вначале написать первый запрос, а затем заменить символ "???"* вторым запросом:

Фактически это и есть правильный SQL-запрос. Вложенный (внутренний) запрос вычисляет для каждого офиса сумму плановых объемов продаж всех служащих, работающих в данном офисе. Главный (внешний) запрос сравнивает план продаж офиса с полученной суммой и, в зависимости от результата сравнения либо добавляет данный офис в таблицу результатов запроса, либо нет. Совокупно главный и вложенный запросы выражают исходный запрос и извлекают из базы данных требуемую информацию.

Вложенные SQL-запросы всегда выступают в качестве части предложения where или having. В предложении where они помогают отбирать из таблицы результатов запроса отдельные строки, а в предложении having — группы строк.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: