Вы находитесь на странице: 1из 20

Создание и актуализация отношений в Transact-SQL

_____________________________________________________________________________________

Создание и актуализация отношений в Transact-SQL


Цель работы:
1. Изучить основы Transact-SQL.
2. Изучить команды DDL и научиться создавать отношения при помощи Transact-SQL.
3. Научиться устанавливать ограничения в отношениях.
4. Изучить команды DML для актуализации отношений

Теоретические указания:
ОСНОВЫ TRANSACT-SQL

Стандартные инструкции языка манипулирования данными DML предназначены только для


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

Язык Transact-SQL, также известный как T-SQL, является реализацией стандарта SQL,
дополненной набором расширений Microsoft. Основной задачей языка T-SQL является обеспечение
программиста набором средств проектирования транзакционных баз данных. Язык T-SQL часто
ассоциируют с хранимыми процедурами, но на самом деле он представляет нечто большее. В
приложениях «клиент-сервер» он может быть задействован несколькими способами:

• T-SQL может использоваться в выражениях как часть команд DML INSERT, UPDATE и
DELETE, порожденных клиентским процессом;

• T-SQL может использоваться в программных блоках, направляемых от клиента к серверу;

• Функции T-SQL могут использоваться в качестве выражений в ограничениях проверки.

Код T-SQL может использоваться в хранимых процедурах, функциях и триггерах сервера


баз данных. Язык T-SQL предназначен для управления наборами данных. По этой причине он не
обладает некоторыми характерными чертами традиционных языков, которые необходимы для
программирования приложений. T-SQL – это декларативный язык программирования, поэтому его
можно противопоставить более распространённым языкам как Visual Basic, C# или Java.

Форматирование и пакеты T-SQL


Запросом называют одну инструкцию T-SQL, а пакетом – их набор. Вся последовательность
инструкций пакета отправляется серверу из клиентских приложений как одна цельная единица.
SQL Server рассматривает весь пакет как рабочую единицу. Наличие ошибки хотя бы в одной
инструкции приведет к невозможности выполнения всего пакета. В то же время грамматический
_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 1
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
разбор не проверяет имена объектов и схем, так как сама схема может измениться в процессе
выполнения инструкции.

Файл сценария SQL и окно анализатора запросов может содержать несколько пакетов. В
данном случае все пакеты разделяют ключевые слова терминаторов. По умолчанию этим
ключевым словом является GO, и оно должно быть единственным в строке. Все другие символы
(даже комментарии) нейтрализуют разделитель пакета.

Стандарт ANSI SQL требует помещения в конце каждой инструкции точки с запятой. В то
же время при программировании на языке T-SQL точка с запятой не обязательна. При этом нельзя
помещать точку с запятой после оператора TRY … END и после условия IF.

Любая длинная инструкция T-SQL может быть продолжена на следующей строке без
необходимости наличия какого-либо специального символа. Это свойство позволяет в
значительной мере повысить читаемость программного кода.

Типы комментариев в T-SQL:

• Однострочный комментарий:

-- Это комментарий стиля ANSI

• Многострочный комментарий:

/*
Триггер вставки таблицы Order Пол Нильсен
версия 1.0 21 июля 2006 года логика: и т.д.
*/

Редактор SQL может применять и удалять комментарии во всех выделенных строках. Для
этого нужно соответственно выбрать команду меню Edit -> Advanced -> Comment Selection или
Edit -> Advanced -> Uncomment Selection. Для запуска пакетов можно выбрать пункт меню Query -
> Execute, кнопку Execute из панели инструментов или же нажатием клавиши F5.

Переключение между базами данных

В интерактивном режиме работы текущая база данных всегда отображается на панели


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

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 2
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
ЯЗЫК DDL
Язык DDL (Data Definition Language) – это часть Transact-SQL, позволяющая создавать,
изменять и удалять структуры данных SQL. В отличие от DML, DDL не выполняет никаких
изменений над содержимым объектов, он определяет сами объекты.

Оператор CREATE
На первый взгляд может показаться, что задача создания многих объектов базы данных не
является такой уж сложной. Достаточно лишь учесть основные требования к конкретному объекту.
Но, к сожалению, на практике решение этой задачи часто становится весьма трудоемким. Прежде
всего, для успешного создания объектов необходимо тщательно соблюдать установленный
синтаксис. Оператором создания объектов является CREATE. Рассмотрим полную структуру
оператора CREATE, начиная с его наиболее обобщенной формы. Эта форма одинаково присуща
операторам CREATE, предназначенным для создания всевозможных объектов базы данных, а
различия обнаруживаются только в деталях. Первая часть оператора CREATE всегда выглядит так:
CREATE <object type> <object name>. За этой частью следуют дополнительные уточнения, состав
которых зависит от типа создаваемого объекта.

Оператор CREATE TABLE

Поскольку в данном разделе речь идет о создании таблиц, то указанная структура может
быть уточнена следующим образом:

CREATE TABLE [database_name.[owner].]table_name


(<column name> <data type>
[[DEFAULT <constant expression>]
|[IDENTITY [(seed, increment) [NOT FOR REPLICATION]]]]
[ROWGUIDCOL]
[COLLATE <collation name>]
[NULL | NOT NULL]
[<column constraints>]
|[column_name AS computed_column_expression]
|[<table_constraint>]
[,...n]
)
[ON {<filegroup> | DEFAULT}]
[TEXTIMAGE_ON {<filegroup> | DEFAULT}]

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

Имена таблиц и столбцов

Для именования таблиц и столбцов применяются такие же правила, какие относятся ко всем
другим объектам базы данных. В документации СУБД SQL Server они именуются правилами

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 3
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
выбора идентификаторов. Эти правила именования объектов довольно просты, но в данном
разделе основное внимание уделено не описанию принципов, используемых в СУБД SQL Server
для определения того, какие имена являются допустимыми и недопустимыми, а вопросам такого
выбора имен таблиц и столбцов, чтобы они были удобными и имели смысл.

Типы данных

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

Ключевое слово DEFAULT

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

Ключевое слово IDENTITY

Если в объявлении столбца указано, что этот столбец является столбцом идентификации, то
СУБД SQL Server автоматически присваивает последовательное числовое значение полю,
относящемуся к этому столбцу, при вставке каждой строки. Число, с которого в СУБД SQL Server
начинается отсчёт значений в столбце идентификации, называется начальным значением, а
величина, на которую это значение увеличивается или уменьшается после вставки каждой строки,
называется шагом. По умолчанию и начальное значение, и шаг равны 1. Значения столбцов
IDENTITY часто используются в качестве значений столбцов PRIMARY KEY, но не обязательно
только для этой цели.

Ключевое слово NULL / NOT NULL

Опция NULL и NOT NULL имеют довольно простое назначение – с их помощью можно
указать, допускает ли столбец, к которому относится та или иная опция, ввод NULL-значений, или
нет. По умолчанию сразу после инсталляции СУБД SQL Server для любого столбца задается
значение опции NOT NULL, если только во время инсталляции не будет предусмотрена
возможность применения неопределенных значений, или NULL-значений.

Ограничения столбца – COLUMN CONSTRAINTS

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


отдельных столбцов и касающиеся того, какие данные могут быть вставлены в тот или иной

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 4
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
столбец. В качестве примера можно указать ограничение, согласно которому в столбец
разрешается помещать только числовое обозначение месяца года, представленное числами от 1 до
12.

Вычисляемые столбцы – COMPUTED COLUMNS

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


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

<column name> AS <computed column expression>

Первый элемент этого определения, <column name>, остается практически таким же, как и в
других определениях столбцов, — он задает имя столбца, в котором будут представлены
вычисленные значения. Ещё одним элементом этого определения является выражение
вычисленного столбца. Это выражение может представлять собой любое обычное выражение, в
котором используются литералы или значения столбцов из той же таблицы. Пример применения:

ExtendedPrice AS Price * Quantity

Ограничения таблицы – TABLE CONSTRAINTS

Ограничения таблицы во многом аналогичны ограничениям столбца, поскольку также


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

Конструкция ON

Конструкция ON в определении таблицы представляет собой способ конкретного указания


того, в какой файловой группе (и, соответственно, на каком физическом устройстве) должна
находиться таблица. Таким образом, разработчик может поместить определенную таблицу на
указанное физическое устройство, но в большинстве случаев конструкция ON остается
незаданной, поэтому система помещает создаваемую таблицу в файловую группу,
предусмотренную по умолчанию (таковой является группа PRIMARY, если вместо неё не задано
какое-то другое значение).

Создание таблицы
USE Automobiles
CREATE TABLE TestСтраховки(
Номер_Страховки int IDENTITY NOT NULL,
Дата_Создания datetime NULL,
Адрес_Регистрации varchar(50) NULL,
_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 5
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
);
GO

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

ALTER <object type> <object name>

Оператор ALTER TABLE

Синтаксическая структура оператора модификации таблицы:

ALTER TABLE table_name


{[ALTER COLUMN <column_name>
{ [<schema of new data type>].<new_data_type> [(precision [, scale])]
max | <xml schema collection>
[COLLATE <collation_name>]
[NULL | NOT NULL]
|[{ADD | DROP} ROWGUIDCOL] | PERSISTED}]
|ADD
<column name> <data_type> [[DEFAULT <constant_expression>]
|[IDENTITY [(<seed>, <increment>) [NOT FOR REPLICATION]]]]
[ROWGUIDCOL]
[COLLATE <collation_name>]
[NULL | NOT NULL] [<column_constraints>]
|[<column_name> AS <computed_column_expression>]
|ADD
[CONSTRAINT <constraint_name>]
{[{PRIMARY KEY | UNIQUE}
[CLUSTERED|NONCLUSTERED]
{(<column_name>[ ,...n ])}
[WITH FILLFACTOR = <fillfactor>]
[ON {<filegroup> | DEFAULT}]
}
|FOREIGN KEY
[(<column_name>[ ,...n])]
REFERENCES <referenced_table> [(<referenced_column>[ ,...n])]
[ON DELETE {CASCADE | NO ACTION}]
[ON UPDATE {CASCADE | NO ACTION}]
[NOT FOR REPLICATION]
|DEFAULT <constant_expression>
[FOR <column_name>]
|CHECK [NOT FOR REPLICATION]
(< search_condit ions >)
[,...n] [,...n]
|[WITH CHECK | WITH NOCHECK]
|{ ENABLE | DISABLE } TRIGGER
{ ALL | <trigger name> [,...n ] }
|DROP
{[CONSTRAINT] <constraint_name>
|COLUMN <column_name>}[,...n]
|{CHECK | NOCHECK} CONSTRAINT
{ALL |<constraint_name>[,...n] }
|{ENABLE | DISABLE} TRIGGER
{ALL|<trigger_name>[,...n]}
_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 6
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
|SWITCH [PARTITION <source partition number expression> ]
TO [schema_name.]target_table
[PARTITION <target partition number expression> ]
}

Очевидно, что оператор модификации таблицы не менее сложен, чем оператор создания
таблицы, но многие его параметры повторяют то, что было описано выше.

К примеру, возникла необходимость дополнительно обеспечить хранение в таблице


TestСтраховки время регистрации страховки и некоторые другие атрибуты. Для решения этой
задачи достаточно ввести ещё один столбец. Синтаксическая структура необходимого для этого
оператора во многом напоминает структуру соответствующего оператора CREATE TABLE:

USE Automobiles
ALTER TABLE TestСтраховки
ADD
RegTime datetime NULL,
Contact varchar(25) NULL,
ТестоваяДата datetime NOT NULL DEFAULT '2005-11-07'

Оператор DROP
Выполнение оператора DROP приводит к удалению любого указанного в нем объекта
(объектов). Оператор DROP является весьма быстродействующим и удобным, а синтаксис этого
оператора остается полностью одинаковым применительно ко всем основным объектам СУБД SQL
Server (таблицам, представлениям, хранимым процедурам, триггерам и т.д.). Этот синтаксис
выглядит таким образом:

DROP <object type> <object name> [,...n]

Пример:

USE Automobiles
DROP TABLE TestСтраховки

При использовании оператора удаления необходимо соблюдать исключительную осторожность,


особенно в связи с тем, что перед его выполнением от пользователя не требуется подтверждение
того, что рассматриваемый объект действительно должен быть удален. СУБД SQL Server просто
действует на основании предположения, что решение пользователя обосновано, и сразу же удаляет
указанный объект (объекты).

Ограничения

Важный аспект проектирования базы данных – реализация бизнес-правил.

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 7
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
Ограничения (constraints) – это второй уровень реализации бизнес-правил; они запрещают
вводить в таблицу недопустимые данные. Примеры таких бизнес-правил – установка ограничения
кредитной линии в 50000 долларов США, а также запрет вводить в таблицу страны, которых нет в
стандартном списке.
Далее объясняются шесть типов ограничений, обеспечивающих соблюдение бизнес-правил.

Ограничения CHECK
Ограничения CHECK позволяют задать диапазон допустимых значений столбца или
определить его на основе логического выражения. Все ограничения CHECK возвращают
логическое значение true или false и не могут ссылаться на столбцы другой таблицы.
Ограничения CHECK создаются на двух уровнях:
 Ограничения CHECK на уровне столбца применяются только к заданному столбцу и не
могут ссылаться на данные из других столбцов.

 Ограничения CHECK на уровне таблицы могут ссылаться на любой столбец таблицы и не


могут ссылаться на столбцы в других таблицах.

Чаще всего такие ограничения сравнивают данные в столбце с конкретным значением:


CHECK Цена_Автомобиля >= 1000.
Можно создавать любое число ограничений CHECK, а также разделять их с помощью
логических операторов AND, OR или NOT для образования более сложных условий. Ограничения
CHECK также позволяют применять для проверки данных логические выражения. Так, можно
задать ограничение, согласно которому значения в столбце EmployeelD должны начинаться с
прописной буквы, за которой должно стоять три цифры и еще шесть букв. В качестве знака
подстановки в логическом выражении используется подчеркивание (_), заменяющее один символ,
цифру или специальный символ, и символ процента (%), заменяющий любое число символов,
цифр или специальных символов. Например, ограничение CHECK для адреса электронной почты
на уровне таблицы может быть таким:
CONSTRAINT chkEmail
CHECK (Email like '%@%.[a-z][a-z][a-z]' or Email like '%@%.[a-z][a-z].[a-z][a-
z]')
Ограничение CHECK для столбца EmployeelD на уровне столбца выглядит так:
CHECK (EmployeelD like '[A-Z][0-9][0-9][0-9][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]')

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

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 8
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
связываются с конкретной таблицей или столбцом, в их определении не может быть никаких
ссылок на таблицы или столбцы. В качестве поля подстановки используют переменные. Правила,
как и ограничения СНЕСК, позволяют создавать сложные сравнения с помощью операторов AND,
OR или NOT и задавать диапазон значений с помощью логических выражений. В следующих
примерах показаны два предыдущих ограничения СНЕСК, реализованные в виде правил.
CREATE RULE EmailValidator
AS
@value like '%@%.[a-z][a-z][a-z]' or @value like '%@%.[a-z][a-z].[a-z][a-z]'
GO
CREATE RULE EmployeelDValidator
AS
@column like '[A-Z][0-9][0-9][0-9][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]'
Ограничение DEFAULT
Другой механизм реализации бизнес-правил в таблице – ограничение DEFAULT,
позволяющее SQL Server записывать в столбец значение, если оно не было введено пользователем.
Чаще всего ограничения DEFAULТ используют, когда у столбца есть типичное или очень
распространенное значение, но не обязательно единственно возможное. Например, допустим,
компания, для которой ранее были созданы таблицы, — это магазин розничной торговли,
расположенный в Берлине. В адресе большинства клиентов значится город Берлин. Но в магазин
могут заходить и покупатели из близлежащих городов. Добавить ограничение DEFAULT для
столбца со значением город в таблице Info можно следующим образом:
USE Automobiles
CREATE TABLE Info(
PersonID int IDENTITY(1,1),
Adress varchar(100) NOT NULL DEFAULT 'Berlin');

Ограничение UNIQUE
Ограничение UNIQUE запрещает ввод в один или несколько столбцов повторяющихся
значений. Например, это ограничение позволяет реализовать бизнес-правило, согласно которому
имена названия автоклубов не должны повторяться. Ограничение UNIQUE для столбца с
названиями автоклубов в таблице Автоклубы можно добавить с помощью следующего запроса:
USE Automobiles
ALTER TABLE Автоклубы
ADD CONSTRAINT NEW_UNIQUE UNIQUE (Название_Автоклуба)

Ограничение PRIMARY KEY


Первичный ключ (primary key) определяет столбец или комбинацию столбцов, значения
которых уникально идентифицируют каждую строку таблицы. Создать первичный ключ для
столбца ID таблицы TestTable можно так:
CREATE TABLE TestTable(
ID int IDENTITY(1,1) PRIMARY KEY,
Name varchar(60) NOT NULL);

Ограничение FOREIGN KEY


_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 9
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
Ограничение FOREIGN KEY служит для реализации ссылочной целостности (referential
integrity). Внешние ключи (foreign keys) гарантируют, что значения, которые можно ввести в
определенный столбец, существуют в указанной таблице. Пользователи не могут вводить в этот
столбец значения, которых в указанной таблице нет. Например, в столбец НомерДвигателя
таблицы АвтомобилиНаОбслуживании должны вводиться только достоверные значения. Благодаря
готовому списку Номеров двигателей, из которых может выбирать пользователь, и ограничению
диапазона доступных значений данные будут не только непротиворечивыми, но и достоверными.
Чтобы гарантировать ссылочную целостность для столбца НомерДвигателя таблицы
АвтомобилиНаОбслуживании, можно воспользоваться следующим кодом, содержащим ключевое
слово REFERENCES:
USE Automobiles
CREATE TABLE АвтомобилиНаОбслуживании(
НомерКлиента int IDENTITY(1,1) PRIMARY KEY,
НомерДвигателя int NOT NULL REFERENCES Автомобили(Номер_Двигателя),
ОписаниеПоломки varchar(100) NOT NULL,);

Другой способ:
USE Automobiles
CREATE TABLE АвтомобилиНаОбслуживании2(
НомерКлиента int IDENTITY(1,1) PRIMARY KEY,
НомерДвигателя int NOT NULL,
ОписаниеПоломки varchar(100) NOT NULL,
FOREIGN KEY (НомерДвигателя) REFERENCES Автомобили(Номер_Двигателя));

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


столбце, но и формирует цепочку зависимостей. Прежде чем удалять таблицу с внешним ключом,
необходимо выполнить одну из двух операций:
• Удалить таблицу, которая на нее ссылается.
• Удалить ограничение FOREIGN KEY с помощью инструкции ALTER TABLE.
Для успешного функционирования внешнего ключа он должен уникально идентифицировать
каждую строку в таблице, на которую он ссылается. Поэтому необходимо создать первичный
ключ для столбца, который служит для реализации ссылочной целостности.

ОПЕРАТОРЫ ИЗМЕНЕНИЯ КОНТЕКСТА ТАБЛИЦ

Оператор INSERT вставляет строки (или части) в таблицу. Существуют две различные
формы:
• INSERT [INTO] tab_name [(col_list)]
DEFAULT VALUES | VALUES ({ DEFAULT | NULL | expression } [ ,...n] )
• INSERT INTO tab_name | view_name [(col_list)]
{select_statement | execute_statement}
Используя первую форму, вы можете вставить только одну строку (или часть) в tab_name
таблицу. Вторая форма оператора INSERT вставляет набор результатов из оператора SELECT
_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 10
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
или из сохраненной процедуры, которая выполняется, используя оператора EXECUTE.
(Сохраненная процедура должна возвратить данные, которые были ранее вставлены в
таблицу. Оператор SELECT может выбрать значения из различных таблиц или из той же самой
таблицы куда будем вставлять с помощью оператора INSERT, если типы столбцов совместимы).
У обеих форм, вставляемые значения должны иметь тип данных, который совместим с
типом данных соответствующего столбца таблицы. Чтобы гарантировать совместимость, все
символьно-ориентированные значения и временные данные должны быть включены в
апострофы, в то время как все числовые значения не нуждаются в таком включении.
Вставка одной строки
В обеих формах оператора INSERT, явная спецификация списка столбцов является
дополнительной опцией. Это означает, что исключение списка столбцов эквивалентно
определению списка всех столбцов таблицы.
Опция DEFAULT VALUES вставляет для всех столбцов значения по умолчанию. Если
столбец будет иметь тип данных TIMESTAMP или свойство IDENTITY , то система вставляет
сгенерированное значение. Для других типов данных, столбец установлен в ненулевое значение,
если по умолчанию значение существует, или NULL, если нет. Если столбец не будет иметь
пустое значение или DEFAULT значение, то оператор INSERT выдаст ошибку.
Пример

Загрузить данные в таблицу Банковские_Реквизиты:

USE Automobiles;
INSERT INTO [Automobiles].[dbo].[Банковские_Реквизиты]
VALUES
(423630277
,'VictoriaBanc'
,'VISA GOLD')
INSERT INTO [Automobiles].[dbo].[Банковские_Реквизиты]
VALUES
(530825512
,'AgroindBanc'
,'VISA GOLD')
Пример
Загрузить данные в таблицу Владельцы:

USE Automobiles;
INSERT INTO [Automobiles].[dbo].[Владельцы]
VALUES
('2007567044500'
,'Букоа Вася'
,'ул. Киев 22, 45'
,'423630277')
INSERT INTO [Automobiles].[dbo].[Владельцы]
VALUES
('1993576048559'
,'Якин Антон'
,'ул. Бухта 20, 45'
,'530825512')
Пример
_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 11
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
Загрузить данные в таблицу Автомобили:

USE Automobiles;
INSERT INTO [Automobiles].[dbo].[Автомобили]
VALUES
('Mazda'
,'36782901'
,'2500'
,'12.05.2004'
,'1993576048559')
INSERT INTO [Automobiles].[dbo].[Автомобили]
VALUES
('Lexus'
,'76992305'
,'200'
,'12.05.2008'
,'1993576048559')
INSERT INTO [Automobiles].[dbo].[Автомобили]
VALUES
('Lexus'
,'74952609'
,'5059'
,'12.05.2008'
,'2007567044500')

Пример
Загрузить данные в таблицу Продажи:

USE Automobiles;
INSERT INTO [Automobiles].[dbo].[Продажи]
VALUES
('10.19.2000'
,'12'
,15000)
Есть несколько различных способов вставить значения в Следующие три примера

Есть несколько различных способов вставить значения в таблицу. Следующие три примера
показывают эти возможности.
Пример
USE Automobiles;
INSERT INTO [Automobiles].[dbo].[ТО]
VALUES
('1990234084510'
,'12.2.2006'
,NULL)
Ключевое слово NULL вставляет нулевое значение в соответствующий столбец.
Вставка значений в некоторые (но не все) столбцы таблиц обычно требует явной спецификации
соответствующих столбцов. Опущенные столбцы должны иметь или пустое или DEFAULT
значение.
Пример:
USE sample;
INSERT INTO [Automobiles].[dbo].[ТО]

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 12
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
([Номер_Паспорта]
,[Дата_ТО])
VALUES
('1990234084510'
,'12.2.2006')

Предыдущие два примера эквивалентны. Номер_Автомобиля столбец - единственный


опущенный и имеющий пустое значение столбец в таблице ТО, потому что все другие в
операторе CREATE TABLE были объявлены с выражением NOT NULL.
Пример:
USE sample;
INSERT INTO [Automobiles].[dbo].[ТО]
([Номер_Паспорта]
,[Дата_ТО]
,[Номер_Автомобиля])
VALUES
('1990234084510','12.2.2006',12)

Вставка Нескольких Строк


Вторая форма оператора INSERT вставляет одну или более строк, выбранных подзапросом.
Пример:
Получить все данные владельцев, адреса которых начинается на К, и загрузите выбранные
данные в новую таблицу:
CREATE TABLE [dbo].[BlackВладельцы]( [Номер_Паспорта]
[varchar](50) NOT NULL PRIMARY KEY, [ФИО]
[varchar](100) NOT NULL,
[Адрес] [varchar](50) NOT NULL,
[N_Кредит_Карт] [int] NOT NULL,)
INSERT INTO [Automobiles].[dbo].[BlackВладельцы]
SELECT *
FROM [Automobiles].[dbo].[Владельцы]
WHERE [Адрес] LIKE 'ул. К%'

У новой таблицы, составленной в примере, BlackВладельцы, есть те же самые столбцы, что в


таблице Владельцы. Подзапрос в операторе INSERT выделяет все строки со значениями
начинающиеся на 'ул. К' в столбце Адрес. Выбранные строки впоследствии будут вставлены в
новую таблицу.
Контекст таблицы BlackВладельцы можно получить оператором SELECT:
SELECT * FROM [Automobiles].[dbo].[BlackВладельцы]
Результат:

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 13
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________

Следующий пример так же показывает, как несколько строк можно вставить в заранее
созданную таблицу, используя вторую форму оператора INSERT.
Пример
Получить все продажи, где цена авто < 30000 и дата покупки > 01.01.2000:
CREATE TABLE [dbo].[NewПродажи](
[Номер_Заказа] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Дата_покупки] [datetime] NOT NULL,
[Номер_двигателя] [int] NOT NULL,)
INSERT INTO [dbo].[NewПродажи]([Дата_покупки],[Номер_двигателя])
SELECT [Дата_покупки]
,[Номер_двигателя]
FROM [Automobiles].[dbo].[Продажи]
WHERE [Цена_Автомобиля] < 30000
AND [Дата_покупки] > '01.01.2000'

Новая таблица, NewПродажи, содержит следующие строки:

Таблицы NewПродажи и BlackВладельцы были пусты прежде, чем оператор INSERT вставлял
строки. Если таблица уже будет существовать и иметь строки, то новые строки будут добавлены,
без удаления присутствующих.

Конструктор значения таблицы и INSERT


SQL сервер 2008 вводит новую особенность, называется конструктор значения таблицы (или
строки), который позволяет вам назначать несколько кортежей (строк) с оператором языка DML,
такие как INSERT или UPDATE. Пример ниже показывает, как вы можете назначить несколько
строк, используя такой конструктор с оператором INSERT.
Пример:
USE Automobiles;
INSERT INTO [Automobiles].[dbo].[ТО]

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 14
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
VALUES
(2006305817231,2006-03-06,40184981),
(2000153500231,2006-12-05,05823752),
(1990234084510,2004-03-08,33340326)
Оператор INSERT в примере вставляет три строки в таблицу ТО, используя конструктор
значения таблицы. Вы можете увидеть из примера, синтаксис конструктора довольно прост.
Чтобы использовать конструктор значения таблицы, перечислите значения каждой строки в
скобках и отделить каждый список от других запятой.

Оператор UPDATE
Оператор UPDATE изменяет значения строк таблицы. У этого оператора есть общая форма:
UPDATE tab_name
{ SET column_1 = {expression | DEFAULT | NULL} [,...n] [FROM
tab_name1 [,...n]]
[WHERE condition]
Строки в таблице tab_name изменены в соответствии с выражением WHERE. Для каждой
строки, которая будет изменена, оператор UPDATE использует выражение SET, назначая
константу (или выражение) к определенному столбцу. Если выражение WHERE опущено,
оператор UPDATE изменяет все строки таблицы. (Выражение FROM будет обсуждаться позже в
этом разделе).
Оператор UPDATE может только изменить данные одной таблицы.

Пример:
Установите тип кредитной карты - 'VISA' владельцу с номером кред. карты '593010582':
UPDATE
[Automobiles].[dbo].[Банковские_Реквизиты] SET
[Тип_Кредит_Карт] = 'VISA'
WHERE [N_Кредит_Карт] =
'593010582'
Пример:
Изменить цены всех авто в английских фунтах. Текущий валютный курс составляет 0.51 Ј за 1 $.
UPDATE
[Automobiles].[dbo].[Продажи]
SET [Цена_Автомобиля] = [Цена_Автомобиля] * 0.51
В данном примере все строки таблицы Продажи будут изменены из-за опущенного выражения
WHERE. Измененные строки таблицы Продажи могут быть отображены следующим
оператором Transact-SQL:
SELECT * FROM [Automobiles].[dbo].[Продажи]
Результат:

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 15
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________

Пример:
Поставить значение '11.12.2006' на дату тех осмотра для владельца с именем 'Абдула Алла':
USE Automobiles;
UPDATE [Automobiles].[dbo].ТО
SET [Дата_ТО] = '11.12.2006'
WHERE Номер_Паспорта IN (
SELECT Номер_Паспорта
FROM [Владельцы]
WHERE [ФИО] = 'Абдула Алла')
Данный пример использует в операторе UPDATE подзапрос с выражением WHERE.
Из-за использования оператора IN больше чем одна строка может быть получена из этого запроса.
Этот пример идентичен предыдущему, но выполнен другим способом

Пример:
UPDATE [Automobiles].[dbo].ТО
SET [Дата_ТО] = '11.12.2006'
FROM ТО, Владельцы
WHERE Номер_Паспорта = 'Абдула Алла'
AND ТО.Номер_Паспорта = Владельцы. Номер_Паспорта

Следующий пример иллюстрирует использование CASE выражения в операторе UPDATE.

Пример:
Цена каждого авто должна быть увеличена на проценты (20, 10, или 5) в зависимости от
предыдущей цены. Т.е. авто с более низкой ценой будет увеличена на несколько процентов
выше. USE sample;
UPDATE [Automobiles].[dbo].[Продажи]
SET [Цена_Автомобиля] = CASE
WHEN [Цена_Автомобиля] > 0 and [Цена_Автомобиля] < 10000 THEN
[Цена_Автомобиля]*1.2
WHEN [Цена_Автомобиля] >=10000 and [Цена_Автомобиля] < 30000
THEN
[Цена_Автомобиля]*1.1
ELSE [Цена_Автомобиля]*1.05
END

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 16
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
Оператор DELETE
Оператор DELETE удаляет строки из таблицы. У этого оператора есть две различные формы:
• DELETE FROM table_name
[WHERE predicate];
• DELETE table_name
FROM table_name [,…] [WHERE
condition];
Будут удалены все строки, которые удовлетворяют условию в выражении WHERE. Явное
обозначение столбцов в пределах оператора DELETE не необходимо, потому что оператор
DELETE воздействует на строки, а не на столбцы.
Пример:
Удалить все карты VISA в таблице Банковские_Реквизиты:
DELETE FROM [Automobiles].[dbo].[Банковские_Реквизиты]
WHERE [Тип_Кредит_Карт] = 'VISA'
Выражение WHERE в операторе DELETE может содержать внутренний запрос.

Пример:
Удалить все строки в таблице ТО относительно владельца 'Абдула Алла':
DELETE FROM
[Automobiles].[dbo].[ТО] WHERE
[Номер_Паспорта] IN (SELECT
[Номер_Паспорта]
FROM [Владельцы]
WHERE [ФИО] = 'Абдула Алла')

Пример:
USE Automobiles;
DELETE
[Automobiles].[dbo].[ТО] FROM
[ТО], [Владельцы]
WHERE [ФИО] = 'Абдула Алла'
AND [ТО].[Номер_Паспорта] = [Владельцы].[Номер_Паспорта]
Использование выражения WHERE в операторе DELETE является дополнительной опцией. Если
выражение WHERE будет опущено, то все строки таблицы будут удалены, как показано в
следующем примере.
Пример:
USE Automobiles;
DELETE [Automobiles].[dbo].[ТО]

Есть существенное различие между DELETE и операторам DROP TABLE. Оператор DELETE
удаляет (частично или полностью) контекст таблицы, тогда как оператор DROP TABLE удаляет
_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 17
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
и контекст, и схему таблицы. Таким образом, после оператора DELETE, таблица все еще
существует в базе данных (хотя возможно с пустыми строками), но после оператора DROP
TABLE, таблица больше не существует.

Выражение OUTPUT
Результат выполнения INSERT, UPDATE, или DELETE всегда содержит только текст
относительно числа измененных строк (например “3 удаленных строк”). Если контекст
такого результата не соответствует вашим потребностям, вы можете использовать выражение
OUTPUT, которое отображает явно строки, которые вставлены или обновлены в таблице
илиудалены из нее. Выражение OUTPUT использует вставленные и удаленные таблицы, чтобы
отобразить соответствующий результат. Кроме того, выражение OUTPUT должно
использоваться с выражением INTO, чтобы заполнить таблицу. Поэтому используйте
переменную таблицу, чтобы сохранить результат.
Пример показывает, как оператор OUTPUT работает с оператором DELETE.
Пример:
USE sample;
DECLARE @del_table TABLE (Номер_Заказа INT, Дата_Покупки datetime);
DELETE [Продажи]
OUTPUT DELETED. Номер_Заказа, DELETED. Дата_Покупки INTO @del_table
WHERE Дата_Покупки > ‘02.01.2004’;
SELECT * FROM @del_table

Во-первых, данный пример объявляет переменную таблицу @del_table с двумя столбцами:


Номер_Заказа и Дата_Покупки. Эта таблица будет использоваться, чтобы сохранить удаленные
строки. Синтаксис оператора DELETE расширяется с опцией OUTPUT:
OUTPUT DELETED. Номер_Заказа, DELETED. Дата_Покупки INTO @del_table
Используя эту опцию, система сохраняет удаленные строки в удаленной таблице, которая
скопирована в переменную таблицу @del_table.
Следующий пример показывает использование опции OUTPUT в операторе UPDATE.

Пример:
USE sample;
DECLARE @update_table TABLE([N_Кредит_Карт] INT, [Тип_Кредит_Карт] varchar(50));

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 18
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
UPDATE [Automobiles].[dbo].[Банковские_Реквизиты]
SET [Тип_Кредит_Карт] = 'VISA'
OUTPUT INSERTED. [N_Кредит_Карт], INSERTED. [Тип_Кредит_Карт] INTO @update_table
WHERE [N_Кредит_Карт] = '593010582'
SELECT * FROM @update_table
Результат:

Контрольные вопросы:
1. Что означает ключевое слово DEFAULT в коде создания отношения?

2. Что означает ключевое слово IDENTITY в коде создания отношения?

3. Для чего служат вычисляемые столбцы?

4. Чем отличаются ограничения отношения от ограничений атрибута?

5. Для чего используются правила в ограничениях БД?

6. Когда стоит использовать ограничения FOREIGN KEY, а когда CHECK и почему?


7. Какие операторы для актуализации таблиц вы знаете? Опишите их.

Задания к лабораторной работе:


Задание 1. Создание, изменение и удаление отношения с помощью DDL
1. Создайте БД при помощи CREATE TABLE. Используйте ограничения PRIMARY KEY,
FOREIGN KEY, UNIQUE, CHECK, DEFAULT.
2. Добавьте с помощью ALTER TABLE в одно отношение атрибут, значение которого будет
вычисляться автоматически при занесении кортежей в отношение (COMPUTED
COLUMNS). Добавьте ещё один атрибут, задав ему параметр NOT NULL. Подумайте,
какой ещё параметр надо установить для корректного добавления атрибута.
3. Сформируйте запрос для удаления одного отношения из пункта 2.2 при помощи T-SQL
(DROP TABLE).

Задание 2. Ознакомление с операторами актуализации отношений


.
1. Используя оператор INSERT INTO VALUES, ввести по 15-20 кортежей во все
отношения Вашей БД.
2. Записать запрос для добавления кортежей в два новых отношения, используя
оператор
_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 19
Создание и актуализация отношений в Transact-SQL
_____________________________________________________________________________________
SELECT … INTO. Используйте далее эти отношения для выполнения пунктов 2.3 - 2.5.
3. Записать два запроса для операторa INSERT с подзапросом:
INSERT TOP … SELECT, INSERT … SELECT TOP.
4. Записать два запроса для изменения кортежей (с помощью операторов UPDATE
TOP, UPDATE с подзапросом).
5. Записать два запроса для удаления кортежей с помощью операторов DELETE
TOP, DELETE с подзапросом.
6. Напишите три запроса для оператора OUTPUT (совместно с INSERT,
DELETE, UPDATE).

Дополнительная информация:
1. Vitalie Cotelea, Marian Cotelea. Microsoft SQL Server 2019: Pas cu pas. – Universitatea
Tehnică a Moldovei, Departamentul “Ingineria Software si Automatică”. - Chişinău: S.n.,
2020 (Tipografia “Foxtrot”). -474 p.
2. Petkovic Dusan. Microsoft SQL Server 2008: A Beginner’s Guide. – USA: McGraw-Hill
Osborne Media. 2008.
3. Нильсен Пол. Microsoft SQL Server 2005. Библия пользователя. – М.: ООО «И. Д.
Вильямс», 2008.
4. Добавление кортежей с помощью операторов INSERT и SELECT.
http://technet.microsoft.com/ru-ru/library/ms188263(v=sql.105).aspx
5. Добавление кортежей с помощью операторов SELECT
INTO. http://technet.microsoft.com/ru-
ru/library/ms190750(v=sql.105).aspx
6. Выражения с OUTPUT. http://technet.microsoft.com/ru-ru/library/ms177564(v=sql.105).aspx
7. Справочник по Transact-SQL. http://msdn.microsoft.com/ru-
ru/library/ms189826(v=SQL.90).aspx

_____________________________________________________________________________________
Базы данных. Лабораторные работы UTM, FCIM, DISA, Dorian Saranciuc Pag. 20

Вам также может понравиться