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

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

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Аннотация: В этой и следующих трех лекциях рассматривается важнейший оператор языка SQL - оператор SELECT, предназначенный для выборки данных из SQL-ориентированной базы данных. Этот оператор имеет довольно сложную и развитую структуру, но, по нашему мнению, его необходимо знать любому специалисту, так или иначе связанному с использованием баз данных; поэтому в нашем курсе ему уделяется так много внимания. Первая лекция носит подготовительный характер. В ней мы рассматриваем виды скалярных выражений, используемые, прежде всего, в конструкциях оператора SELECT, обсуждаем базовую семантику выполнения этого оператора и анализируем принципы и разновидности указания таблиц, из которых производится выборка данных.
Ключевые слова: SQL, базы данных, языками запросов, стандарт языка, выборка данных, подмножество, представление, скалярное выражение, численное выражение, булевское выражение, вычисление выражения, первичное выражение, литеры, динамический SQL, хранимая процедура, D-триггер, агрегатная функция, скалярный подзапрос, подзапрос, неопределенное значение, выражение с переключателем, вызов функций с численным значением, преобразование типов, extract, ABS, mod, выражение символьных и битовых строк, вызов функций, возвращающих строчные значения, выделение подстроки, substring, UPPER, escape, символьная строка, translation, trim, overlay, кодировка символов, трансляция, выражение даты-времени, тип дата/время, арифметическая операция, вызов функций, возвращающих значение дата-время, пара функций, единица измерения, булевский тип, приоритет операций, унарные операции, операция конъюнкции, дизъюнкция, таблица истинности, выражение переключателем, выражение с поисковым переключателем, логические выражения, значение выражения, выражение с простым переключателем, operand, оператор SELECT, раздел FROM, реляционная алгебра, декартово произведение, операция переименования атрибутов, псевдоним, correlation, раздел WHERE, условное выражение, ограничение целостности, раздел HAVING, раздел GROUP BY, предикат, AVG, раздел SELECT, имя таблицы, distinction, раздел ORDER BY, стандарт SQL:1999, collate, ASC, DESC, технические ограничения, стандарт SQL:2003, конструктор типа мультимножества, таблица разделов, порождаемая таблица с горизонтальной связью, соединенная таблица, табличное выражение, спецификация запроса, выражение запросов, UNION, INTERSECT, операция пересечения, операция объединения, теоретико-множественные операции в SQL, терм, no-op, SL, эквивалентное выражение, C2, DN, приведение типов, recursive, конструктор значения-таблицы, конструктор значения-строки, раздел FROM, представляемые таблицы или представления (VIEW), базовые таблицы, оператор CREATE VIEW

Введение

Несмотря на то, что язык SQL является полным языком баз данных, включающим множество разнообразных средств определения схемы, ограничения и поддержки целостности базы данных, поддержки администрирования, заполнения и модификации таблиц базы данных, поддержки разработки приложений и т. д., для подавляющего большинства пользователей этот язык остается языком запросов, т. е. языком, позволяющим формулировать произвольно сложные и точные декларативные запросы к базе данных.

Как отмечалось в конце предыдущей лекции, структура стандарта языка SQL фактически не позволяет описать одну часть языка (в частности, средства запросов) в отрыве от других частей. Тем не менее, полагая, что средства выборки данных составляют наиболее интересную и практически значимую часть языка, мы выделили для их рассмотрения несколько отдельных лекций.

Напомним, что в этом курсе мы ограничиваемся базовым подмножеством SQL:1999 и SQL:2003 ("прямым SQL") и даже это подмножество описываем не в полном объеме стандарта. Кроме того, в данной лекции мы не будем точно придерживаться порядка введения понятий и синтаксических конструкций, принятого в стандарте языка. Мы начнем с некоторой общей картины, дающей представление об операторе выборки, а затем будем постепенно уточнять ее.

Скалярные выражения

Скалярное выражение 1В стандарте языка SQL в качестве общего термина для обозначения таких выражений используется термин value expression. Однако в менее формальных публикациях обычно применяется более понятный термин scalar expression, для которого, вдобавок, существует адекватный русский эквивалент скалярное выражение. В этом курсе мы также предпочитаем использовать именно этот термин. - это выражение, вырабатывающее результат некоторого типа, специфицированного в стандарте. Скалярные выражения являются основой языка SQL, поскольку, хотя это реляционный язык, все условия, элементы списков выборки и т. д. базируются именно на скалярных выражениях. В SQL:1999 имеется несколько разновидностей скалярных выражений. К числу наиболее важных разновидностей относятся численные выражения ; выражения со значениями-строками символов; выражения со значениями даты-времени; выражения со значениями-временными интервалами; булевские выражения. Мы не будем слишком глубоко вникать в тонкости, но тем не менее приведем некоторые базовые спецификации и пояснения.

Прежде чем перейти к конкретным видам скалярных выражений, рассмотрим некоторые наиболее общие языковые конструкции, на которых эти выражения базируются.

Общие синтаксические правила построения скалярных выражений

В SQL:2003 имеются девять разновидностей выражений в соответствии с девятью категориями типов данных, значения которых вырабатываются при вычислении выражения

value_expression ::= 
    numeric_value_expression
  | string_value_expression
  | datetime_value_expression
  | interval_value_expression
  | boolean_value_expression 
  | array_value_expression
  | multiset_value_expression
  | row_value_expression
  | user_defined_value_expression
  | reference_value_expression

Как уже отмечалось в начале этого раздела, мы ограничимся обсуждением первых пяти разновидностей выражений. В основе построения этих видов выражений лежит первичное выражение, определяемое следующим синтаксическим правилом:

value_expression_primary ::= 
    unsigned_value_specification
  | column_reference
  | set_function_specification
  | scalar_subquery 
  | case_expression 
  | (value_expression) 
  | cast_specification

В пределах этого курса можно считать, что спецификация беззнакового значения ( unsigned_value_specification ) - это всегда литерал соответствующего типа или вызов ниладической функции (например, CURRENT_USER )2Другие варианты появляются во встраиваемом и динамическом SQL, а также расширении языка, предназначенного для написания кода хранимых процедур, триггеров, методов определяемых пользователями типов и т.д. В любом случае беззнаковое значение известно до начала компиляции любой содержащей его конструкции языка SQL.. При вычислении выражения V для строки таблицы каждая ссылка на столбец (column_reference) этой таблицы, непосредственно содержащаяся в V, рассматривается как ссылка на значение данного столбца в данной строке. Агрегатные функции ( функции над множествами - set_function_specification ) обсуждаются в следующих лекциях. Если первичное выражение является скалярным подзапросом ( scalar_subquery, или подзапросом, результатом которого является таблица, состоящая из одной строки и одного столбца) и результат подзапроса пуст, то результат первичного выражения - неопределенное значение. ( Подзапросы обсуждаются в следующей лекции, выражения с переключателем ( case_expression ) рассматриваются ниже в этом разделе.)

Численные выражения

Численное выражение - это выражение, значение которого относится к числовому типу данных. Вот формальный синтаксис численного выражения:

numeric_value_expression> ::= numeric_term
	| numeric_value_expression + term
	| numeric_value_expression - term
numeric_term ::= numeric_factor
	| numeric_term * numeric_factor 
	| numeric_term / numeric_factor 
numeric_factor ::= [ { + | - } ] numeric_primary 
numeric_primary ::= value_expression_primary
	| numeric_value_function

Следует обратить внимание на то, что в численных выражениях SQL первичная составляющая ( numeric_primary ) является либо первичным выражением (см. выше), либо вызовом функции с численным значением ( numeric_value_function ). Из этого, в частности, следует, что в численные выражения могут входить выражения с переключателем и операции преобразования типов. Вызовы функций с численным значением определяются следующими синтаксическими правилами:

numeric_value_function ::= 
	POSITION (character_value_expression 
	IN character_value_expression)
	|{CHAR_LENGTH | CHARACTER_LENGTH }
	(string_value_expression) 
	| OCTET_LENGTH (string_value_expression)
	| BIT_LENGTH (string_value_expression) 
	| EXTRACT ({ datetime_field | time_zone field }
	  FROM { datetime_value_expression
	    | interval_value_expression })
	| CARDINALITY (array_value_expression 
	      | multiset_value_expression)
	| ABS (numeric_value_expression)
	| MOD (numeric_value_expression)

Мы достаточно подробно обсуждали функции определения позиции и длины по отношению к символьным и битовым строкам при рассмотрении соответствующих типов данных; здесь приводится только уточненный синтаксис их вызова. Функция EXTRACT извлечения поля из значений дата-время или интервал позволяет получить в виде точного числа с масштабом 0 значение любого поля (года, месяца, дня и т. д.). Какой конкретный тип точных чисел будет выбран - определяется в реализации. Функции ABS и MOD возвращают абсолютное значение числа и остаток от деления одного целого значения на другое соответственно.

Выражения, значениями которых являются символьные или битовые строки

Выражения символьных и битовых строк - это выражения, значениями которых являются символьные или битовые строки. Соответствующие конструкции определяются следующим синтаксисом:

string_value_expression ::= character_value_expression 
	| bit_value_expression 
character_value_expression ::= сoncatenation
	| character_factor 
concatenation ::= character_value_expression || character_factor
character_factor ::= character_primary [ collate_clause ] 
character_primary ::= value_expression_primary 
	| string_value_function 
bit_value_expression ::= bit_concatenation
	| bit_factor
bit_concatenation ::= bit_value_expression || bit_primary
bit_primary ::= value_expression_primary 
	| string value function

Если не вдаваться в тонкости, смысл выражений символьных и битовых строк понятен из описания синтаксиса: единственная применимая для построения выражений операция - это конкатенация, производящая "склейку" строк-операндов. Более важно то, что первичной составляющей выражения над строками может быть как первичное скалярное выражение (см. выше), так и вызов функций, возвращающих строчные значения. Репертуар и синтаксис вызова таких функций определяются следующими правилами:

string_value_function ::= character_value_function 
	| bit_value_function 
character _value_function ::= SUBSTRING 
	(character _value_expression 
	  FROM start_position 
	    [ FOR string_length ])
	  | SUBSTRING (character _value_expression
	    SIMILAR character _value_expression
	      ESCAPE character_value_expression)
	  | { UPPER | LOWER }
	    (character_value_expression)
	  | CONVERT (character_value_expression
	    USING conversion_name)
	  | TRANSLATE (character_value_expression) 
	    USING translation_name)
	  | TRIM ([ {LEADING | TRAILING | BOTH} ]
	    [ character_value_expression ]
	    [ character_value_expression ])
	  | OVERLAY (character_value_expression
	    PLACING character_value_expression
	      FROM start_position
	        [ FOR string_length ])
bit _value_function ::= SUBSTRING (bit_value_expression 
	    FROM start_position 
	      [ FOR string_length ])
start_position ::= numeric_value_expression 
string length ::= numeric_value_expression

Основные полезные функции - выделение подстроки ( SUBSTRING ) и замена малых букв на заглавные и наоборот ( UPPER и LOWER ) - мы упоминали при рассмотрении типов символьных и битовых строк. Обсуждение функции SUBSTRING ... SIMILAR ... ESCAPE отложим до следующей лекции. Как видно из описания синтаксиса функций, возвращающих строчные значения, для символьных строк имеются еще четыре функции: CONVERT, TRANSLATE, TRIM и OVERLAY. По смыслу все они очень просты. Функция CONVERT меняет кодировку символов в заданной строке, причем набор символов не меняется. Способ задания правил перекодировки определяется в реализации. Функция TRANSLATE, наоборот, в соответствии с правилами трансляции "переводит" текстовую строку на другой язык (используя набор символов целевого алфавита). Кодировка не меняется. Функция TRIM "отсекает" последовательности указанного символа в начале, в конце или в конце и начале заданной строки. Наконец, функция OVERLAY заменяет указанную подстроку первого операнда строкой, заданной в качестве второго операнда.

< Лекция 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

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