- •Кафедра экономической информатики
- •Базы данных
- •Содержание
- •Введение
- •Лабораторная работа №1. Логические и физические модели данных
- •Методические указания
- •Задание к работе
- •Раздел I. Создание сущностей в eRwin
- •Раздел II. Создание связей между сущностями, подмножеств модели и хранимых отображений. Переход к физической модели данных
- •Раздел III. Выполнение операции прямого проектирования
- •Раздел IV. Выполнение операции обратного проектирования
- •Лабораторная работа №2. Усложненные диаграммы «сущность-связь»
- •Методические указания
- •Задание к работе
- •Раздел I. Создание сущностей логической модели
- •Раздел II. Создание связей между сущностями и иерархии наследования
- •Раздел III. Выполнение вариантов трансформы категориальной связи
- •Раздел IV. Выполнение методов синхронизации системного каталога базы данных и текущей модели
- •Лабораторная работа №3. Работа в среде субд «ms sql Server 2005»
- •Методические указания
- •Задание к работе
- •Раздел I. Создание базы данных и ее объектов
- •Раздел II. Управление пользователями и правами доступа к данным
- •Лабораторная работа №4. Создание базы данных и ее объектов с помощью команд языка Transact-sql
- •Методические указания и задания к выполнению
- •Раздел I. Создание базы данных и ее объектов
- •Раздел II. Ввод данных в таблицы базы данных
- •Insert into Заказ (КодКлиента, КодТовара, Количество)
- •Inner join Поставщик
- •Inner join Товар
- •Раздел III. Управление пользователями и правами доступа к данным.
- •Раздел IV. Анализ полученных результатов
- •Лабораторная работа №5. Манипулирование данными с помощью команд языка Transact-sql
- •Методические указания
- •Раздел I. Выборка данных из таблиц и представлений.
- •Раздел II. Обновление данных в таблицах и представлениях.
- •Раздел III. Удаление данных из таблиц и представлений.
- •Раздел IV. Изменение структуры таблицы.
- •Раздел V. Удаление таблицы из базы данных.
- •Задание к работе
- •Лабораторная работа №6. Программирование на языке Transact-sql
- •Методические указания
- •Раздел I. Основы программирования на языке Transact-sql.
- •Раздел II. Создание и работа с хранимыми (на сервере) процедурами.
- •If @Страна is not null
- •If @Город is not null
- •If @Город is not null
- •Insert into Валюта
- •Values(@Код, @Имя, @Шаг, @Курс)
- •If @Страна is not null
- •If @Город is not null
- •Into ##Регион
- •Раздел III. Создание и работа с определяемыми пользователем функциями.
- •Insert @rowset (КодРегиона, Страна, Область, Город)
- •Задание к работе
- •Лабораторная работа №7. Курсоры и триггеры в языке Transact-sql
- •Методические указания
- •Раздел I. Использование курсоров в языке Transact-sql
- •If @НачалоИнтервала is null
- •If @КонецИнтервала is null
- •Раздел II. Создание триггеров в языке Transact-sql.
- •If update(ДатаЗаказа)
- •If update(Цена)
- •If update(Цена)
- •Inserted.Цена * Валюта.КурсВалюты
- •Задание к работе
- •Литература Основная
- •Базы данных
- •220013, Минск, п. Бровки, 6.
Лабораторная работа №6. Программирование на языке Transact-sql
Цель работы
Ознакомиться с основами программирования на языке Transact-SQL.
Освоить способы создания и использования хранимых процедур.
Изучить способы создания и использования определяемых пользователем функций.
Задачи
Написание кода, использующего переменные языка Transact-SQL и временные таблицы.
Создание хранимых процедур.
Создание пользовательских функций трех типов (Scalar, Inline Table-valued, Multi-statement Table-valued).
Написание проверочного кода для тестирования правильности работы созданных хранимых процедур и функций.
Методические указания
При помощи пользовательского меню Windows запустите утилиту SQL Server Management Studio, после чего на панели Object Explorer в древовидной структуре раскройте папку Databases.
С помощью команды меню File►Open►File загрузите сценарий из файла D:\Work\X7230ХХХ\script.sql в окно Query.
Выполните сценарий, нажав на панели инструментов кнопку Execute (или клавишу F5). В результате будет создана база данных Склад_ХХХ.
Обновите данные на панели Object Explorer. Для этого используйте команду Refresh в контекстном меню папку Databases или соответствующую кнопку в верхней части панели. В результате база данных Склад_ХХХ станет видимой на панели Object Explorer.
Закройте окно Query, содержащее сценарий script.sql. Затем на панели инструментов нажмите кнопку New Query, и откройте новое пустое окно Query, предназначенное для формирования нового сценария. Готовые к исполнению команды (пакеты) языка Transact-SQL, из которых будет формироваться сценарий, выделены ниже при помощи стрелок и .
Сделайте активной созданную базу данных Склад_ХХХ:
USE Склад_ХХХ
GO
Раздел I. Основы программирования на языке Transact-sql.
Если возникает потребность работать с переменными, то предварительно нужно эти переменные создать, используя команду объявления переменных, которая имеет следующий синтаксис (см. [1], стр. 1059):
DECLARE { @local_variable data_type } [ ,...n]
DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY
-- Для присвоения значения переменным можно использовать
-- команды SET и SELECT:
SET @Код = 10
SET @Имя = 'MS SQL Server'
SET @Цена = 299.99
-- Команда SELECT отличается от команды SET тем, что позволяет
-- присвоить значения сразу нескольким переменным:
SELECT @Код = 10, @Имя = 'MS SQL Server', @Цена = 299.99
-- Для вывода (на экран монитора) значений переменных также
-- используется команда SELECT:
SELECT @Код, @Имя, @Цена
-- При выводе значений переменных можно снабдить их содержательными
-- именами. При этом идентификаторы, содержащие недопустимые символы,
-- такие как ' ' (пробел), '%', '*' и др., должны быть заключены в
-- квадратные скобки:
SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS
[Цена товара]
-- Связку AS можно, при желании, опускать:
SELECT @Код [Код товара], @Имя Наименование, @Цена [Цена товара]
GO
Примечание. Рассмотренные выше переменные являются локальными, т.е. существуют внутри текущего пакета команд (заканчивающегося командой GO) и уничтожаются при выходе из него, поэтому все их нужно выполнять совместно в рамках единого пакета. В отличие от них, глобальные переменные существуют в контексте всего соединения и записываются не с одним, а с двумя лидирующими символами @.
Переменным можно присваивать значения полей из таблиц базы данных. Например:
DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY
SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена
FROM Товар
WHERE КодВалюты IN ('USD', 'EUR')
SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS
[Цена товара]
GO
Здесь переменные @Код, @Имя, @Цена получили значения соответствующих полей последней строки набора данных, выбираемого командой SELECT (сам набор данных на экран не выводится). Поэтому, если, например, необходимо сохранить в переменных сначала сведения о товаре с наибольшей, а затем – с наименьшей ценой применительно к кодам валют USD и EUR, то необходимо выполнить следующую последовательность команд:
DECLARE @Код INT, @Имя VARCHAR(50), @Цена MONEY
-- Выборка данных из таблицы Товар с сортировкой строк
-- по столбцу Цена в порядке возрастания
SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена
FROM Товар
WHERE КодВалюты IN ('USD', 'EUR')
ORDER BY Цена
-- Вывод данных о товаре с наибольшей ценой
SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS
[MAX цена товара]
-- Выборка данных из таблицы Товар с сортировкой строк по столбцу Цена
-- в порядке убывания
SELECT @Код = КодТовара, @Имя = Наименование, @Цена = Цена
FROM Товар
WHERE КодВалюты IN ('USD', 'EUR')
ORDER BY Цена DESC -- DESC указывает на убывающий порядок сортировки
-- Вывод данных о товаре с наименьшей ценой
SELECT @Код AS [Код товара], @Имя AS Наименование, @Цена AS
[MIN цена товара]
GO
Можно определить также среднюю цену товаров:
DECLARE @Цена MONEY
SELECT @Цена = AVG(Цена)
FROM Товар
WHERE КодВалюты IN ('USD', 'EUR')
-- Вывод средней цены товаров
SELECT @Цена AS [AVG цена товаров]
GO
Пример. Пусть необходимо определить наименование товара, по которому был наибольший спрос за последние N дней. Один из вариантов решения этой задачи заключается в выполнении следующей последовательности шагов.
1). Объявляем переменные, требуемые для решения данной задачи:
DECLARE @Name VARCHAR(50), @Code INT, @Quantity NUMERIC(12,3),
@N INT
2). Задаем значение интервала в днях:
SET @N = 60
3). Выполняем выборку данных с группировкой по кодам товаров и подсчетом для каждой группы суммарного количества заказанного товара (т.е. величины спроса). При этом результирующий набор данных будем сортировать в порядке возрастания величины спроса и, следовательно, последняя его строка будет задавать товар с наибольшим спросом. Результат выполнения этой команды на экран не выдается, а вместо этого данные последней строки сохраняются в переменных @Code и @Quantity:
SELECT @Code = КодТовара, @Quantity = SUM(Количество)
FROM Заказ
WHERE ДатаЗаказа BETWEEN GetDate() - @N AND GetDate()
GROUP BY КодТовара
ORDER BY SUM(Количество)
4). По найденному в предыдущем пункте коду товара с наибольшим спросом находим соответствующее ему наименование товара:
SELECT @Name = Наименование
FROM Товар
WHERE КодТовара = @Code
5). Выдаем найденный результат на экран:
SELECT @Name AS [Наименование товара], @Quantity AS
[Итоговое кол-во], @N AS [Временной интервал]
GO
Примечание. Все команды, рассмотренные на этих пяти шагах, выполняются в рамках одного пакета (поясняющий текст нужно удалить или закомментировать).
Программный код на языке Transact-SQL может включать в себя также битовые и логические операторы, операторы перехода (GOTO) и приостанова (WAITFOR), команды организации ветвлений (IF, CASE) и циклов (WHILE), операторные скобки (BEGIN…END) и др. (см. [1], стр. 1057 – 1087).
Временные таблицы. Они создаются в системной базе данных tempdb и бывают двух типов: локальные и глобальные. Локальные временные таблицы видны только из того соединения, в котором были созданы, и автоматически уничтожаются при закрытии этого соединения. Глобальные временные таблицы также уничтожаются при закрытии соединения, в котором были созданы, однако, когда они существуют, то видны и из любых других соединений. Это предоставляет удобный механизм для обмена данными между различными приложениями, например, между различными копиями хранимых процедур (одна и та же хранимая процедура, запускаемая различными пользователями, может обращаться к глобальной временной таблице для получения информации).
Имена локальных временных таблиц начинаются символом «#», а глобальных – двумя такими символами.
Примеры создания и использования локальных временных таблиц:
CREATE TABLE #Goods (
КодТовара INT PRIMARY KEY,
Наименование VARCHAR(50) NOT NULL,
ЕдиницаИзм CHAR(10) NULL
)
INSERT #Goods
SELECT КодТовара, Наименование, ЕдиницаИзм
FROM Товар
SELECT * FROM #Goods
GO
SELECT Наименование, Цена, КодВалюты
INTO #Goods_2
FROM Товар
SELECT * FROM #Goods_2
GO