.RU

Лекция 13. Язык баз данных SQL: общая характеристика оператора SELECT и организация списка ссылок на таблицы в разделе FROM


^ Лекция 13. Язык баз данных SQL: общая характеристика оператора SELECT и организация списка ссылок на таблицы в разделе FROM

В этой и следующих трех лекциях обсуждается важнейший оператор языка SQL – оператор SELECT, предназначенный для выборки данных из SQL-ориентированной базы данных. Этот оператор имеет довольно сложную и развитую структуру, но, по нашему мнению, его необходимо хорошо понимать любому специалисту, так или иначе связанному с использованием баз данных; поэтому в этом курсе отведена такая большая часть для его обсуждения. Первая лекция носит подготовительный характер. В ней мы рассматриваем виды скалярных выражений, используемые, прежде всего, в конструкциях оператор SELECT, обсуждаем базовую семантику выполнения этого оператора и анализируем принципы и разновидности указания таблиц, из которых производится выборка данных.

^ Ключевые слова

Скалярное выражение, первичное выражение, агрегатная функция, скалярный подзапрос, численное выражение, вызов функций с численным значением, выражения символьных и битовых строк, вызов функций, возвращающих строчные значения, выражения даты-времени, вызовы функций, возвращающих значение дата-время, выражения со значениями типа временного интервала, булевские выражения, выражения с переключателем, выражение с поисковым переключателем, выражение с простым переключателем, выражение NULLIF, выражение COALESCE, оператор SELECT, семантика оператора выборки, раздел FROM, раздел WHERE, раздел GROUP BY, раздел HAVING, раздел SELECT, раздел ORDER BY, порождаемая таблица с горизонтальной связью, соединенная таблица, табличное выражение, спецификация запроса, выражение запросов, “теоретико-множественные” операции в SQL, раздел WITH выражения запросов, конструктор значения-строки, конструктор значения-таблицы, ссылки на базовые и представляемые таблицы, ссылки на порождаемые таблицы, представляемые таблицы, или представления (VIEW), оператор CREATE VIEW, оператор DROP VIEW.

13.1 Введение

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


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


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

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

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


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


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

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

В 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)*. При вычислении выражения V для строки таблицы каждая ссылка на столбец (column_reference) этой таблицы, непосредственно содержащаяся в V, рассматривается как ссылка на значение данного столбца в данной строке. Агрегатные функции (функции над множествами – set_function_specification) обсуждаются в следующих лекциях. Если первичное выражение является скалярным подзапросом (scalar_subquery, или подзапросом, результатом которого является таблица, состоящая из одной строки и одного столбца), и результат подзапроса пуст, то результатом первичного выражения является неопределенное значение. (Подзапросы обсуждаются следующей лекции, выражения с переключателем (case_expression) рассматриваются ниже в этом разделе.) Оператор явного преобразования типов (cast_specification) мы обсуждали в разд 11.4 Лекции 11.

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

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


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
(string_value_expression)
| OCTET_LENGTH (string_value_expression)
| BIT_LENGTH (string_value_expression)
| EXTRACT ( time_zone field
FROM datetime_value_expression
)
| CARDINALITY (array_value_expression
| multiset_value_expression)
| ABS (numeric_value_expression)
| MOD (numeric_value_expression)

Мы достаточно подробно обсуждали функции определения позиции и длины по отношению к символьным и битовым строкам при рассмотрении соответствующих типов данных; здесь приводится только уточненный синтаксис их вызова. Функция EXTRACT извлечения поля из значений дата-время или интервал позволяет получить в виде точного числа с масштабом 0 значение любого поля (года, месяца, дня и т.д.). Какой конкретный тип точных чисел будет выбран – определяется в реализации. Функцию CARDINALITY мы также обсуждали в Лекции 11. Функции 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)
| LOWER
(character_value_expression)
| CONVERT (character_value_expression
USING conversion_name)
| TRANSLATE (character_value_expression)
USING translation_name)
| TRIM ([ TRAILING ]
[ 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. По смыслу все они очень просты. Функция CONVERT меняет кодировку символов в заданной строке, причем репертуар символов не меняется. Способ задания правил перекодировки определяется в реализации. Функция TRANSLATE, наоборот, в соответствии с правилами трансляции “переводит” текстовую строку на другой язык (используя набор символов целевого алфавита). Кодировка не меняется. Функция TRIM “отсекает” последовательности указанного символа в начале, в конце или в конце и начале заданной строки. Наконец, функция OVERLAY заменяет указанную подстроку первого операнда строкой, заданной в качестве второго операнда.

^ Выражения даты-времени

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

datetime_value_expression ::=
datetime_term
| interval_value_expression + datetime term
| datetime_value_expression + interval term
| datetime value expression - interval term


datetime_term ::= datetime_primary
[ AT LOCAL ]


datetime_primary ::= value_expression_primary
| datetime_value_function


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


datetime_value_function ::= CURRENT_DATE
| CURRENT_TIME [ (precision) ]
| LOCALTIME [ (precision) ]
| CURRENT_TIMESTAMP [ (precision) ]
| LOCALTIMESTAMP [ (precision) ]

Видимо, приведенные синтаксические правила не нуждаются в комментариях: можно получить текущую дату, а также текущее время с желаемой точностью. Отличие функций LOCALTIME и LOCALTIMESTAMP от CURRENT_TIME и CURRENT_TIMESTAMP соответственно состоит в том, что первая пара функций не возвращает смещение локального времени от Гринвича.


Синтаксис выражений со значениями типа интервал определяется следующими правилами:


interval_value_expression ::=
interval_term
| interval_value_expression + interval term
| interval_value_expression - interval term
| (datetime value expression - datetime term)
interval_qualifier


interval_term ::= interval_factor
| interval_term * numeric_factor
| interval_term / numeric_factor
| numeric_term * interval_factor

interval_factor ::= [ + ]
interval_primary [ ]


interval_primary ::= value_expression_primary
| interval_value_function


Как видно из приведенных правил, выражения со значениями типа интервал устроены очень просто; почти вся содержательная информация была приведена при обсуждении соответствующего типа данных. Стоит только заметить, что квалификатор интервала указывается для того, чтобы явно специфицировать единицу измерения интервала. Поддерживается только одна функция ABS, аргументом которой является выражение со значением типа интервал.

^ Булевские выражения

К булевским выражениям относятся выражения, вырабатывающие значения булевского типа (напомним, что булевский тип языка SQL содержит три логических значения – true, false и unknown). Булевские выражения определяются следующими синтаксическими правилами:


boolean_value_expression ::= boolean_term
| boolean_value_expression OR boolean_term


boolean_term ::= boolean_factor
| boolean_term AND boolean_factor


boolean_factor ::= [ NOT ] boolean_test


boolean_test ::= boolean_primary [ IS [ NOT ] truth_value ]


truth_value ::= TRUE | FALSE | UNKNOWN


boolean_primary ::= predicate
| (boolean_value_expression)
| value_expression_primary


Выражения вычисляются слева направо с учетом приоритетов операций (наиболее приоритетна унарная операция NOT, следующим уровнем приоритета обладает “мультипликативная” операция конъюнкции AND, и самый низкий приоритет у “аддитивной” операции дизъюнкции OR) и круглых скобок. Операции IS и IS NOT определяются следующими таблицами истинности:

IS
TRUE

FALSE

UNKNOWN

TRUE

TRUE

FALSE

FALSE

FALSE

FALSE

TRUE

FALSE

UNKNOWN

FALSE

FALSE

TRUE




IS NOT

TRUE

FALSE

UNKNOWN

TRUE

FALSE

TRUE

TRUE

FALSE

TRUE

FALSE

TRUE

UNKNOWN

TRUE

TRUE

FALSE



^ Выражения с переключателем

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


case_expression ::= case_abbreviation
| case_specification

case_abbreviation ::= NULLIF (value_expression , value_expression)
| COALESCE (value_expression_comma_list)


case specification ::= simple_case | searched_case

simple_case ::= CASE value_expression simple_when_clause_list
[ ELSE value_expression ] END

searched_case ::= CASE searched_when_clause_list
[ ELSE value_expression ] END


simple_when_clause ::= WHEN value_expression
THEN value_expression


searched_when_clause ::= WHEN conditional_expression
THEN value_expression


Наиболее общим видом выражения с переключателем является выражение с поисковым переключателем (searched_case). Правила вычисления выражений этого вида состоят в следующем. Вычисляется логическое выражение, указанное в первом разделе WHEN списка (searched_when_clause_list). Если значение этого логического выражения равняется true, то значением всего выражения с поисковым переключателем является значение выражения, указанного в первом разделе WHEN после ключевого слова THEN. Иначе аналогичные действия производятся для второго раздела WHEN и т.д. Если ни для одного раздела WHEN при вычислении логического выражения не было получено значение true, то значением всего выражения с поисковым переключателем является значение выражения, указанного в разделе ELSE. Типы всех выражений, значения которыми могут являться результатом выражения с поисковым переключателем, должны быть совместимыми, и типом результата является “наименьший общий” тип набора типов выражений-кандидатов на выработку результата.* Если в выражении отсутствует раздел ELSE, предполагается наличие раздела ELSE NULL.


В выражении с простым переключателем (simple_case) тип данных операнда переключателя (выражения, непосредственно следующего за ключевым словом CASE; назовем его CO – Case Operand) должен быть совместим с типом данных операнда каждого варианта (выражения, непосредственно следующего за ключевым словом WHEN; назовем WO – When Operand). Выражение с простым переключателем


    CASE CO WHEN WO1 THEN result1
    WHEN WO2 THEN result2
    . . . . . . .
    WHEN WOn THEN resultn
    ELSE result
    END


эквивалентно выражению с поисковым переключателем


    CASE WHEN CO = WO1 THEN result1
    WHEN CO = WO2 THEN result2
    . . . . . . .
    WHEN CO = WOn THEN resultn
    ELSE result
    END


Выражение NULLIF (V1, V2) эквивалентно следующему выражению с переключателем:


    CASE WHEN V1 = V2 THEN NULL ELSE V1 END.


Выражение COALESCE (V1, V2) эквивалентно следующему выражению с переключателем:


    CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END.


Выражение COALESCE (V1, V2, . . . Vn) для n ≥ 3 эквивалентно следующему выражению с переключателем:


    CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, . . . n) END.




konceptualnie-osnovaniya-psihologicheskogo-soprovozhdeniya-psihosocialnoj-adaptacii-subektov-uchebnoj-i-professionalnoj-deyatelnosti-sistemi-organov-vnutrennih-del.html
konceptualnie-osnovi-formirovaniya-regionalnoj-sistemi-neprerivnogo-obrazovaniya-naseleniya-po-protivodejstviyu-terrorizmu.html
konceptualnie-osnovi-professionalizacii-gosudarstvennogo-upravleniya-v-ukraine.html
konceptualnie-podhodi-k-formirovaniyu-metapredmetnih-znanij-starsheklassnikov-v-usloviyah-profilnogo-obucheniya.html
konceptualnie-problemi-prepodavaniya-inostrannih-yazikov-v-tehnicheskom-vuze.html
konceptualnij-podhod-kursovaya-rabota-po-predmetu-organizaciya-i-tehnologiya-kommercheskoj-deyatelnosti.html
  • tests.bystrickaya.ru/medicinskoe-pravo-kak-otrasl-prava-i-ego-mesto-v-sisteme-rossijskogo-prava-obzor-zakonodatelstva-ob-ohrane-zdorovya-grazhdan.html
  • shpora.bystrickaya.ru/xix-dobrie-serdca-ohotnik-na-vodoplavayushuyu-dich-dyuma.html
  • reading.bystrickaya.ru/konspekt-otkritogo-uroka-vo-2-klasse-po-teme-prazdnik-alfavita.html
  • paragraf.bystrickaya.ru/z-a-kavteladze-9-35-10-45-zasedanie-1-kak-ya-delayu.html
  • tests.bystrickaya.ru/lekciya-26-evristicheskie-metodi-resheniya-tvorcheskih-zadach-uchebnik-prednaznachen-v-pervuyu-ochered-studentam-kak.html
  • abstract.bystrickaya.ru/2-maya-v-zale-oblastnoj-filarmonii-proshel-prazdnichnij-koncert-kostromskogo-simfonicheskogo-orkestra-s-lyubovyu-k-rossii-vnimaniyu-kostromichej-bili-predlozheni-pr.html
  • pisat.bystrickaya.ru/tematicheskij-plan-uchebno-metodicheskoe-posobie-izdatelstvo-moskva.html
  • institut.bystrickaya.ru/tverskaya-13-moskovskaya-pressa-regionalnaya-pressa.html
  • esse.bystrickaya.ru/razvitie-metodov-ekonomicheskogo-upravleniya-investiciyami-v-obespechenie-radiacionno-ekologicheskoj-chistoti-nedvizhimosti.html
  • textbook.bystrickaya.ru/informacionnij-byulleten-novih-postuplenij-literaturi-v-biblioteku-v-dekabre-2007-goda.html
  • books.bystrickaya.ru/blokada-leningrada-blokada-leningrada.html
  • znaniya.bystrickaya.ru/razdel-1federalnoe-zakonodatelstvo-ob-obrazovaniii-pravah-rebenka-koncepciya-modernizacii-rossijskogo-obrazovaniya.html
  • institute.bystrickaya.ru/glava-vtoraya-konstruirovanie-dopolnitelnih-ustrojstv-k-magnitofonam.html
  • urok.bystrickaya.ru/prikaz-ot-2011-g-rabochaya-programma-po-elektivnomu-kursu-nachertatelnaya-geometriya-i-tehnicheskoe-cherchenie-10-klass.html
  • shpargalka.bystrickaya.ru/vklad-pobeditel-ot-sberbanka-s-povishennoj-procentnoj-stavkoj-rossijskaya-blagotvoritelnost-v-zerkale-smi.html
  • uchenik.bystrickaya.ru/istochniki-kommercheskogo-prava-2.html
  • kanikulyi.bystrickaya.ru/vstroennij-kontrol-i-diagnostika-cifrovih-ustrojstv-metodi-povisheniya-kontroleprigodnosti-cifrovih-ustrojstv.html
  • zanyatie.bystrickaya.ru/preimushestva-primeneniya-avtomatizirovannih-sistem-kontrolya-ispitanij.html
  • student.bystrickaya.ru/3-e-mezhdunarodnoe-soveshanie-po-sohraneniyu-lesnih-geneticheskih-resursov-sibiri.html
  • bukva.bystrickaya.ru/psihogennie-psihicheskie-rasstrojstva-isklyuchitelnie-sostoyaniya.html
  • kolledzh.bystrickaya.ru/avtomat-kalashnikova.html
  • letter.bystrickaya.ru/na-protyazhenii-vot-uzhe-neskolkih-let-ya-ispolzuyu-s-5-po-9-klassi-kartochki-tematika-ih-raznoobrazna-naprimer-mir-rastenij-zhizn-zamechatelnih-lyudej-mir.html
  • znanie.bystrickaya.ru/57-proizvodstvennaya-praktika-pedagogicheskaya-annotacii-programm-uchebnih-disciplin-oop-napravleniya-podgotovki.html
  • testyi.bystrickaya.ru/arhitektura-sovremennogo-pk.html
  • write.bystrickaya.ru/etnopedagogika-udk796067-obrazovanie-i-nauka-izvestiya-uralskogo-otdeleniya-rossijskoj-akademii-obrazovaniya.html
  • gramota.bystrickaya.ru/zadachi-razrabotat-potrebnostno-informacionnuyu-koncepciyu-obrazovaniya-i-vospitaniya-selskih-shkolnikov-stranica-3.html
  • write.bystrickaya.ru/funkcii-norm-prava.html
  • prepodavatel.bystrickaya.ru/tema-1-predmet-zadachi-sistema-i-metodi-kriminalistiki-uchebno-metodicheskij-kompleks-tyumen-2006.html
  • uchitel.bystrickaya.ru/referat-matematika-v-drevnej-indii.html
  • lecture.bystrickaya.ru/70-formirovanie-gruppovogo-povedeniya-v-organizacii.html
  • kontrolnaya.bystrickaya.ru/programma-raboti-konferencii-reglament-vistuplenie-15-min-uchastie-v-diskussii-5-min.html
  • tests.bystrickaya.ru/korrupciya-kak-obekt-matematicheskogo-modelirovaniya-chast-4.html
  • zadachi.bystrickaya.ru/obshie-trebovaniya-k-nalichiyu-specialnogo-programmnogo-obespecheniya-obespechivayushego-podderzhku-processa-distancionnogo-obucheniya.html
  • textbook.bystrickaya.ru/kirgizstana-illyustrirovana-fotografiyami-publikuetsya-po-knige-timirbaev-vyacheslav-mirsaid-mirrahimov-bishkek-zhizn-zamechatelnih-lyudej-kirgizstana-2009-310-s.html
  • turn.bystrickaya.ru/polozhenie-o-estestvennonauchnom-filiale-fyodorovskogo-instituta.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.