При попытке исполнения запроса: CREATE DOMAIN EMP_NO AS INTEGER CHECK (VALUE BETWEEN 1 AND 10000); Выдается ошибка: Неизвестный тип объекта "DOMAIN" в интсрукции CREATE, DROP или ALTER. Используется SQL Server MS SQL 2008R2 |
Общая характеристика оператора SELECT и организация списка ссылок на таблицы в разделе FROM
Введение
Несмотря на то, что язык 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 заменяет указанную подстроку первого операнда строкой, заданной в качестве второго операнда.