Опубликован: 10.10.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 3:

Общая характеристика оператора SELECT и организация списка ссылок на таблицы в разделе FROM

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Ссылки на таблицы раздела FROM

Напомним, что раздел FROM оператора выборки определяется синтаксическим правилом

FROM table_reference_commalist

Рассмотрим более подробно, какой вид могут иметь элементы этого списка. Для начала приведем полный набор синтаксических правил SQL:1999, определяющий table_reference. 14В связи с введением в стандарте SQL:2003 конструктора типов мультимножеств, в качестве элемента списка ссылок на таблицы раздела FROM теперь можно использовать и выражение со значением-мультимножеством. Однако в этом курсе мы не будем подробно рассматривать эту возможность.

table_reference ::= table_primary | joined_table
table_primary ::= table_or_query_name [ [ AS ] correlation_name
	  [ (derived_column_list) ] ]
	| derived_table [ [ AS ] correlation_name
	  [ (derived_column_list) ] ]
	| lateral_derived_table [ [ AS ] correlation_name
	  [ (derived_column_list) ] ]
	| collection_derived_table [ [ AS ] correlation_name
	  [ (derived_column_list) ] ]
	| ONLY (table_or_query_name)[ [ AS ] correlation_name
	  [ (derived_column_list) ] ]
	| (joined_table)
table_or_query_name ::= { table_name | query_name }
derived_table ::= (query_expression)
lateral_derived_table ::= LATERAL (query_expression)
collection_derived_table ::= UNNEST 
	(collection_value_exression) [ WITH ORDINALITY ]

Мы отложим до следующих лекций обсуждение порождаемых таблиц с горизонтальной связью ( lateral_derived_table ) и " соединенных таблиц " ( joined_table ). Кроме того, мы не будем рассматривать в этом курсе конструкции collection_derived_table и ONLY ( table_or_query_name ), поскольку они относятся к объектным расширениям языка SQL, которые в данном курсе подробно не рассматриваются (на неформальном уровне объектно-реляционный подход обсуждается в последней лекции этого курса). Но даже при таких самоограничениях для дальнейшего продвижения нам придется определить несколько дополнительных синтаксических конструкций языка 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, синтаксические правила показывают, что выражение запросов строится из выражений, значениями которых являются таблицы, с использованием "теоретико-множественных"15Мы использовали кавычки, поскольку таблицы, к которым применяются операции, в общем случае могут содержать строки-дубликаты, т.е. являться мультимножествами . операций 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.
  • При отсутствии в операции спецификации CORRESPONDING операция выполняется таким образом, как если бы эта спецификация присутствовала и включала конструкцию BY column_name_comma_list, в которой были бы перечислены все столбцы таблицы T1. 16Другими словами, при отсутствии спецификации CORRESPONDING требуется, чтобы заголовки таблиц-операндов совпадали за исключением, возможно, порядка следования столбцов.
  • При выполнении операции OP две строки s1 с именами столбцов c1, c2, …, cn и s2 с именами столбцов d1, d2, …, dn считаются строками-дубликатами, если для каждого I ( i = 1, 2, …, n ) либо ci и di не содержат NULL, и ( ci = di ) = true 17С учетом возможности неявного приведения типов., либо и ci, и di содержат NULL.
  • Если в операции OP не задана спецификация ALL, то в TR строки-дубликаты удаляются.
  • Если спецификация 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).

Раздел WITH выражения запросов

Как видно из синтаксиса выражения запросов, в этом выражении может присутствовать раздел WITH. Он задается в следующем синтаксисе:

with_clause ::= WITH [ RECURSIVE ] with_element_comma_list
with_element ::= query_name [ (column_name_list) ]
	AS (query_expression) [ search_or_cycle_clause ]

Общую форму раздела WITH мы обсудим в следующих лекциях, когда будем рассматривать средства формулировки рекурсивных запросов. Пока ограничимся случаем, когда в разделе WITH отсутствуют спецификация RECURSIVE и search_or_cycle_clause. Тогда конструкция

WITH query_name (c1, c2, ѕ cn) AS (query_exp_1) query_exp_2

означает, что в любом месте выражения запросов query_exp_2, где допускается появление ссылки на таблицу, можно использовать имя query_name. Можно считать, что перед выполнением query_exp_2 происходит выполнение query_exp_1, и результирующая таблица с именами столбцов c1, c2, … cn сохраняется под именем query_name. Как мы увидим позже, в этом случае раздел WITH фактически служит для локального определения представляемой таблицы ( VIEW ).

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Алексей Ковтун
Алексей Ковтун

При попытке исполнения запроса:

CREATE DOMAIN EMP_NO AS INTEGER

    CHECK (VALUE BETWEEN 1 AND 10000);

Выдается ошибка: Неизвестный тип объекта "DOMAIN" в интсрукции CREATE, DROP или ALTER. 

Используется SQL Server MS SQL 2008R2

Александра Каева
Александра Каева
Евгений Вершинин
Евгений Вершинин
Россия, Нижний Новгород, Нижегородский государственный технический университет, 2008
Aleksandr Arshinskyi
Aleksandr Arshinskyi
Россия