- •«Базы данных»
- •(Для студентов очной и заочной формы обучения)
- •1. Организационно-методическая часть (Программа дисциплины)
- •1.1. Цели и задачи дисциплины
- •1.2. Требования к уровню освоения содержания дисциплины
- •1.3. Объем дисциплины и виды учебной работы (в часах)
- •1.4. Содержание дисциплины
- •1.4.1. Разделы дисциплин и виды занятий
- •1.4.2. Содержание разделов дисциплины
- •Тема 1. Введение.
- •Тема 2. Основные понятия. Модели данных.
- •Тема 3. Язык sql. Формирование запросов к бд.
- •Тема 4. Основы проектирования баз данных.
- •1.5. Перечень практических занятий
- •1.6. График выполнения самостоятельных работ студентами
- •1.7. Рекомендуемая литература
- •2. Конспект лекций (семестр 5)
- •2.1. Введение в базы данных
- •2.2. Классификация моделей данных
- •2.3. Язык sql
- •2.4. Проектирование баз данных
- •2.5.Физические модели баз данных
- •2.6. Распределённая обработка данных
- •2.7. Обеспечение безопасности в бд
- •2.8. Современные направления исследований и разработок
- •3. Конспект лекций (семестр 6)
- •3.1. Представления
- •3.2. Компоненты языка Transact-sql
- •3.3. Курсоры
- •3.4. Хранимые процедуры
- •3.5. Триггеры
- •4. Задания для проведения семинарских занятий
- •Create table Salespeople - - продавцы
- •Create table Customers - - покупатели
- •Create table Orders - - заказы
- •2. Ввод данных
- •3. Компиляция table Offices без ограничения внешнего ключа
- •4. Ввод данных
- •5. Компиляция table Salesreps без ограничения внешнего ключа
- •11. Компиляция table Orders
- •12. Ввод данных
- •5. Контрольные и самостоятельные работы
- •I. Создать и описать 3 таблицы базы данных «Студенты»
- •II. Внести данные в каждую из таблиц, например:
- •III. Выполнить запросы:
- •Задание на «Курсоры»
- •Задание на «Хранимые процедуры»
- •Задание на «Триггеры»
- •6. Вопросы к экзамену (семестр 5)
- •Классификация моделей данных.
- •Распределённая обработка данных.
- •Практическое задание к билету № 1
- •7. Вопросы к зачёту(семестр 6)
- •8. Форма итогового контроля
I. Создать и описать 3 таблицы базы данных «Студенты»
Первая таблица Students - Студенты
поля:
stcode – int, PK – Код студента
stsurname – char (15) – Фамилия студента
stname – char (10) – Имя студента
stnumgroup – char (10) – Номер группы студента
Вторая таблица Subjects (предметы) - Предметы
поля:
sbcode – int, PK – Код предмета
subname char (50) – Название предмета
Третья таблица Marks - Оценки
поля:
mnumber – int, PK – Номер оценки
stcode – int, FK – Код студента
sbcode – int, FK – Код предмета
mark – int – Оценка
II. Внести данные в каждую из таблиц, например:
Insert into Students value (111, ‘Sergunin, ‘Sergey, ‘ПС031’); 10 записей
Insert into Subjects value (2534, ‘DataBase’); 07 записей
Insert into Marks value (1, 111, 2534, 4); 10 - 12 записей
III. Выполнить запросы:
1 билет
Вывести на экран номер группы, фамилию студента, а также название предмета и оценку по нему. Упорядочить по возрастанию номера группы.
Вывести на экран список предметов и среднюю оценку по каждому предмету.
Вывести на экран список тех студентов, у которых есть «2», и подсчитать количество «2» у каждого студента.
Вывести на экран список предметов и среднюю оценку по каждому предмету.
Вывести на экран список студентов, которые получили по две «5».
Вывести на экран список номеров групп, предметов и миниальную оценку по каждому предмету.
2 билет
Вывести на экран номер группы, фамилию студента, а также название предмета и оценку по нему. Упорядочить названию предмета.
Вывести на экран список предметов и максимальную оценку по каждому предмету.
Вывести на экран список тех студентов, у которых есть «5», и подсчитать количество «5» у каждого студента.
Вывести на экран список студентов, которые получили по две «2».
Для студентов, получивших «4» или «5», вывести на экран номер группы, фамилию студента, а также название предмета и оценку по нему. Упорядочить по номеру группы и оценке.
Вывести на экран список номеров групп, предметов и среднюю оценку по каждому предмету.
3 билет
Вывести на экран номер группы, фамилию студента, а также название предмета и оценку по нему. Упорядочить по номеру группы и названию предмета.
Вывести на экран список предметов и минимальную оценку по каждому предмету.
Вывести на экран список тех студентов, у которых есть «4», и подсчитать количество «4» у каждого студента.
Вывести на экран список студентов, которые получили по три «2».
Для студентов, получивших «5», вывести на экран номер группы, фамилию студента, а также название предмета и оценку по нему. Упорядочить по возрастанию номера группы.
Вывести на экран список номеров групп, предметов и среднюю оценку по каждому предмету.
4 билет
Вывести на экран номер группы, фамилию студента, а также название предмета и оценку по нему. Упорядочить по номеру группы и названию предмета.
Вывести на экран список предметов и среднюю оценку по каждому предмету.
Вывести на экран список тех студентов, у которых есть «2», и подсчитать количество «2» у каждого студента.
Вывести на экран список студентов, которые получили по две «5».
Для студентов, получивших «2» или «5», вывести на экран N группы, фамилию студента, а также название предмета и оценку по нему. Упорядочить по N группы и оценке.
Вывести на экран список номеров групп, предметов и среднюю оценку по каждому предмету.
В. Контрольная работа на курсоры
Используется Схема_1.
С использованием курсора найти и распечатать на экран:
Первую запись в таблице Customers.
Четвертую запись в таблице Customers, используя абсолютную адресацию.
Пятую запись в таблице Customers, используя относительную адресацию.
С помощью быстродействующего курсора выбрать первые 5 строк таблицы Salespeople в переменные и распечатать их на экран.
Заменить комиссионные Peel-а на 0.2 . Результат распечатать на экран.
Заменить комиссионные Axelrod-а на 0.15 . Результат распечатать на экран.
Создать вспомогательную таблицу temp_orders. Используя курсор, заполнить таблицу temp_orders следующими записями: номер каждого заказа вместе с именем покупателя, сделавшего этот заказ.
Г. Контрольная работа на хранимые процедуры
Теоретические вопросы
Что такое хранимая процедура?
Как отличить системную хранимую процедуру от пользовательской?
Приведите примеры системных хранимых процедур.
Что такое простая хранимая процедура? Как она создается?
Что такое хранимая процедура с входными параметрами? Как она создается?
Что такое хранимая процедура с выходными параметрами? Как она создается?
Практические задания
Используется Схема_1.
Создайте хранимую процедуру, которая выводит на экран список покупателей (номер, имя, место проживания, rating).
Создайте хранимую процедуру, которая выводит на экран список продавцов, комиссионные которых превышают 15%.
Создайте хранимую процедуру, которая выводит на экран стоимости заказов, сделанных 2000-10-03
Д. Контрольная работа на триггеры
Теоретические вопросы
Что такое триггер, и для чего его можно использовать?
Где хранится триггер?
Какие типы триггеров поддерживает SQL Server?
Имеет ли триггер входные и выходные параметры (аргументы)?
Когда выполняется триггер, и что его запускает?
Практические задания
Используется Схема_1.
Создайте триггер, который после изменения данных в таблице Покупатели, распечатывает эту таблицу на экран.
У конкретного покупателя меняется продавец, и покупателю нужно сообщить об этом. Для этого:
В таблицу Покупатели добавьте столбец Tempr.
Создайте два триггера:
Который после изменения у данного покупателя продавца в таблице Покупатели, в этот новый столбец Tempr заносит текст «У вас изменился продавец».
Который распечатывает на экран информацию об этом покупателе и его новом продавце.
Дополнительное задание. Создать еще один столбец в таблице Продавцы, который будет содержать дату этого изменения.
Е. Самостоятельное задание
Будем работать с базой данных PUBS, которая описывает предметную область, связанную с книгами.
1. Рассмотрим пример объявления статического курсора, поддерживающего выборку данных в произвольной последовательности и содержащего список имен и фамилий авторов, а также названий написанных ими книг:
Declare @ln varchar(I5),
@fn varchar(15),
@tit varchar(30)
Declare titleauth_curs Insensitive scroll cursor for
select au_lname, au_fname, title
from authors a, titleauthor ta, titles t
where ta.au_id=a.au_id And t.title_id=ta.title_id;
Open titleauth_curs
print @@cursor_rows —определяем количество строк
Fetch first from titleauth_curs
into @ln, @fn, @tit
while @@fetch_status=0 —значение 0 означает окончание просмотра данных
begin
print 'Имя ' + @ln + ' Фамилия ' + @fn + ' Название ‘ + @tit
Fetch next from titleauth_curs
into @ln, @fn, @tit
end
INSENSITIVE. При использовании этого ключевого слова будет создан статический курсор. Полный результирующий набор курсора копируется в базу данных tempdb. Изменения данных не разрешаются, кроме того, не отображаются изменения, сделанные другими пользователями. Если ключевое слово INSENSITIVE не указывается, по умолчанию создается динамический курсор.
2. Рассмотрим открытие локального курсора title_curs. Команды объявления и открытия локального курсора должны выполняться в одном пакете, то есть нельзя разделять команды DECLARE CURSOR и OPEN командой GO или просто выполнять их по отдельности.
Сразу же продемонстрируем использование глобальной переменной @@cursor_rows Declare title_curs cursor local static scroll for
select type, summa = SUM (price*ytd_sales),
[sales]= SUM (ytd_sales)
from titles
group by all type
Open title_curs
print @@cursor_rows
При выполнении этого набора команд сервер выдаст следующие сообщения:
Warning: Null value eliminated by aggregate or other set operation.
6 - курсор содержит 6 строк.
3. Задание: выведите на экран содержимое курсора из задания 2. Перед тем, как выполнять это задание,- посмотрите типы данных в таблице titles, хотя бы с помощью команды select * from titles. Оператор print требует, чтобы всё печатаемые данные были типа varchar или char, поэтому необходимы функции преобразования, например:
CAST (@fmoney As varchar(12))
CAST (@intSum As varchar(l0))
4. Проведём эксперимент. Создадим ключевой, динамический, последовательный и статический курсоры и посмотрим, как они будут вести себя при удалении исходной строки. Для этого сначала скопируем содержимое таблицы publishers (из БД PUBS) в таблицу publ, с которой и будем проводить эксперимент, чтобы не повредить БД.
Итак, создадим таблицу publ:
SELECT * INTO publ FROM publishers
Новая таблица не обременена связями с другими таблицами, поэтому строки из нее можно безболезненно удалять.
Для определения ключевого курсора, основанного на таблице publ, необходимо провести дополнительные действия. Хотя таблица publ и содержит столбец pub_id, значения в котором уникальны, сервер не будет использовать его автоматически. Поэтому создадим в таблице publ уникальный индекс IX_unique_publ, построенный на столбце pub_id: CREATE UNIQUE INDEX IX_unique_publ ON publ (pub_id)
Посмотрите, какие данные содержит таблица publ: select * from publ
Итак, у нас будет 4 курсора разных типов. Мы выберем с помощью каждого из курсоров
первую строку, выполнив команду FETCH FIRST (кроме последовательного, который
допускает только команду FETCH NEXT). Затем удалим строку таблицы publ, имеющую
в столбе pub_id значение 0877. После этого попытаемся считать из каждого курсора следующую строку с помощью команды FETCH NEXT:
BEGIN TRAN
DECLARE stat_curs CURSOR STATIC FOR SELECT * FROM publ
DECLARE keys_curs CURSOR KEYSET FOR SELECT * FROM publ
DECLARE dyna_curs CURSOR DYNAMIC FOR SELECT * FROM publ
DECLARE ffor_curs CURSOR FAST_FORWARD FOR SELECT * FROM publ
OPEN stat_curs
OPEN keys_curs
OPEN dyna_curs
OPEN ffor_curs
FETCH FIRST FROM stat_curs
FETCH FIRST FROM keys_curs
FETCH FIRST FROM dyna_curs
FETCH NEXT FROM ffor_curs
PRINT 'Удаление строки из таблицы publ'
DELETE FROM publ WHERE pub_id='0877'
FETCH NEXT FROM stat_curs
FETCH NEXT FROM keys_curs
FETCH NEXT FROM dyna_curs
FETCH NEXT FROM ffor_curs
SELECT * FROM publ
ROLLBACK TRAN
SELECT * FROM publ
Если курсор уже создан, необходимо закрыть и освободить курсор, например:
Close stat_curs
Deallocate stat_curs
5. Изменение исходных данных.
Курсоры позволяют не только выбирать данные, но и изменять строки исходных таблиц. Идея использования курсора для изменения исходных данных состоит в том, что изменяется строка таблицы, соответствующая текущей строке курсора.
Упрощенно синтаксис команды UPDATE, предназначенной для обновления таблиц посредством курсора, можно записать следующим образом:
UPDATE table_name SET {column_name = {DEFAULT | NULL | expression}} [,...n] WHERE CURRENT OF cursor_name
В качестве примера рассмотрим изменение значений в таблице publ, созданной в одном из предыдущих примеров. При этом будем использовать ключевой курсор. Для начала выведем все содержимое таблицы publ, создадим и откроем курсор, выберем из него две строки и выполним команду UPDATE. После этого вновь посмотрим содержимое таблицы publ с помощью запроса SELECT, а также выведем содержимое текущей строки курсора:
BEGIN TRAN
SELECT * FROM publ
DECLARE keys_curs CURSOR KEYSET FOR
SELECT * FROM publ FOR UPDATE OF city
OPEN keys_curs
FETCH FIRST FROM keys_curs
FETCH NEXT FROM keys_curs
UPDATE publ SET city = city + '#' WHERE CURRENT OF keys_curs
--изменили только вторую строку
SELECT * FROM publ
FETCH RELATIVE 0 FROM keys_curs
ROLLBACK TRAN
Работа приведенного примера сводится к изменению второй строки таблицы publ. Точнее, будет изменено значение в столбце city, к которому в конец добавляется символ #.
6. Задание: выведите на экран содержимое курсора из задания 5, чтобы ко всем строкам таблицы был добавлен символ #.
Ж. Итоговая контрольная работа
Используется БД PUBS. Имена курсоров, хранимых процедур, триггеров необходимо дополнить «своими» суффиксами, чтобы не было «вторжения» в работу других пользователей.
Подготовительное задание,- чтобы Вы разобрались с БД, которую будете применять.
Создать (нарисовать) схему БД PUBS, используя средства SQL Server для создания диаграмм. Для этого войдите SQL Server Enterprise Manager, выберите БД PUBS, далее правой кнопкой нажмите на Diagrams, выберите New Database Diagram и следуйте указаниям, которые появляются на экране.
Чтобы перейти в SQL Query Analyzer, войдите в меню Tools и далее Query Analyzer.
