Подзапросы
В стандарте SQL/92 специфицированы три вида подзапросов: скалярный, строчный и табличный. Скалярный подзапрос выдает одно значение некоторого типа; строчный подзапрос выдает одну строку; табличный подзапрос выдает таблицу. В основе каждого вида подзапроса лежит табличное выражение. Синтаксически соответствующие конструкции определяются следующими правилами:
<scalar subquery> ::= <subquery> <row subquery> ::= <subquery> <table subquery> ::= <subquery> <subquery> ::= <left paren> <query expression> <right paren>
Пояснения:
Теперь мы в состоянии привести синтаксические определения и соответствующие пояснения по поводу выражения запросов:
<query expression> ::= <non-join query expression> |<joined table> <non-join query expression> ::= <non-join query term> |<query expression> UNION [ ALL ] [ <corresponding spec> ] |<query term> <query expression> EXCEPT [ ALL ] [ <corresponding spec> ] <query term> <query term> ::= <non-join query term> |<joined table> <non-join query term> ::= <non-join query primary> |<query term> INTERSECT [ ALL ] [ <corresponding spec> ] <query primary> <query primary> ::= <non-join query primary> |<joined table> <non-join query primary> ::= <simple table> |<left paren> <non-join query expression> <right paren> <simple table> ::= <query specification> |<table value constructor> |<explicit table> <explicit table> ::= TABLE <table name> <corresponding spec> ::= CORRESPONDING [ BY <left paren> <corresponding column list> <right paren> ] <corresponding column list> ::= <column name list>
Пояснения:
(a) одно имя столбца не должно быть специфицировано более одного раза для столбцов T1 и T2;
(b) по крайней мере один столбец T1 должен иметь имя, являющееся именем некоторого столбца T2;
(c) если список соответствия столбцов не задан, пусть SL обозначает список выборки с указанием имен столбцов, являющихся именами столбцов и в T1, и в T2, в том порядке, в котором эти имена фигурируют в T1;
(d) если список соответствия столбцов задан, то пусть SL обозначает список выборки с указанием тех имен столбцов, явно входящих в список соответствия, в том порядке, в котором эти имена фигурируют в списке соответствия; каждое имя столбца в списке соответствия должно быть именем столбца и T1, и T2;
(e) терм или выражение запросов без соединения эквивалентны следующему:
(SELECTSLFROMTN1) OP (SELECTSLFROMTN2).
(a) пусть R - строка, являющаяся дубликатом некоторой строки T1 или некоторой строки T2 или обоих; пусть m - число дубликатов R в T1, а n - число дубликатов R в T2;
(b) если специфицировано ALL, то
(i) если указана операция UNION, то число дубликатов R в T равно m + n;
(ii) если указана операция EXCEPT, то число дубликатов R в T равно max ((m-n),0);
(iii) если указана операция INTERSECT, то число дубликатов R в T равно min (m,n).