Московский государственный университет имени М.В.Ломоносова
Опубликован: 10.10.2005 | Доступ: свободный | Студентов: 8472 / 635 | Оценка: 3.85 / 3.50 | Длительность: 22:03:00
Лекция 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

Александра Каева
Александра Каева