Введение в модель данных SQL

       

Табличное выражение, спецификация запроса и выражение запросов


Табличным выражением (table_expression) называется конструкция

table_expression ::= FROM table_reference_commalist [ WHERE conditional_expression ] [ GROUP BY column_name_commalist ] [ HAVING conditional_expression ]

Спецификацией запроса (query_specification) называется конструкция

query_specification SELECT [ ALL | DISTINCT ] select_item_commalist table_expression

Наконец, выражением запросов (query_expression) называется конструкция

query_expression ::= [ with_clause ] query_expression_body query_expression_body ::= { non_join_query_expression | joined_table } non_join_query_expression ::= non_join_query_term | query_expression_body { UNION | EXCEPT }[ ALL | DISTINCT ] [ corresponding_spec ] query_term query_term ::= non_join_query_term | joined_table non_join_query_term ::= non_join_query_primary | query_term INTERSECT [ ALL | DISTINCT ] [ corresponding_spec ] query_primary query_primary ::= non_join_query_primary | joined_table non_join_query_primary ::= simple_table | (non_join_query_expression) simple_table ::= query_specification | table_value_constructor | TABLE table_name corresponding_spec ::= CORRESPONDING [ BY column_name_comma_list ]

Если не обращать внимания на не обсуждавшиеся пока конструкции joined_table и table_value_constructor, синтаксические правила показывают, что выражение запросов строится из выражений, значениями которых являются таблицы, с использованием "теоретико-множественных"2) операций UNION (объединение), EXCEPT (вычитание) и INTERSECT (пересечение). Операция пересечения является "мультипликативной" и обладает более высоким приоритетом, чем "аддитивные" операции объединения и вычитания. Вычисление выражения производится слева направо с учетом приоритетов операций и круглых скобок. При этом действуют следующие правила.

  • Если выражение запросов не включает ни одной теоретико-множественной операции, то результатом вычисления выражения запросов является результат вычисления простой или соединенной таблицы.
  • Если в терме (non_join_query_term) или выражении запросов (non_join_query_expression) без соединения присутствует теоретико-множественная операция, то пусть T1, T2 и TR обозначают соответственно первый операнд, второй операнд и результат терма или выражения соответственно, а OP - используемую теоретико-множественную операцию.
  • Если в операции присутствует спецификация CORRESPONDING, то:
    1. если присутствует конструкция BY column_name_comma_list, то все имена в этом списке должны быть различны, и каждое имя должно являться одновременно именем некоторого столбца таблицы T1 и именем некоторого столбца таблицы T2, причем типы этих столбцов должны быть совместимыми; обозначим данный список имен через SL;
    2. если список соответствия столбцов не задан, пусть SL обозначает список имен столбцов, являющихся именами столбцов и в T1, и в T2, в том порядке, в котором эти имена фигурируют в T1;
    3. вычисляемые терм или выражение запросов без соединения эквивалентны выражению (SELECT SL FROM T1) OP (SELECT SL FROM T2), не включающему спецификацию CORRESPONDING.

    4. При отсутствии в операции спецификации CORRESPONDING операция выполняется таким образом, как если бы эта спецификация присутствовала и включала конструкцию BY column_name_comma_list, в которой были бы перечислены все столбцы таблицы T1.3)
    5. При выполнении операции OP две строки s1 с именами столбцов c1, c2, …, cn и s2 с именами столбцов d1, d2, …, dn считаются строками-дубликатами, если для каждого I (i = 1, 2, …, n) либо ci и di не содержат NULL, и (ci = di) = true4), либо и ci, и di содержат NULL.
    6. Если в операции OP не задана спецификация ALL, то в TR строки-дубликаты удаляются.
    7. Если спецификация ALL задана, то пусть s - строка, являющаяся дубликатом некоторой строки T1, или некоторой строки T2, или обеих; пусть m - число дубликатов s в T1, а n - число дубликатов s в T2. Тогда:
    • если указана операция UNION, то число дубликатов s в TR равно m + n;
    • если указана операция EXCEPT, то число дубликатов s в TR равно max ((m-n),0);
    • если указана операция INTERSECT, то число дубликатов s в TR равно min (m,n).



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