double arrow

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

В довольно сильно упрощенном виде оператор выборки данных имеет следующий синтаксис (для некоторых элементов мы дадим не 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-выражение, используемое в конструкторе значений строки, обязано возвращать ровно одну строку.


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