- •В.И. Швецов, А.Н. Визгунов, И.Б. Мееров
- •БАЗЫ ДАННЫХ
- •ОГЛАВЛЕНИЕ
- •ПРЕДИСЛОВИЕ
- •1.1. Развитие основных понятий представления данных
- •1.2. Системы управления базами данных
- •3. Обеспечение логической и физической независимости данных.
- •4. Защита логической целостности базы данных.
- •5. Защита физической целостности.
- •7. Синхронизация работы нескольких пользователей.
- •8. Управление ресурсами среды хранения.
- •9. Поддержка деятельности системного персонала.
- •1.4. Краткий обзор литературы и других доступных источников
- •1.5. Различные представления о данных в базах данных
- •1.6.1. Модель с централизованной архитектурой
- •1.6.2. Модель с автономным персональными ЭВМ
- •1.7. Краткий обзор СУБД
- •1.7.1. Настольные СУБД
- •1.7.2. Серверные СУБД
- •1.8. Основные этапы проектирования базы данных
- •ГЛАВА 2. КОНЦЕПТУАЛЬНОЕ МОДЕЛИРОВАНИЕ БАЗЫ ДАННЫХ
- •2.1. Сложный пример предметной области
- •2.2. Способы описания предметной области
- •2.4. Описание информационных потребностей пользователя
- •2.5. Построение ER-диаграмм
- •2.7. Построение концептуальной модели
- •2.7.1. Моделирование локальных представлений
- •2.7.2. Объединение локальных моделей
- •Слияние идентичных элементов
- •Установление связей между наборами сущностей разных моделей
- •Введение агрегированных элементов
- •Обобщение подобных типов сущностей
- •2.9. Ограничения целостности
- •3.1. Общие представления о модели данных
- •3.2. Сетевая модель данных
- •3.3. Иерархическая модель данных
- •3.4. Реляционная модель данных
- •3.5. Многомерная модель данных
- •ГЛАВА 4. ФОРМАЛИЗАЦИЯ РЕЛЯЦИОННОЙ МОДЕЛИ
- •4.2. Манипулирование данными в реляционной модели
- •4.3. Операции реляционной алгебры
- •4.4.1. Проблема выбора рациональных схем отношений
- •Полное множество функциональных зависимостей
- •4.4.3. Декомпозиция схемы отношения
- •Вторая нормальная форма (2НФ)
- •Третья нормальная форма (3НФ)
- •Мотивировка третьей нормальной формы
- •Нормальная форма Бойса-Кодда (НФБК)
- •Мотивировка нормальной формы Бойса-Кодда
- •4.4.5. Пример нормализации до 3НФ
- •ГЛАВА 5. ФИЗИЧЕСКИЕ МОДЕЛИ ДАННЫХ (СТРУКТУРЫ ХРАНЕНИЯ)
- •5.1. Структура памяти ЭВМ
- •5.2. Представление экземпляра логической записи
- •5.4. Структуры хранения данных во внешней памяти ЭВМ
- •5.4.1. Последовательное размещение физических записей
- •Поиск записи с заданным значением ключа
- •Чтение записи с заданным значением ключа
- •Корректировка записи
- •Удаление записи
- •Добавление записи
- •Поиск записи с заданным значением ключа
- •Чтение записи
- •Корректировка и удаление записи
- •Добавление записи
- •Поиск записи с заданным значением ключа
- •Чтение записи
- •Корректировка записи
- •Удаление записи
- •Добавление записи
- •5.4.4. Использование индексов (индексирование)
- •Поиск записи с заданным значением ключа
- •Чтение записи
- •Корректировка записи
- •Удаление записи
- •Добавление записи
- •5.4.5. Бинарное дерево (В-дерево)
- •Поиск и чтение записи с заданным значением ключа
- •Модификация (корректировка) записи
- •Удаление записи
- •Добавление записи
- •5.4.6. Размещение записей с использованием хэширования
- •Поиск записи с заданным значением ключа и чтение
- •Модификации записи
- •Удаление записи
- •Добавление записи
- •5.4.7. Комбинированные структуры хранения
- •6.1.1. Архитектура базы данных
- •Логический уровень
- •Физический уровень
- •Файлы и группы файлов
- •Страницы и группы страниц
- •6.2.1. Проблемы доступа и обработки данных
- •6.2.2. Навигационный подход
- •6.3. Понятие языка SQL и его основные части
- •6.3.1. История возникновения и стандарты языка SQL
- •6.3.2. Достоинства языка SQL
- •6.3.3. Разновидности SQL
- •6.4.1. Использование SQL для выбора информации из таблицы
- •Простейший запрос
- •Использование агрегатных функций. Простые запросы
- •Форматирование вывода. Выражения в запросе. Упорядочение
- •6.4.4. Язык SQL и операции реляционной алгебры
- •6.5. Программный (встроенный) SQL
- •6.5.1. Статический SQL
- •6.6.1. Библиотека DB-Library
- •6.6.2. Протокол ODBC
- •6.6.3. Протокол OCI
- •6.6.4. Протокол JDBC
- •ГЛАВА 7. ТЕНДЕНЦИИ РАЗВИТИЯ БАЗ ДАННЫХ
- •Объектно-ориентированное программирование
- •Объектно-ориентированные базы данных
- •Объектно-реляционные базы данных
- •7.2. Распределенные базы данных
- •СПИСОК ЛИТЕРАТУРЫ
- •УЧЕБНАЯ ПРОГРАММА КУРСА
- •Цели и задачи курса
- •Дисциплины, изучение которых необходимо для данного курса
- •Программа курса (36 ч. лекций, 18 ч. лабораторных работ)
- •2. Концептуальное моделирование базы данных (6 часов)
- •4. Формализация реляционной модели (6 часов)
- •5. Физические модели данных (структуры хранения) (4 часа)
- •7. Тенденции развития баз данных
- •Список литературы
- •УЧЕБНЫЕ ПОСОБИЯ
- •ОСНОВНЫЕ РЕКОМЕНДУЕМЫЕ МОНОГРАФИИ
- •ЛИТЕРАТУРА ПО ПРОГРАММНЫМ СРЕДСТВАМ
- •ДОПОЛНИТЕЛЬНАЯ ЛИТЕРАТУРА
- •ЛАБОРАТОРНЫЙ ПРАКТИКУМ
- •ОПИСАНИЕ ЛАБОРАТОРНЫХ РАБОТ
- •Лабораторная работа №1
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •ВИДЫ ПРЕДМЕТНЫХ ОБЛАСТЕЙ
- •1. Страховая компания
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •2. Гостиница
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •3. Ломбард
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи.
- •4. Реализация готовой продукции
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •5. Ведение заказов
- •Описание предметной области
- •Таблицы
- •6. Бюро по трудоустройству
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи.
- •7. Нотариальная контора
- •Описание предметной области
- •Таблицы
- •8. Фирма по продаже запчастей
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •9. Курсы по повышению квалификации
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •10. Определение факультативов для студентов
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •11. Распределение учебной нагрузки
- •Описание предметной области
- •Таблицы
- •12. Распределение дополнительных обязанностей
- •Описание предметной области
- •Таблицы
- •13. Техническое обслуживание станков
- •Описание предметной области
- •Таблицы
- •14. Туристическая фирма
- •Описание предметной области
- •Таблицы
- •15. Грузовые перевозки
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •16. Учет телефонных переговоров
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •17. Учет внутриофисных расходов
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •18. Библиотека
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •19. Прокат автомобилей
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •20. Выдача банком кредитов
- •Описание предметной области
- •Таблицы
- •21. Инвестирование свободных средств
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •22. Занятость актеров театра
- •Описание предметной области
- •Таблицы
- •23. Платная поликлиника
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •25. Учет телекомпанией стоимости прошедшей в эфире рекламы
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •26. Интернет-магазин
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •27. Ювелирная мастерская
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •28. Парикмахерская
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •29. Химчистка
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •30. Сдача в аренду торговых площадей
- •Описание предметной области
- •Таблицы
- •Развитие постановки задачи
- •ПРИМЕР ВЫПОЛНЕНИЯ ЛАБОРАТОРНЫХ РАБОТ
- •Лабораторная работа №1
- •Краткое задание
- •Пример выполнения
- •Вариант 2.
- •Вариант 3.
- •Сетевая модель
- •Иерархическая модель
- •Реляционная модель
- •Лабораторная работа №2
- •Краткое задание
- •Пример выполнения
- •Таблица Абитуриенты
- •Таблица Экзамены
- •Таблица Оценки
- •Схема данных
- •Абитуриенты-Оценки
- •Экзамены-Оценки
- •Импорт данных
- •Таблица «Абитуриенты»
- •Таблица «Экзамены»
- •Таблица «Оценки»
- •Лабораторная работа №3
- •Краткое задание
- •Пример выполнения
- •Лабораторная работа №4
- •Краткое задание
- •Пример выполнения
- •Лабораторная работа №5
- •Краткое задание
- •Пример выполнения
- •Описание расширенной предметной области
- •Состав хранимой информации
- •Диаграммы «Сущность-Связь»
- •Таблицы в 3НФ
- •Скрипты для создания объектов базы данных в СУБД Oracle
- •Лабораторная работа №6
- •Краткое задание
- •Пример выполнения
Номер |
Фамилия |
Имя |
Отчество |
Номер_аттестата |
Дата_аттестата |
|||||
3 |
Михайлов |
Федор |
Петрович |
|
245542 |
21.06.2003 |
||||
Таблица «Экзамены» |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|||
Код_экзамена |
|
Предмет |
Дата_экзамена |
Тип_экзамена |
Факультет |
|||||
|
1 |
Математика |
21.07.2003 |
|
письменно |
|
ВМК |
|||
|
2 |
Физика |
27.07.2003 |
|
письменно |
|
ВМК |
|||
|
3 |
Математика |
21.07.2003 |
|
письменно |
|
ММ |
|||
|
4 |
Физика |
27.07.2003 |
|
письменно |
|
ММ |
|||
|
5 |
русский язык |
30.07.2003 |
|
сочинение |
|
ВМК |
|||
|
|
и литература |
|
|
|
|
|
|
|
|
|
6 |
русский язык |
30.07.2003 |
|
сочинение |
|
ММ |
|||
|
|
и литература |
|
|
|
|
|
|
|
|
Таблица «Оценки» |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
Код_экзамена |
|
Номер_абитуриента |
Оценка |
|
|
|||||
|
1 |
|
|
1 |
|
4,50 |
|
|
|
|
|
1 |
|
|
2 |
|
4,00 |
|
|
|
|
|
1 |
|
|
3 |
|
3,50 |
|
|
|
|
|
2 |
|
|
1 |
|
4,00 |
|
|
|
|
|
2 |
|
|
2 |
|
4,50 |
|
|
|
|
|
3 |
|
|
1 |
|
4,00 |
|
|
|
|
|
5 |
|
|
1 |
|
3,50 |
|
|
|
|
|
5 |
|
|
2 |
|
3,00 |
|
|
|
Лабораторная работа №3
Краткое задание
Выбрать требуемую информацию.
Пример выполнения
1.Вывести фамилию, имя, отчество всех абитуриентов.
SELECT фамилия, имя, отчество FROM абитуриенты;
2.Вывести названия различных предметов, которые сдаются в вуз.
SELECT DISTINCT предмет FROM экзамены;
3.Вывести всю возможную информацию об экзаменах, проводимых в вуз.
SELECT * FROM экзамены;
320
4.Вывести фамилии абитуриентов и оценки, которые они получили на различных экзаменах.
SELECT фамилия, оценка FROM абитуриенты, оценки WHERE абитуриенты.номер =оценки.номер_абитуриента;
5.Вывести фамилии абитуриентов и их оценки по математике. Отсортировать вывод по оценкам, внутри оценок по фамилиям абитуриентов.
SELECT фамилия, оценка, предмет FROM абитуриенты, экзамены, оценки
WHERE абитуриенты.номер = оценки.номер_абитуриента and оценки.код_экзамена = экзамены.код_экзамена and предмет = 'Математика'
ORDER BY оценка desc, фамилия;
6.Вывести фамилии абитуриентов и оценки, которые были получены в июле 2003 года.
SELECT фамилия, оценка
FROM абитуриенты, экзамены, оценки
WHERE абитуриенты.номер = оценки.номер_абитуриента and оценки.код_экзамена = экзамены.код_экзамена
and month(дата_экзамена) = 7 and year(дата_экзамена)
=2003;
7.Вывести фамилии, имена и отчества абитуриентов, сдавших математику лучше, чем на 3.
SELECT DISTINCT фамилия, имя, отчество
FROM абитуриенты, экзамены, оценки
WHERE абитуриенты.номер = оценки.номер_абитуриента and оценки.код_экзамена = экзамены.код_экзамена and предмет = 'математика'
and оценка>3;
8.Какие оценки получил Сергеев Сергей Сергеевич на ВМК?
SELECT оценка
FROM абитуриенты, экзамены, оценки
WHERE абитуриенты.номер = оценки.номер_абитуриента and оценки.код_экзамена = экзамены.код_экзамена and фамилия = «Сергеев» and имя = «Сергей»
321
and отчество = «Cергеевич» and факультет = «ВМК»;
9.Какие оценки получил абитуриент с кодом 2? а с кодом 3? а с некоторым кодом?
SELECT оценка FROM оценки WHERE номер_абитуриента = 2;
SELECT оценка FROM оценки WHERE номер_абитуриента = 3;
SELECT оценка FROM оценки
WHERE номер_абитуриента = [введите номер абитуриента];
10.Вывести фамилию, инициалы и оценки абитуриентов за экзамен по математике на факультете ВМК, который проходил 21 июля. Фамилия и инициалы должны быть выведены в одном поле. Вывод должен быть отсортирован по вычислимому полю.
SELECT фамилия & « » & left(имя,1) & «. »
& left( отчество,1) as абитуриент, оценка FROM абитуриенты, экзамены, оценки
WHERE абитуриенты.номер = оценки.номер_абитуриента and оценки.код_экзамена = экзамены.код_экзамена and факультет = «ВМК»
and предмет = «математика»
and дата_экзамена = #7/21/2003#
ORDER BY фамилия & « » & left(имя,1) & «. » & left(отчество,1);
Внешнее объединение. Is Null, Is Not Null, Like. Оператор
UNION.
11.Добавить абитуриента в таблицу. Пусть пока он не получил ни одной оценки. Вывести информацию по всем абитуриентам и оценки, которые они получили (или значение NULL, если они не получили пока ни одной оценки).
SELECT фамилия, оценка
FROM абитуриенты
LEFT JOIN оценки
ON абитуриенты.номер = оценки.номер_абитуриента;
12.Вывести информацию (номер, фамилия, имя, отчество) обо всех абитуриентах, которые не имеют пока оценок.
322
SELECT фамилия, оценка
FROM абитуриенты
LEFT JOIN оценки
ON абитуриенты.номер = оценки.номер_абитуриента
WHERE оценка Is Null;
13. Вывести абитуриентов, которые сдавали какие-либо экзамены.
SELECT фамилия, оценка
FROM абитуриенты LEFT JOIN оценки
ON абитуриенты.номер=оценки.номер_абитуриента
WHERE оценка is not null;
14. Вывести даты проведения экзаменов и даты выдачи аттестатов (?).
SELECT дата_аттестата FROM абитуриенты
UNION
SELECT дата_экзамена FROM экзамены;
15.Получить фамилии, имена и номера студентов, которых зовут Александр или Александра. Учесть, по возможности, что имя может быть набрано с ошибками или с ведущими пробелами (?).
SELECT фамилия,имя, номер FROM абитуриенты
WHERE имя like «*Александр*» or имя like «*Алекс*» or имя like «*Ал*»
16. Какая средняя оценка по всем абитуриентам?
SELECT avg(оценка) as средняя_оценка FROM оценки;
17. Сколько экзаменов в расписании?
SELECT count(*) as количество_экзаменов FROM экзамены;
18. Сколько абитуриентов в нашей базе данных?
SELECT count(*) as количество_абитуриентов FROM абитуриенты;
19. Какая средняя оценка по математике на каждый факультет?
SELECT avg(оценка) as средняя_оценка, факультет FROM оценки, экзамены, абитуриенты
WHERE оценки.код_экзамена = экзамены.код_экзамена and оценки.номер_абитуриента = абитуриенты.номер
323
and предмет = «математика» GROUP BY факультет;
20.Сколько оценок было поставлено на экзаменах на каждый факультет?
SELECT факультет, count(номер_абитуриента) as количество_абитуриентов
FROM экзамены, оценки
WHERE оценки.код_экзамена = экзамены.код_экзамена GROUP BY факультет;
21.Какие средние оценки по каждому факультету по каждому предмету?
SELECT факультет, предмет, avg(оценка) as средняя_оценка FROM экзамены, оценки
WHERE оценки.код_экзамена = экзамены.код_экзамена GROUP BY факультет, предмет;
Создать группирующий запрос, в котором определяются условия, причем сначала выполняются вычисления, а затем происходит отбор.
22.На какие факультеты средний балл абитуриентов по всем экзаменам выше, чем 4?
SELECT avg(оценка), факультет FROM экзамены, оценки WHERE оценки.код_экзамена = экзамены.код_экзамена GROUP BY факультет
HAVING avg(оценка) > 4;
23. По каким предметам средний балл абитуриентов меньше 4?
SELECT avg(оценка), предмет FROM экзамены, оценки WHERE оценки.код_экзамена = экзамены.код_экзамена
GROUP BY предмет
HAVING avg(оценка) < 4;
Создать группирующий запрос, в котором определяются условия, причем сначала происходит отбор, а затем выполняются вычисления.
24.Среди абитуриентов, сдававших математику, подсчитать количество положительных оценок по каждому факультету.
324
SELECT count(оценка) as количество_оценок, факультет FROM оценки, экзамены
WHERE оценки.код_экзамена = экзамены.код_экзамена and предмет = «математика»
and оценка > 2 GROUP BY факультет;
25.Подсчитать среднюю оценку абитуриентов по каждому факультету, за июльские экзамены.
SELECT avg(оценка) as средняя_оценка, факультет FROM оценки, экзамены
WHERE оценки.код_экзамена = экзамены.код_экзамена and month(дата_экзамена) = 7
GROUP BY факультет;
26. Какие баллы набрали абитуриенты на каждый факультет?
SELECT sum(оценка) as набранный_балл, факультет, номер_абитуриента
FROM оценки, экзамены
WHERE оценки.код_экзамена = экзамены.код_экзамена GROUP BY факультет, номер_абитуриента;
27.Вывести информацию по абитуриентам, получившим пятерки по математике или физике.
SELECT фамилия & « » & left(имя,1) & «. »
&left( отчество,1) as абитуриент, оценка, предмет FROM абитуриенты, экзамены, оценки
WHERE абитуриенты.номер = оценки.номер_абитуриента and оценки.код_экзамена = экзамены.код_экзамена and предмет in ( «математика»,»физика»)
ORDER BY фамилия & « » & left(имя,1) & «. »
&left(отчество,1);
28.Какие студенты сдали экзамены (получили оценку строго больше
2)с кодом 1 или 2 или 3?
SELECT DISTINCT фамилия, имя, отчество
FROM абитуриенты, экзамены, оценки
WHERE абитуриенты.номер = оценки.номер_абитуриента and оценки.код_экзамена = экзамены.код_экзамена and оценки.код_экзамена in (1,2,3)
325
and оценка>2
ORDER BY фамилия, имя;
29. Какие абитуриенты получили больше других пятерок?
SELECT номер_абитуриента, count(оценка) FROM оценки
WHERE оценка = 5
GROUP BY номер_абитуриента
HAVING count(оценка) > ANY (SELECT count(оценка)
FROM оценки
WHERE оценка = 5
GROUP BY номер_абитуриента);
30.Какие абитуриенты сдали математику лучше, чем в среднем сдали различные предметы абитуриенты, поступающие на ВМК?
SELECT DISTINCT номер_абитуриента FROM оценки, экзамены
WHERE оценки.код_экзамена = экзамены.код_экзамена and предмет = «математика»
and оценка > (SELECT avg(оценка)
FROM оценки, экзамены
WHERE оценки.код_экзамена = экзамены.код_экзамена and факультет = «ВМК»);
31.По каким предметам проводилось меньше экзаменов, чем по другим?
SELECT предмет
FROM экзамены
GROUP BY предмет HAVING count(*) < ANY
(SELECT count(*) FROM экзамены
GROUP BY предмет);
32.Какие абитуриенты сдали все экзамены, которые есть в расписании?
SELECT номер_абитуриента
FROM оценки
326