Введение в модель данных 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. Содержание  Назад  Вперед