Практическое занятие № 6
Тема: Работа с представлениями в разных СУБД
Цель работы: получить практические навыки по созданию и использованию представлений
Ход работы
Пусть имеется БД "dbase" в формате SQL Server. Данная БД состоит из 6 таблиц со следующей структурой:

Таблицы связаны так:
| Главная таблица | Подчиненная таблица | Поле для связи | Тип связи |
| otdelen | spec | id_otd | 1 : ∞ |
| spec | grupy | id_spec | 1 : ∞ |
| grupy | students | id_grup | 1 : ∞ |
| students | ocenki | id_stud | 1 : ∞ |
| predmety | ocenki | id_predmet | 1 : ∞ |
Выполните подключение БД к серверу (если она отсутствует).
Указания: разархивируйте архив.
Запустите утилиту "Microsoft SQL Server Management Studio", пройдите регистрацию введя информацию: Параметры подлинности = "Проверка подлинности SQL Server", Имя пользователя=sa, пароль=111 (у Вас может быть свой пароль).
В дереве объектов вызовите контекстное меню папки "Базы данных" и выберите команду "Присоединить". В правой части появится окно, в котором с помощью кнопки "Добавить" укажите файл из архива и щелкните ОК.
В результате у вас на сервере будет зарегистрирована новая БД.
Для создания запроса выберите в левой части нужную БД и щелкните на кнопке
"Создать запрос"
В правой части окна
введите текст запроса.
Для выполнения запроса щелкните на кнопке "Выполнить"
.
В нижней части окна отобразится набор отобранных данных.
Создайте представление № 1 "stud_stbal" для расчета среднего балла каждого студента.
Указания: для создания представления введите команду:
create view stud_srbal
as
select id_stud,
avg(ocenka) as srbal
from ocenki
group by id_stud;
После выполнения команды в левой части окна программы в папке Представления появится созданный вами элемент "stud_srbal". В его контекстном меню выберите команду "Выбрать первые 1000 строк" для просмотра результата работы представления.
Используя представление "stud_srbal", для каждой группы определите количество отличников, хорошистов и троечников (отбирать по среднему баллу, а не по наличию оценок).
Указания: напишем запрос, в котором список средних баллов каждого студента возьмем из созданного ранее представления. При этом введем новое поле nazv, в котором каждого студента пометим текстовой меткой в зависимости от его среднего балла. Результат отбора сгруппируем по группе и по созданной текстовой метке.
Внутри запроса выполним ряд действий:
- свяжем таблицу grupy с представлением stud_srbal через таблицу students;
- для отображения вида рассчитываемой информации (отличники, хорошисты или троечники) будем использовать функцию case;
- по правилам создания запросов с группировкой данных укажем в разделе group by название группы и функцию case.
select nazv_grup,
case when srbal=5 then 'отличников'
when srbal>=4 then 'хорошистов'
else 'троечников' end as nazv,
count(students.id_stud) as kol_stud
from grupy inner join students on grupy.id_grup=students.id_grup
inner join stud_srbal on students.id_stud=stud_srbal.id_stud
group by nazv_grup, case when srbal=5 then 'отличников'
when srbal>=4 then 'хорошистов'
else 'троечников' end;
Определите эти же показатели для каждой специальности.
Указания: запрос похож на предыдущий, но добавляется еще и таблица spec с группировкой по специальности:
Внутри запроса выполним ряд действий:
- свяжем таблицу spec с представлением stud_srbal через таблицы grupy и students;
- для отображения вида рассчитываемой информации (отличники, хорошисты или троечники) будем использовать функцию case;
- по правилам создания запросов с группировкой данных укажем в разделе group by название группы и функцию case.
select nazv_spec,
case when srbal=5 then 'отличников'
when srbal>=4 then 'хорошистов'
else 'троечников' end as nazv,
count(students.id_stud) as kol_stud
from spec inner join grupy on spec.id_spec=grupy.id_spec
inner join students on grupy.id_grup=students.id_grup
inner join stud_srbal on students.id_stud=stud_srbal.id_stud
group by nazv_spec, case when srbal=5 then 'отличников'
when srbal>=4 then 'хорошистов'
else 'троечников' end;
Используя представление № 1 "stud_srbal", создайте запрос на расчет стипендии для каждого студента. Выведите номер студента и сумму стипендии.
Указания: введите запрос вида:
select id_stud,
case when srbal=5 then 1475
when srbal>=4 then 1300
else 0 end as stip
from stud_srbal;
Созданный в предыдущем задании запрос оформить в виде представления № 2 "stip_list".
Указания: нужно над запросом добавить команды создания представления. Также для использования этого представления в других запросах, добавим в его запросе отбор поля id_stud для связывания с другими таблицами:
create view stip_list
as
select id_stud,
case when srbal=5 then 1475
when srbal>=4 then 1300
else 0 end as stip
from stud_srbal;
После выполнения команды в левой части окна программы в папке Представления появится созданный вами элемент "stip_list". Если представление не появилось, выделите узел "Представления" и нажмите F5 для обновления.
Используя представление № 2 "stip_list", выведите ФИО и сумму стипендии. Данные отсортируйте по ФИО.
Указания: для решения свяжем представление с таблицей students.
Введите запрос вида:
select fam,
imya,
otch,
stip
from students inner join stip_list on students.id_stud=stip_list.id_stud
order by fam, imya, otch
Используя представление № 2 "stip_list", определить суммарную стипендию для девушек и парней.
Указания: для решения свяжем представление с таблицей students.
Введите запрос вида:
select pol,
sum(stip) as sumstip
from students inner join stip_list on students.id_stud=stip_list.id_stud
group by pol;
Используя представление № 2 "stip_list", определить суммарную стипендию для каждой группы.
Указания: запрос аналогичен предыдущему. Добавим в него выбор из таблицы grupy и группировку по группам. Для решения свяжем представление с таблицей grupy через таблицу students.
select nazv_grup,
sum(stip) as sumstip
from grupy inner join students on grupy.id_grup=students.id_grup
inner join stip_list on students.id_stud=stip_list.id_stud
group by nazv_grup;
Используя представление № 2 "stip_list", выведите группы, у которых общая сумма стипендии больше 5000.
Указания: запрос аналогичен предыдущему. После группировки добавляем условие для найденных сумм стипендий.
select nazv_grup,
sum(stip) as sumstip
from grupy inner join students on grupy.id_grup=students.id_grup
inner join stip_list on students.id_stud=stip_list.id_stud
group by nazv_grup
having sum(stip) > 5000;
Скачайте исходную БД в формате MySQL. Выполните все рассмотренные выше запросы в этой СУБД.
Указания: распакуйте архив. В архиве находится файл со скриптом БД.
Запустите утилиту EMS SQL Manager for MySQL. В правой части окна программы выберите команду "Выполнить SQL скрипт". В новом окне выберите команду "Выполнить скрипт из файла". В диалоговом окне укажите распакованный файл скрипта. Если появится окно регистрации, то укажите Пользовать=root, Пароль=111. Если такого окна не появилось, то нажимайте в окне ОК. Появится сообщение, что скрипт выполнен успешно и появится окно для регистрации БД. Перенесите ее в правую часть окна и нажмите ОК. В результате БД будет установлена, зарегистрирована и готова к работе.
В левой части окна можете открыть БД, просмотреть ее таблицы.
Для выполнения запросов в окне выполните команду "Инструменты - Показать редактор SQL". В результате в правой части окна откроется поле для ввода тестов запросов.
Скачайте исходную БД в формате SQLite. Выполните все рассмотренные выше запросы в этой СУБД.
Указания: распакуйте. В архиве находится файл БД.
Запустите утилиту SQLIte Expert Pro. На панели инструментов щелкните на кнопке "Open Database" (вторая слева) и в диалоге открытия файла укажите распакованный файл БД. После подключения должен отобразится значок БД.
В правой части окна перейдите на закладку "SQL". В верхней части вводите текст запроса и нажимайте на кнопку "Execute SQL". Если в запросе нет ошибок, то в нижней части будет отображаться результат отбора.