Теперь попытка ввести через представление VStudentNOINSERTIST03 данных о студенте группы АИС-03 (IDGroup=2)
INSERT INTO VStudentNOINSERTIST03
VALUES('050007','1111111117','Васин В.И.', 2, '8701', '192314', '01.06.2002', 'УВД г.Ухты');
приведет к появлению следующего сообщения об ошибке:
Server: Msg 550
The attempted insert or update failed because the target view either specifies WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION and one or more rows resulting from the operation did not qualify under the CHECK OPTION constraint.
Во втором случае на представление «скидываются» наиболее часто повторяющиеся и трудоемкие операции. Например, чтобы вывести на экран «полноценную» ведомость по той или иной дисциплине, необходимо выполнить соединение практически всех таблиц базы данных. Обычно эта операция возлагается на представление. После этого вывод на экран ведомости для той или иной группы или по тому или иному предмету обеспечивается с помощью элементарного запроса, но уже к представлению.
Пример 83
Задача.
Создать представление для вывода всех данных об успеваемости студентов.
Решение.
Приведенное ниже представление не только значительно уменьшит сложность реализуемых через него к базе данных запросов, но и позволит пользователю апеллировать привычными для него понятиями: Название дисциплины, Имя студента и т.п. Кроме того, оно полностью скрывает истинную структуру базы данных.
|
|
CREATE VIEW VPROGRESS
AS
SELECT
NameGroup [Группа],
S.NRecordBook [№ зачетки],
SName [Имя студента ],
NameSubject[Название дисциплины],
NameReport[Вид отчетности],
NTerm[№ семестра],
PIN [Персонифицированный номер преподавателя],
Mark[Оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
INNER JOIN SGroup SG
ON S.IDGroup=SG.IDGroup
INNER JOIN Subject SB
ON P.IDSubject=SB. IDSubject
INNER JOIN Report R
ON P.IDReport=R.IDReport
Реализация запроса
SELECT *
FROM VProgress;
к представлениюVProgress позволит получить следующий результат:
Результат выполнения запроса.
Группа запросов, реализуемая через представление VProgress, весьма обширна. Например, вывод агрегированных значений: средней оценки по каждой группе, дисциплине, студенту, семестру, количества видов отчетности по каждой дисциплине, да и просто вывод любых данных, касающихся успеваемости в любом временном интервале с различной степенью детализации. Очевидно, что и задача вывода списка отличников, превращается в тривиальную задачу. Ниже рассмотрим реализацию некоторых из них.
Пример 84
Задача.
Вывести успеваемость студентов по дисциплине БД в 5 семестре, используя представление VProgress.
Решение.
SELECT *
FROM VProgress
WHERE [Название дисциплины]='БД'
AND [№ семестра]=5
Результат выполнения запроса.
Нетрудно представить, как бы выглядел этот запрос, обращенный непосредственно к таблицам
SELECT NameGroup [Группа],
S.NRecordBook [№ зачетки],
SName [Имя студента ],
|
|
NameSubject[Дисциплина],
NameReport [Отчетность],
NTerm [Семестр],
PIN [ПИН],
Mark[Оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
INNER JOIN SGroup SG
ON S.IDGroup=SG.IDGroup
INNER JOIN Subject SB
ON P.IDSubject=SB.IDSubject
INNER JOIN Report R
ON P.IDReport=R.IDReport
WHERE NameSubject ='БД'
AND NTerm=5
Пример 85
Задача.
Вывести средний балл по каждой группе студентов в 5 семестре.
Решение.
SELECT Группа, AVG(Оценка) [Средняя оценка]
FROM VProgress
WHERE [Семестр]=5
GROUP BY Группа
Результат выполнения запроса.
Представление может быть создано не только с использованием таблиц, но и самих представлений. Например, через представление VProgress нельзя увидеть имена преподавателей, ведущих, ту или иную дисциплину, а через созданное ниже представление VProgressTeacher это вполне реально. Однако не следует злоупотреблять многоуровневостью представлений, ибо это может привести к значительному снижению производительности.
Пример 86
Задача.
Создать представление для вывода всех данных об успеваемости студентов, включая имена преподавателей, ведущих те или иные дисциплины.
Решение.
CREATE VIEW VPROGRESSTEACHER
AS
SELECT Группа,
[№ зачетки],
[Имя студента],
[Дисциплина],
[Отчетность],
[Семестр],
[ПИН],
TName [Имя преподавателя],
Оценка
FROM VProgress P INNER JOIN Teacher T
ON P.[ПИН]=T.PIN
Очевидно, прежде чем создать то или иное представление, нужно выполнить анализ реализуемых к базе данных запросов, провести анализ задействованных при этом столбцов и атрибутов, частоту тех или иных запросов.
Задание 49
Создать представление для просмотра базы данных с целью определения успеваемости студентов группы АИС-03.
Задание 50
Создать представление для вывода ведомостей успеваемости студентов.
Задание 51
Создать представление для вывода информации о предметах, изучаемых в 3 семестре студентами специальности ИСТ.
Задание 52
Создать представление для вывода информации о плановой нагрузке преподавателей кафедры АИС.
Задание 53
Создать представление для вывода информации о плановой нагрузке по дисциплине БД (Базы данных).
Вопросы для самоконтроля к лабораторной работе № 6
1. Что такое представление?
2. С какой целью создаются представления?
3. В чем отличие простых и сложных представлений?
4. Какое предложение, включенное в команду Create View, позволяет создавать представление в отсутствии базовых таблиц?
5. Какие предложения не может содержать запрос, определяющий представления?
6. Какие представления позволяют выполнять все без исключения операции DML?
7. Когда через представления нельзя выполнить операции удаления?
8. Как реализуется запрос на выполнение операции DML при создании представления?
9. Когда в представлении нельзя выполнить операцию добавления, но можно выполнить операцию удаления?
10. Допускается ли изменение представления?
11. В каких случаях нельзя изменить данные в представлении?
12. Представление содержит групповые функции, условия соединения, вычисляемые значения, какие операции над данными не будут выполняться в этом представлении?