5.24 <Подзапрос> (<subquery>)
Функция
Специфицирует мультимножество значений, полученных из результата <выражения, вырабатывающего таблицу> (<table expression>).
Формат
<subquery> ::=
(SELECT [ALL | DISTINCT] <result specification>
<table expression>)
<result specification> ::=
<value expression>
| *
Синтаксические правила
- Применимые привилегии для каждого <имени таблицы> (<table name>), содержащегося в <выражении, вырабатывающем таблицу> (<table expression>), должны включать SELECT.
Замечание: "Применимые <привилегии> (<privileges>)" для <имени таблицы> (<table name>) определяются в 6.10, "<определение привилегий> (<privileges definition>)".
-
a) Если <спецификация результата> (<result specification>) "*" указана в <подзапросе> (<subquery>) какого-либо <предиката> (<predicate>), отличного от <предиката exists> (<exists predicate>), то степень <выражения, вырабатываающего таблицу> (<table expression>) должна быть равна 1 и <спецификация результата> (<result specification>) эквивалентна <выражению, вырабатывающему значение> (<value expression>), состоящему из <спецификации столбца> (<column specification>), указывающей на единственный столбец <выражения, вырабатывающего таблицу> (<table expression>).
b) Если <спецификация результата> (<result specification>) "*" указана в <подзапросе> (<subquery>) <предиката exists> (<exists predicate>), то <спецификация результата> (<result specification>) эквивалентна произвольному <выражению, вырабатывающему значение> (<value expression>), не включающему <спецификацию функции над множеством> (<table expression>) и допустимому в <подзапросе> (<subquery>).
- Тип данных значений <подзапроса> (<subquery>) есть тип данных явного или неявного <выражения, вырабатывающего значение> (<value expression>).
- Пусть R обозначает результат <выражения, вырабатывающего таблицу> (<table expression>).
- Каждая <спецификация столбца> (<column specification>) в <выражении, вырабатывающем значение> (<value expression>) должна недвусмысленно ссылаться на столбец R.
- Если R - это сгруппированное представление, то <спецификация результата> (<result specification>) не должна содержать <спецификацию функции над множеством> (<set function specification>).
- Если R - это сгруппированная таблица, то каждая <спецификация столбца> (<column specification>) в <выражении, вырабатывающем значение> (<value expression>) должна указывать на столбец группирования или быть специфицированной внутри <спецификации функции над множеством> (<set function specification>). Если R это не сгруппированная таблица и <выражение, вырабатывающее значение> (<value expression>) включает <спецификацию функции над множеством> (<set function specification>), то каждая <спецификация столбца> (<column specification>) в <выражении, вырабатывающем значение> (<value expression>) должна быть указана внутри <спецификации функции над множеством> (<set function specification>).
- <Ключевое слово> (<key word>) DISTINCT не должно специфицироваться более одного раза в <подзапросе> (<subquery>), включая любой <подзапрос> (<subquery>), содержащийся в этом <подзапросе> (<subquery>).
- Если <подзапрос> (<subquery>) специфицируется в <предикате сравнения> (<comparison predicate>), то <выражение, вырабатывающее таблицу> (<table expression>) не должно содержать <раздел group by> (<group by clause>) или <раздел having> (<having clause>) и не должно идентифицировать сгруппированное представление.
Общие правила
- Если R не является сгруппированной таблицей и <выражение, вырабатывающее значение> (<value expression>) включает <спецификацию функции над множеством> (<set function specification>), то R является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <выражении, вырабатывающем значение> (<value expression>) и результат <подзапроса> (<subquery>) есть значение, специфицированное <выражением, вырабатывающем значение> (<value expression>).
- Если R не является сгруппированной таблицей и <выражение, вырабатывающее значение> (<value expression>) не включает <спецификацию функции над множеством> (<set function specification>), то <выражение, вырабатывающее значение> (<value expression>) применяется к каждой строке R, образуя мультимножество из n значений, где n - мощность R. Если не указано ключевое слово DISTINCT, то это мультимножество является результатом <подзапроса> (<subquery>). Если DISTINCT указано, то результатом <подзапроса> (<subquery>) является множество значений, получаемое из этого мультимножества удалением любых избыточных дублирующих значений.
- Если R - сгруппированная таблица, то <выражение, вырабатывающее значение> (<value expression>) применяется к каждой группе R, образуя мультимножество из n значений, где n - число групп в R. Когда <выражение, вырабатывающее значение> (<value expression>) применяется к данной группе R, эта группа является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <выражении, вырабатывающем значение> (<value expression>). Если не указано ключевое слово DISTINCT, то это мультимножество является результатом <подзапроса> (<subquery>). Если DISTINCT указано, то результатом <подзапроса> (<subquery>) является множество значений, получаемое из этого мультимножества удалением любых избыточных дублирующих значений.
5.25 <Спецификация запроса> (<query specification>)
Функция
Специфицирует таблицу, полученную из результата <выражения, вырабатывающего таблицу> (<table expression>).
Формат
<query specification> ::=
(SELECT [ALL | DISTINCT] <select list>
<table expression>)
<select list> ::=
<value expression> [{,<value expression>}]
| *
Синтаксические правила
- Применимые привилегии для каждого <имени таблицы> (<table name>), содержащегося в <выражении, вырабатывающем таблицу> (<table expression>), должны включать SELECT.
Замечание: "Применимые <привилегии> (<privileges>)" для <имени таблицы> (<table name>) определяются в 6.10, "<определение привилегий> (<privileges definition>)".
- Пусть R обозначает результат <выражения, вырабатывающего таблицу> (<table specification>).
- Степень таблицы, специфицированной через <спецификацию запроса> (<query specification>) равна мощности <списка выборки> (<select list>).
- <Список выборки> (<select list>) "*" эквивалентен последовательности <выражений, вырабатывающих значение> (<value expression>), в которой каждое <выражение, вырабатывающее значение> (<value expression>) является <спецификацией столбца> (<column specification>), указывающей на столбец R, и каждый столбец R указывается ровно один раз. Столбцы указываются в порядке возрастания номеров их исходных позиций внутри R.
- Каждая <спецификация столбца> (<column specification>) в каждом <выражении, вырабатывающем значение> (<value expression>) должна однозначно указывать на столбец R. <Ключевое слово> (<key word>) DISTINCT не должно указываться более одного раза в <спецификации запроса> (<query specification>) за исключением любого <подзапроса> (<subquery>) этой <спецификации запроса> (<query specification>).
- Если R - это сгруппированное представление, то <список выборки> (<select list>) не должен содержать <спецификацию функции над множеством> (<set function specification>).
- Если R - это сгруппированная таблица, то каждая <спецификация столбца> (<column specification>) в каждом <выражении, вырабатывающем значение> (<value expression>) должна указывать на столбец группирования или быть специфицированной внутри <спецификации функции над множеством> (<set function specification>). Если R - это не сгруппированная таблица и какое-либо <выражение, вырабатывающее значение> (<value expression>) включает <спецификацию функции над множеством> (<set function specification>), то каждая <спецификация столбца> (<column specification>) в любом <выражении, вырабатывающем значение> (<value expression>) должна быть указана внутри <спецификации функции над множеством> (<set function specification>).
- Каждый столбец таблицы, являющейся результатом <спецификации запроса> (<query specification>), имеет тот же тип данных, длину, точность и масштаб, что и <выражение, вырабатывающее значение> (<value expression>), из которого он получен.
- Если i-ое <выражение, вырабатывающее значение> (<value expression>) в <списке выборки> (<select list>) состоит из единственной <спецификации столбца> (<column specification>), то i-ый столбец результата есть именованный столбец с <именем столбца> (<column name>), соответствующим <спецификации столбца> (<column specification>). В противном случае i-ый столбец является неименованным.
- На столбец таблицы, которая является результатом <спецификации столбца> (<column specification>), накладывается ограничение содержать только не неопределенные значения в том и только в том случае, когда это именованный столбец с ограничением содержать только не неопределенные значения.
- <Спецификация запроса> (<query specification>) является изменяемой (updatable) в том и только в том случае, когда выдерживаются следующие условия:
a) Ключевое слово DISTINCT не указано.
b) Каждое <выражение, вырабатывающее значение> (<value expression>) в <списке выборки> (<select list>) состоит из <спецификации столбца> (<column specification>), и ни одна <спецификация столбца> (<column specification>) не появляется более одного раза.
c) <Раздел from> (<from clause>) <выражения, выраба тывающего таблицу> (<table expression>) специфицирует в точности одну <ссылку на таблицу> (<table reference>), и эта <ссылка на таблицу> (<table reference>) указывает либо на базовую таблицу, либо на порожденную таблицу, являющуюся изменяемой (updatable).
d) <Раздел where> (<where clause>) <выражения, вырабатывающего таблицу> (<table expression>) не содержит <подзапроса> (<subquery>).
e) <Выражение, вырабатывающее таблицу> (<table expression>) не включает <раздела group by> (<group by clause>) или <раздела having> (<having clause>).
Общие правила
- Если R не является сгруппированной таблицей и <список выборки> (<select list>) включает <спецификацию функции над множеством> (<set function specification>), то R является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <списке выборки> (<select list>) и результат <спецификации запроса> (<query specification>) есть таблица, состоящая из одной строки. I-ое значение строки есть значение, специфицированное i-ым <выражением, вырабатывающим значение> (<value expression>).
- Если R не является сгруппированной таблицей и <список выборки> (<select list>) не включает <спецификацию функции над множеством> (<set function specification>), то каждое <выражение, вырабатывающее значение> (<value expression>) применяется к каждой строке R, образуя таблицу из m строк, где m - мощность R. I-ый столбец таблицы содержит значения, полученные применением i-ого <выражения, вырабатывающего значение> (<value expression>). Если не указано ключевое слово DISTINCT, то эта таблица является результатом <спецификации запроса> (<query specification>). Если DISTINCT указано, то результатом <спецификации запроса> (<query specification>) является таблица, получаемая из этой таблицы удалением любых избыточных дублирующих значений.
- Если R - сгруппированная таблица с нулевым числом групп, то результатом <спецификации запроса> (<query specification>) является пустая таблица.
- Если R - сгруппированная таблица с одной или более групп, то каждое <выражение, вырабатывающее значение> (<value expression>) применяется к каждой группе R, образуя таблицу из m строк, где m - число групп в R. I-ый столбец таблицы содержит значения, полученные применением i-ого <выражения, вырабатывающего значения> (<value expression>). Когда <выражение, вырабатывающее значение> (<value expression>) применяется к данной группе R, эта группа является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <выражении, вырабатывающем значение> (<value expression>). Если не указано ключевое слово DISTINCT, то эта таблица является результатом <спецификации запроса> (<query specification>). Если DISTINCT указано, то результатом <спецификации запроса> (<query specification>) является таблица, получаемая из этой таблицы удалением любых избыточных дублирующих строк.
- Строка является дубликатом другой строки в том и только в том случае, когда все пары значений с одной и той же порядковой позицией идентичны.
6. Язык определения схем
6.1 <Схема> (<schema>)
Функция
Определяет <схему> (<schema>).
Формат
<schema> ::=
CREATE SCHEMA <schema authorization clause>
[<schema element>...]
<schema authorization clause> ::=
AUTHORIZATION <schema authorization identifier>
<schema authorization identifier> ::=
<authorization identifier>
<schema element> ::=
<table definition>
| <view definition>
| <privilege definition>
Синтаксические правила
- <Идентификатор полномочий схемы> (<schema authorization identifier>) должен быть отличным от <идентификатора полномочий схемы> (<schema authorization identifier>) любой другой <схемы> (<schema>) в той же самой среде. Понятие среды определяется в реализации.
Общие правила
Нет.
6.2 <Определение таблицы> (<table definition>)
Функция
Определяет базовую таблицу.
Формат
<table definition> ::=
CREATE TABLE <table name>
(<table element> [{,<table element>}...])
<table element> ::=
<column definition>
| <table constraint definition>
Синтаксические правила
- Если <имя таблицы> (<table name>) содержит <идентификатор полномочий> (<authorization identifier>), то этот <идентификатор полномочий> (<authorization identifier>) должен быть таким же, как <идентификатор полномочий схемы> (<schema authorization identifier>) содержащей схемы.
- <Имя таблицы> (<table name>) должно быть отличным от <имени таблицы> (<table name>) любого другого <определения таблицы> (<table definition>) или <определения представления> (<view definition>) содержащей <схемы> (<schema>).
- <Определение таблицы> (<table definition>) должно содержать по меньшей мере одно <определение столбца> (<column definition>).
- Областью действия <имени таблицы> (<table name>) является <определение таблицы> (<table definition>).
- Описание таблицы, определенной через <определение таблицы> (<table definition>) включает имя <имя таблицы> (<table name>) и описание столбцов, специфицированное каждым <определением столбца> (<column definition>. Описание i-го столбца предоставляется i-ым <определением столбца> (<column definition>).
Общие правила
- <Определение таблицы> (<table definition>) определяет базовую таблицу.
6.3 <Определение столбца> (<column definition>)
Функция
Определяет столбец таблицы.
Формат
<column definition> ::=
<column name> <data type>
[<default clause>]
[<column constraint>...]
<column constraint> ::=
NOT NULL [<unique specification>]
| <references specification>
| CHECK (<search condition>)
Синтаксические правила
- <Имя столбца> (<column name>) должно быть отличным от <имени столбца> (<column name>) любого другого <определения столбца> (<column definition>) содержащегося в <определении таблицы> (<table definition>).
- I-ый столбец таблицы описывается i-ым <определением столбца> (<column definition>) в <определении таблицы> (<table definition>). Имя и тип данных столбца определяются <именем столбца> (<column name>) и <типом данных> (<data type>) соответственно.
- Пусть C обозначает <имя столбца> (<column name>) в <определении столбца> (<column definition>).
- Если указано NOT NULL, то неявно вводится следующее <определение проверочного ограничения> (<check constraint definition>): CHECK (C IS NOT NULL)
- Если не указано NOT NULL и не указан <раздел умолчания> (<default clause>), то неявно вводится DEFAULT NULL.
- Если указана <спецификация уникальности> (<unique specification>), то неявно вводится следующее <определение ограничения уникальности> (<unique constraint definition>):
<unique specification> (C)
Замечание: <Спецификация уникальности> (<unique specification>) определяется в 6.6, "<определение ограничения уникальности> (<unique constraint definition>)".
- Если указана <спецификация ссылок> (<references specification>), то неявно вводится следующее <определение ограничения ссылок> (<referential constraint definition>):
FOREIGN KEY(C) <references specification>
Замечание: <Спецификация ссылок> (<references specification>) определяется в 6.7, "<определение ограничения ссылок> (<referential constraint definition>)".
- Если указано CHECK, то каждая <спецификация столбца> (<column specification>) в <условии поиска> (<search condition>) должна ссылаться на столбец C, и неявно вводится следующее <определение проверочного ограничения> (<check constraint definition):
CHECK (<search condition>)
- Описание столбца, определенного через <определение столбца> (<column definition>), включает имя <имя столбца> (<column name>) и тип данных, специфицированный <типом данных> (<data type>).
Общие правила
Нет.
Назад | Содержание | Вперед
|