Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ковалев Язык баз данных SQL

.pdf
Скачиваний:
18
Добавлен:
29.03.2016
Размер:
329.68 Кб
Скачать

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

При определении хранимого столбца с ним может быть связано одно или несколько ограниче- ний столбца в виде

1)ограничения первичного ключа,

2)ограничения кандидатного ключа,

3)ограничения внешнего ключа,

4)проверочного ограничения.

Ограничение первичного ключа primary key может быть задано не более чем для одного столбца таблицы. Первичный ключ не может быть объявлен как столбец с допустимыми null- значениями.

Ограничение кандидатного ключа unique отличается от ограничения первичного ключа тем, что в таблице это ограничение может быть задано для любого числа столбцов и, кроме того, null-значение может быть объявлено допустимым. В последнем случае null-значение может появиться в данном столбце не более чем в одной строке таблицы в силу ограничения уникаль- ности (но это правило действительно не для всех диалектов SQL).

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

Индексы в языке Transact-SQL могут быть кластерными и некластерными (clustered, nonclustered).

Кластерный индекс устанавливает порядок, в котором строки таблицы хранятся физически. Не- кластерный индекс представляет собой отдельный объект внутри базы данных, который указы- вает на определенные строки таблицы, но не устанавливает порядок их хранения. Понятно, что кластерным может быть объявлен не более чем один индекс в таблице.

Ограничения внешнего ключа foreign key предназначены для поддержания ссылочной целост- ности. Столбец, определяемый с таким ограничением, должен ссылаться на столбец некоторой так называемой ссылочной таблицы, причем столбцу ссылочной таблицы должен соответство- вать уникальный индекс (обычно это первичный ключ). Ссылочная таблица выступает в каче- стве родительской. Таблица с определяемым столбцом выступает в качестве дочерней.

Фразы on update и on delete с опцией cascade определяют режимы каскадного обновления и удаления соответственно. А именно, если запись обновляется или удаляется в родительской таблице, то она автоматически обновляется или удаляется в дочерней таблице.

Фразы on update и on delete с опцией no action запрещают режим каскадирования. При этом обновление или удаление записи в родительской таблице будет возможно, если только ей не соответствует ни одна запись в дочерней таблице.

Безотносительно к опции cascade или no action

1)добавление записи к родительской таблице возможно всегда. Добавление записи к до- черней таблице возможно, если значение внешнего ключа встречается в родительской таблице.

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

11

2)обновление записи в дочерней таблице возможно, если только оно не нарушает условие ссылочной целостности, т.е. при изменении значения внешнего ключа новое значение встречается в родительской таблице. В противном случае обновление не принимается.

3)удаление записи в дочерней таблице возможно всегда, т.к. условие ссылочной целостно- сти связей рассматриваемых типов при этом не нарушается.

Если фраза on update или on delete не указана, то для нее по умолчанию принимается опция no action.

Проверочное ограничение для столбца check определяет правило целостности на уровне значе- ния столбца. В логическом выражении, указанном в скобках после ключевого слова check, ссылка на проверяемое значение столбца производится по имени столбца. Логическое выраже- ние может содержать константы и функции.

4.2Определение вычисляемого столбца

Вычисляемый столбец является виртуальным столбцом и физически в таблице не хранится. Он вычисляется согласно заданному выражению, исходя из значений других столбцов в строке той же таблицы. Выражение вычисляемого столбца может содержать имена хранимых столбцов, а также константы и функции.

Приведем пример определения вычисляемого столбца:

стоимость as ценаЗаКг * весКг

ценаЗаКг

весКг

...

стоимость

100

5

 

500

 

 

 

 

 

 

 

 

4.3Ограничение строки

Ограничения столбца записывались при определении хранимого столбца и поэтому не содер- жали ссылок на определяемый столбец.

Ограничения строк относятся ко всей совокупности столбцов таблицы и потому требуют указа- ния используемых столбцов. Ограничения позволяют определять составные первичные, канди- датные и внешние ключи. Для первичных и кандидатных ключей опции asc и desc определяют порядок сортировки отдельных столбцов в лексикографическом упорядочивании строк по воз- растанию и убыванию соответственно. Логическое выражение, определяющее проверочное ог- раничение check, может содержать ссылки на любые столбцы создаваемой таблицы.

4.4Удаление таблиц

Удаление таблицы производится с помощью оператора

drop table имя_таблицы

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

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

12

4.5Создание и удаление индексов

Индексы создаются с помощью оператора

create [unique] { clustered | nonclustered } index имя_индекса

on имя_таблицы ({имя_столбца [asc | desc ]} ,..)

Опции asc и desc определяют порядок сортировки отдельных столбцов в лексикографическом упорядочивании строк по возрастанию и убыванию соответственно.

Индексы могут быть удалены с помощью оператора

drop index {имя_таблицы.имя_индекса} ,..

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

13

5. Работа с данными

5.1Вставка строк

Для вставки строк в существующую таблицу используется оператор insert into в одной из сле- дующих форм.

insert into имя_таблицы [(имя_столбца ,..)] Форма 1 оператор_select

Форма 2

insert into имя_таблицы [(имя_столбца ,..)] values({ default | null | выражение } ,..)

Форма 3

insert into имя_таблицы default values

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

Вформе 1 в таблицу вставляется набор строк, возвращаемый оператором select.

Вформе 2 в таблицу вставляется единственная строка. Вместо указания явного значения столб- ца для этой строки могут использоваться ключевые слова default или null для вставки значений по умолчанию или null-значений соответственно. Выражение не может содержать оператор select.

Вформе 3 в таблицу вставляется единственная строка, состоящая из значений по умолчанию. Вставка значения по умолчанию подменяется на вставку null-значения, если значение по умол- чанию при определении таблицы явно не задано. Вставка строки с null-значениями пройдет ус- пешно, если только null-значения допустимы для соответствующих столбцов.

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

5.2Обновление строк

Оператор обновления update позволяет изменять значения в нескольких строках таблицы:

update имя_таблицы

set {имя_столбца = новое_значение} ,.. [from табличный_источник ,..]

[where условие_поиска]

Подобно оператору вставки insert into, один оператор обновления update может модифициро- вать только одну таблицу или одно представление. За ключевым словом set следует перечень подлежащих обновлению столбцов с указанием их новых значений. Новое значение может быть константой или выражением, которое также может ссылаться на сам столбец. Например, следующий оператор будет уменьшать значения в столбце Цена на 10%:

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

14

update Товары

set Цена = Цена * 0.90

Фраза where не является обязательной. Если она указана, то должна задавать строки, подлежа- щие обновлению. Если фраза where отсутствует, то будут обновляться все строки.

Оператор update может содержать фразу from для извлечения значений из другой таблицы. Фраза from здесь имеет тот же формат, что и в операторе select. Как и для оператора select, здесь можно задать более одной таблицы путем добавления операторов соединения. В следую- щем примере значения столбца Название в таблице T1 устанавливается в значения аналогично- го столбца таблицы T2:

update T1

set T1.Название = T2.Название

from T1 inner join T2 on T1.ключ = T2.ключ

5.3Удаление строк

Оператор delete удаляет несколько строк таблицы:

delete имя_таблицы

[from табличный_источник ,..] [where условие_поиска]

Необязательная фраза where дает возможность отбирать удаляемые строки. Если эта фраза опущена, то будут удалены все строки в указанной таблице.

Фраза from позволяет задавать дополнительные таблицы, которые будут использоваться в ус- ловии поиска во фразе where (поэтому фраза from без фразы where не имеет смысла). Подоб- ный синтаксис оператора может, но не должен вводить в заблуждение, поскольку строки не бу- дут удаляться из таблиц, указанных во фразе from. Если во фразе from указывается более од- ной таблицы, их имена следует отделять запятыми.

Таким образом, оператор delete не поддерживает применение операций соединения join и по- этому соединение таблиц следует проводить во фразе where.

Следующий пример удалит те строки из таблицы T1, которые имеют аналог в таблице T2:

delete

T1

from

T2

where

T1.ключ = T2.ключ

Все строки таблицы могут быть удалены одновременно с помощью оператора

truncate table имя_таблицы

Это оператор отличается от оператора delete без фразы where тем, что не записывается в жур- нал транзакций и, как следствие, выполняется существенно быстрее. Кроме того, оператор truncate table сбрасывает значение счетчика для идентификационного столбца.

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

15

6. Оператор select

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

торе select.

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

Частным случаем оператора select является базовый оператор select:

базовый_оператор_select ::=

select [all | distinct] [top целое [percent]]

выбираемый_столбец ,..

[from табличный_источник ,..] [where условие_поиска]

[group by [all] выражение_группировки ,..] [having условие_поиска]

6.1Фраза select

Фраза select является обязательной фразой базового оператора select:

фраза_select ::=

select [all | distinct] [top целое [percent]]

выбираемый_столбец ,..

выбираемый_столбец ::=

{[имя_или_псевдоним_таблицы.]*

|

[имя_или_псевдоним_таблицы.]имя_столбца [as псевдоним_столбца]

|

выражение_вычисляемого_столбца [as псевдоним_столбца]

}

 

Опция all означает, что в результирующем запросе дубликаты строк остаются. Этот режим дей- ствует по умолчанию. Опция distinct означает, что в результирующий запрос дубликаты строк не включаются. Дубликатами считаются полностью идентичные строки, то есть строки, имею- щие null-значения в одних и тех же столбцах и совпадающие значения в столбцах с не null- значениями. В частности, если в результате запроса будут получены строки, состоящие из null- значений во всех столбцах, то в результирующий запрос с ключевым словом distinct будет включена единственная строка с null-значениями.

Фраза top n, где n ³ 0 – целое число, позволяет оставить в результирующем запросе n первых строк. Если n превышает общее число полученных в запросе строк, то возвращаются все стро- ки. Фраза top n percent аналогична по действию, но задает количество возвращаемых строк в процентах, так что 0 £ n £ 100.

Список выбираемых столбцов определяет столбцы, возвращаемые в результирующем запросе. Если указан символ *, то выбираются все столбцы всех таблиц, упоминающихся во фразе from. Если символ * предваряется ссылкой на имя или псевдоним конкретной таблицы из фразы from, то выбираются все столбцы именно этой таблицы. При выборе конкретного столбца его

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

16

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

Выражение вычисляемого столбца помимо констант, функций и имен столбцов из таблиц фра- зы from может содержать подзапросы, о есть заключенные в круглые скобки запросы по опера- тору select, возвращающие единственное значение (1 столбец, 1 строка).

Столбцы могут быть переименованы, а вычисляемые столбцы поименованы с помощью фразы as псевдоним_столбца. Вычисляемые столбцы могут быть не поименованы, если только это не требуется в контексте применения оператора select. Введение псевдонимов столбцов бывает необходимым для обеспечения уникальности имен столбцов результирующего запроса.

Если базовый оператор select представлен единственной фразой select, то опции all и distinct теряют смысл, и результирующий запрос будет состоять из одной строки (если только не указа- на фраза top 0).

Например, следующий оператор возвратит строку для формирования заголовка расширенной таблицы:

select

Наименованиеas Боковик,

1as Столбец1,

2as Столбец2,

3as Столбец3

Боковик

Столбец1

Столбец2

Столбец3

Наименование

1

2

3

6.2Фраза from

Фраза from является необязательной фразой базового оператора select:

фраза_from ::=

from табличный_источник ,..

табличный_источник ::=

 

{

имя_таблицы [as псевдоним_таблицы]

|

(оператор_select) as псевдоним_таблицы

|

соединенные_таблицы

 

}

 

 

соединенные_таблицы ::=

 

{

табличный_источник

cross join табличный_источник

|

табличный_источник

тип_соединения табличный_источник on условие_поиска

|

(соединенные_таблицы)

}

 

 

тип_соединения ::=

{inner join

|

left

[outer] join

|

right

[outer] join

|

full

[outer] join

}

 

 

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

17

В простейшем случае во фразе from в качестве табличного источника указывается одна табли- ца. Например, следующий запрос сокращает имена до инициалов:

Студенты(keyСтудент, Ф, И, О)

select keyСтудент, Ф, left(И, 1) + ‘.’ as И_инициал from Студенты

В качестве табличного источника во фразе from может выступать и оператор select, заключен- ный в круглые скобки. Частным случаем оператора select является базовый оператор select. Полная структура оператора select будет рассмотрена в дальнейшем.

Другие виды табличных источников связаны с соединенными таблицами (join соединение). Соединение может быть

1)cross join перекрестным,

2)inner join внутренним,

3)left [outer] join левым внешним,

4)right [outer] join правым внешним,

5)full [outer] join полным внешним.

Для внешних соединений ключевое слово outer (внешний) можно не указывать.

Перекрестные соединения соответствуют операции декартова произведения. Если эти операции применяются на самом верхнем уровне во фразе from, то знак операции cross join может быть заменен на запятую. Таким образом, следующие операторы являются эквивалентными:

select * from T1, T2

select * from T1 cross join T2

Здесь предполагается, что таблицы не имеют совпадающих имен столбцов. В противном случае потребовалось бы с помощью псевдонимов столбцов разрешить коллизию имен.

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

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

Студенты(keyСтудент, Ф, И, О)

Сессия(keyСтудент, keyПредмет, Оценка), 3 ≤ Оценка ≤ 5

select Студенты.keyСтудент, Ф, И, О, keyПредмет, Оценка

from Студенты inner join Сессия on Студенты.keyСтудент = Сессия.keyСтудент

Левое внешнее соединение отличается от внутреннего тем, что строки левого табличного ис- точника, не соединяемые по заданному условию ни с одной строкой правого табличного источ- ника, дополняются null-значениями и добавляются к результирующему запросу. Таким обра- зом, в последнем примере замена внутреннего соединения inner join на левое внешнее left join приведет к добавлению следующих строк для студентов, не сдавших к моменту запроса ни од- ного экзамена:

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

18

Студенты.keyСтудент, Ф,И, О, null, null

-

Правое внешнее соединение сводится к левому переменой мест табличных источников.

Полное внешнее соединение является объединением левого и правого соединений, так что ре- зультат внутреннего соединения будет дополнен несоединимыми строками как левого, так и правого табличных источников.

Общий вид условия поиска рассматривается ниже при описании фразы where.

6.3Фраза where

Фраза where задает условие отбора строк:

фраза_where ::=

where условие_поиска

Условие поиска комбинируется из предикатов, логических операций not, and, or и круглых скобок.

предикат: :=

 

 

 

1

{

выражение

{< | <= | = | < > | >= | >}

выражение

2

|

выражение

[not] between выражение1 and выражение2

3

|

выражение

is [not] null

 

4

|

строковое_выражение [not] like шаблон [escape ‘escape_ символ’]

5

|

выражение

[not] in

(выражение ,..)

 

6

|

выражение

[not] in

(подзапрос)

 

7

|

выражение

{< | <= | = | < > | >= | >}

{all | any} (подзапрос)

8

|

exists (подзапрос)

 

 

 

}

 

 

 

 

1-я форма предиката применяется для выражений любого типа, за исключением описывающих сверхбольшие блоки данных (BLOB – Binary Large Objects – крупные двоичные объекты).

2-я форма предиката с оператором [not] between (между) является сокращением следующего условия:

[not] (выражение1 <= выражение and выражение <= выражение2)

3-я форма предиката предназначена для тестирования null-значений.

4-я форма предиката с оператором like (похожий) позволяет отбирать строки по шаблону с ис- пользованием следующих символов замещения:

1)% – любая строка из нуля или более символов. Например, конструкция like ‘%t%’ соот- ветствует любым строкам, содержащим хотя бы один символ ‘t’.

2)_ (подчеркивание) – любой одиночный символ. Например, конструкция like ‘a_’ соот- ветствует двухсимвольным строкам, начинающимся с символа ‘a’.

3){_[символ-символ]_ | _[символ]_} – любой одиночный символ, содержащийся в диапа- зоне или последовательности символов. Например, конструкция like ‘[b-d]at’, как и like ‘[bcd]at’, соответствует строкам ‘bat’, ‘cat’, ‘dat’. Конструкции like ‘[ [ ]’ соответствует символ ‘[’.

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

19

4){_[^символ-символ]_ | _[^символ]_} – любой одиночный символ, не содержащийся в диапазоне или последовательности символов. Например, конструкция like ‘[^0-9]%’ со- ответствует любым строкам, первый символ которых не является цифрой.

Если символ замещения ‘%’ или ‘_’ необходимо сам по себе включить в шаблон, то следует или заключить его в квадратные скобки, или определить escape-символ (то есть символ перехода) и использовать его перед символом замещения. Например, следующие конструкции соответст- вуют двухсимвольным строкам, начинающимся с символа подчеркивания:

like ‘[ _ ] _’

like ‘/_ _’ escape ‘/’ like ‘!_ _’ escape ‘!’

5-я форма предиката соответствует предикату принадлежности элемента списку.

6-я форма предиката отличается от 5-й тем, что вместо списка задается подзапрос, возвращаю- щий один столбец (но не одну строку, так как требуется однотипность данных). Например, сле- дующий запрос выводит список студентов, получивших к моменту запроса хотя бы одну оцен- ку отлично:

Студенты(keyСтудент, Ф, И, О)

Сессия(keyСтудент, keyПредмет, Оценка), 3 ≤ Оценка ≤ 5.

select keyСтудент, Ф, И, О from Студенты

where keyСтудент in (select keyСтудент from Сессия where Оценка = 5)

Здесь в результирующем запросе поля из таблицы Сессия не используются и поэтому можно использовать подзапрос, а не соединение.

7-я форма предиката позволяет сравнивать выражения со всеми (all) или некоторыми (any) зна- чениями, возвращаемыми в подзапросе. В частности, следующие предикаты эквивалентны:

выражение in (подзапрос) выражение = any (подзапрос)

8-я форма предиката проверяет подзапрос на пустоту. С помощью этого предиката последний пример может быть записан в виде

select keyСтудент, Ф, И, О from Студенты

where exists

(select * from Сессия where keyСтудент = Студенты.keyСтудент and Оценка = 5)

Здесь подзапрос является примером так назывемого коррелированного подзапроса.

Указывать конкретные столбцы в подзапросе предиката exists смысла не имеет.

6.4Функции агрегирования

В SQL имеется ряд специальных функций, называемых функциями агрегирования и используе- мых при формировании списка выбираемых столбцов в операторе select. Основными из функ- ций являются

Спецкурс 3 (2010-2011. 5 курс, 9 сем. ПИЭ), 40 с.

20