Синтаксис оператора выборки

В довольно сильно упрощенном виде оператор выборки данных имеет следующий синтаксис (для некоторых элементов мы дадим не BNF-определения, а словесное описание):

Оператор выборки::=Табличное выражение
[ ORDER BY {{Имя столбца-результата [ ASC | DESC ]} | {Положительное целое [ ASC | DESC ]}}.,..];

Табличное выражение::=Select-выражение
[{ UNION | INTERSECT | EXCEPT } [ ALL ]{Select-выражение | TABLE Имя таблицы | Конструктор значений таблицы}]

Select-выражение::=
SELECT [ ALL | DISTINCT ]{{{Скалярное выражение | Функция агрегирования | Select-выражение} [ AS Имя столбца]}.,..}| {{Имя таблицы|Имя корреляции}.*}| *
FROM {{Имя таблицы [ AS ] [Имя корреляции] [(Имя столбца.,..)]}| {Select-выражение [ AS ] Имя корреляции [(Имя столбца.,..)]}| Соединенная таблица}.,..
[ WHERE Условное выражение]
[ GROUP BY {[{Имя таблицы|Имя корреляции}.]Имя столбца}.,..]
[ HAVING Условное выражение]

Функция агрегирования::=
COUNT (*) |{{ COUNT | MAX | MIN | SUM | AVG } ([ ALL | DISTINCT ] Скалярное выражение)}

Конструктор значений таблицы::=
VALUES Конструктор значений строки.,..

Конструктор значений строки::=
Элемент конструктора | (Элемент конструктора.,..) | Select-выражение

Элемент конструктора::= Выражение для вычисления значения | NULL | DEFAULT

Замечание. Select-выражение в разделе SELECT, используемое в качестве значения для отбираемого столбца, должно возвращать таблицу, состоящую из одной строки и одного столбца, т. е. скалярное выражение.

Замечание. Условное выражение в разделе WHERE должно вычисляться для каждой строки, являющейся кандидатом в результирующее множество строк. В этом условном выражении можно использовать подзапросы. Синтаксис условных выражений, допустимых в разделе WHERE рассматривается ниже.

Замечание. Раздел HAVING содержит условное выражение, вычисляемое для каждой группы, определяемой списком группировки в разделе GROUP BY. Это условное выражение может содержать функции агрегирования, вычисляемые для каждой группы. Условное выражение, сформулированное в разделе WHERE, может быть перенесено в раздел HAVING. Перенос условий из раздела HAVING в раздел WHERE невозможен, если условное выражение содержит агрегатные функции. Перенос условий из раздела WHERE в раздел HAVING является плохим стилем программирования – эти разделы предназначены для различных по смыслу условий (условия для строк и условия для групп строк).

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

Скалярное выражение – в качестве скалярных выражений в разделе SELECT могут выступать либо имена столбцов таблиц, входящих в раздел FROM, либо простые функции, возвращающие скалярные значения.

Замечание. Select-выражение, используемое в конструкторе значений строки, обязано возвращать ровно одну строку.


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



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