Введение в стандарты языка баз данных SQL

       

Подзапросы


В стандарте SQL/92 специфицированы три вида подзапросов: скалярный, строчный и табличный. Скалярный подзапрос выдает одно значение некоторого типа; строчный подзапрос выдает одну строку; табличный подзапрос выдает таблицу. В основе каждого вида подзапроса лежит табличное выражение. Синтаксически соответствующие конструкции определяются следующими правилами:

<scalar subquery> ::= <subquery> <row subquery> ::= <subquery> <table subquery> ::= <subquery> <subquery> ::= <left paren> <query expression> <right paren>

Пояснения:

  • Степень скалярного подзапроса должна быть равна 1.
  • Степень строчного подзапроса должна быть больше 1.
  • Тип данных скалярного подзапроса совпадает с типом данных соответствующего столбца выражения запросов.
  • Типы данных столбцов строчного или табличного подзапроса совпадают с типами данных соответствующих столбцов выражения запросов.
  • Если мощность скалярного или строчного подзапроса больше 1, то возбуждается исключительное условие.
  • Теперь мы в состоянии привести синтаксические определения и соответствующие пояснения по поводу выражения запросов:

    <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>


    Пояснения:

  • Если в терме или выражении запросов без соединения присутствует теоретико-множественный оператор, то пусть T1, T2 и TR обозначают соответственно первый операнд, второй операнд и результат терма или выражения, а OP - используемую теоретико-множественную операцию.
  • Если специфицировано CORRESPONDING, то


      (a) одно имя столбца не должно быть специфицировано более одного раза для столбцов T1 и T2;

      (b) по крайней мере один столбец T1 должен иметь имя, являющееся именем некоторого столбца T2;

      (c) если список соответствия столбцов не задан, пусть SL обозначает список выборки с указанием имен столбцов, являющихся именами столбцов и в T1, и в T2, в том порядке, в котором эти имена фигурируют в T1;

      (d) если список соответствия столбцов задан, то пусть SL обозначает список выборки с указанием тех имен столбцов, явно входящих в список соответствия, в том порядке, в котором эти имена фигурируют в списке соответствия; каждое имя столбца в списке соответствия должно быть именем столбца и T1, и T2;

      (e) терм или выражение запросов без соединения эквивалентны следующему:

      (SELECTSLFROMTN1) OP (SELECTSLFROMTN2).



  • Если CORRESPONDING не указано, то T1 и T2 должны быть одинаковой степени.
  • Если не задан теоретико-множественный оператор, то результатом вычисления выражения запросов является результат вычисления простой или соединенной таблицы.
  • Если теоретико-множественный оператор задан, то результатом его применения является таблица, содержащая следующие строки:


      (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).




  • Содержание раздела