Академический Документы
Профессиональный Документы
Культура Документы
Алматы 2004
4
СОСТАВИТЕЛИ: Ибраева Л.К., Сатимова Е.Г. Проектирование
баз данных. Методические указания к выполнению лабораторных
работ (для студентов всех специальностей). – Алматы: АИЭС, 2004
– 45 с.
7
требуемого компьютерным оборудованием. Эта идея была повсеместно
принята и воплотилась предложением обобщенной структуры баз данных,
названной трехуровневой архитектурой базы данных: три уровня
абстракции, на которых можно рассматривать базу данных. Трехуровневая
архитектура – это стандартная структура базы данных состоящая из
концептуального, внешнего и внутреннего уровней. На
концептуальном уровне выполняется концептуальное проектирование базы
данных. Концептуальное проектирование базы данных включает анализ
информационных потребностей пользователей и определение нужных им
элементов данных. Результатом концептуального проектирования является
концептуальная схема - единое логическое описание всех элементов данных и
отношений между ними. Внешний уровень
составляют пользовательские представления данных базы данных, с точки
зрения которых различные группы пользователей в организации понимают
устройство базы данных, обращаются с ней и обновляют данные.
Внутренний уровень определяет
физический вид на базы данных, посредством которого СУБД контролирует и
обновляет базу данных (физические адреса, индексы, указатели и т.д.). За
этот уровень отвечают проектировщики физической базы данных. Ни один
пользователь (как пользователь) не касается этого уровня.
Этап концептуального проектирования включает
создание концептуальной схемы базы данных. Спецификации
разрабатываются в той степени, которая требуется для перехода к реализации.
На этом этапе создаются подробные модели пользовательских представлений
данных; затем они интегрируются в концептуальную модель, фиксирующую
все элементы данных, которые будет содержать база данных.
Главными элементами концептуальной модели данных являются
объекты и отношения.
Объекты представляют вещи, которые пользователи считают важными
в моделируемой части реальности. Объектное множество – множество
вещей одного типа.
Отношение – связь между элементами двух объектных множеств.
Составное объектное множество – отношение, рассматриваемое как
объектное множество.
Мощность отношения обозначает максимальное количество
элементов одного объектного множества, связанных с одним элементом
другого объектного множества.
Концептуальные модели данных значительно проще понимать, чем
реляционные модели, поскольку они лучше соответствуют естественному
взгляду на вещи.
8
изучаемых предметов; преподавательский состав кафедр, обеспечивающих
учебный процесс; сведения о лекционных, практических и других видах
занятий в каждой группе; результаты сдачи экзаменов (зачетов) по каждому
из проведенных занятий. Назовем базу данных «Учебный процесс».
Поскольку вещи одного типа хранятся в отдельных объектных
множествах, можем выделить следующие объектные множества:
ГРУППЫ, СТУДЕНТЫ, КАФЕДРЫ, ПРЕПОДАВАТЕЛИ, ПРЕДМЕТЫ,
ВИДЫ_ЗАНЯТИЙ.
Определим некоторые атрибуты для этих объектных множеств.
ГРУППЫ - Название_группы, Количество_студентов, Курс.
СТУДЕНТЫ - Фамилия_студента, Имя_студента, Отчество_студента,
Дата_рождения_студента, Адрес_студента.
КАФЕДРЫ - Название_кафедры, Телефон_кафедры, ФИО_Заведующего.
ПРЕПОДАВАТЕЛИ - Фамилия_преподавателя, Имя_преподавателя,
Отчество_преподавателя, Должность_преподавателя,
Ученая_степень_преподавателя.
ПРЕДМЕТЫ – Название_предмета, Всего_часов, Часов_лекционных_занятий,
Часов_практических, Часов_лабораторных.
ВИДЫ_ЗАНЯТИЙ – Вид_занятия.
Может быть сформулировано множество вопросов к базе данных,
например: к какой группе относится студент, на каких кафедрах работают
преподаватели, какие предметы, в каких группах они ведут, какую оценку
получили студенты по определенным видам занятий по определенному
предмету и т.д. Чтобы ответить на широкий круг возможных вопросов к базе
данных, следует рассмотреть отношения между объектными множествами.
Между объектами ГРУППЫ и СТУДЕНТЫ существует одно-многозначное
отношение, поскольку одна группа включает много студентов, а один студент
входит только в одну группу. Аналогично
устанавливается связь между объектами КАФЕДРЫ и ПРЕПОДАВАТЕЛИ,
которые также находятся в одно-многозначных отношениях (на одной
кафедре работает много преподавателей, но каждый преподаватель работает
на определенной кафедре). По каждому
предмету проводится множество видов занятий в различных группах
разными преподавателями. Это определяет много-многозначные отношения
между множествами ГРУППЫ и ПРЕДМЕТЫ, ГРУППЫ и ПРЕПОДАВАТЕЛИ,
ПРЕДМЕТЫ и ПРЕПОДАВАТЕЛИ, ПРЕДМЕТЫ и ВИДЫ_ЗАНЯТИЙ
Отношения между группами,
предметами и преподавателями с их мощностями представлены на
следующей схеме (рисунок 1). Атрибуты объектов на схеме не указаны.
Эти отношения представляют
собой составное объектное множество, назовем его ИЗУЧЕНИЕ. Это
множество имеет собственный атрибут - Часов_занятий (значение этого
атрибута равно одному из значений атрибутов: Часов_лекционных,
Часов_практических, Часов_лабораторных объектного множества
9
ПРЕДМЕТЫ). База данных
должна обеспечить хранение информации об итоговых оценках студента за
семестр по каждому виду занятия, отображенному в объекте ИЗУЧЕНИЕ.
Отношения между объектами СТУДЕНТЫ и ИЗУЧЕНИЕ являются много-
многозначными, так как одному студенту соответствует много видов занятий,
отображаемых объектом ИЗУЧЕНИЕ, а один вид занятия проводится со
многими студентами.
Часов_заняти
ВИД_ЗАНЯТИЙ
ПРЕДМЕТЫ имеют
Ы
изучают
проводят
ГРУППЫ ИЗУЧЕНИЕ
ПРЕПОДАВАТЕЛИ
ИЗУЧЕНИЕ
Часов_заняти
ИЗУЧЕНИЕ
ВИД_ЗАНЯТИЙ
ПРЕДМЕТЫ имеют
изучают
проводят
ГРУППЫ
ПРЕПОДАВАТЕЛИ
СТУДЕНТЫ
учатся
УСПЕВАЕМОСТЬ
работаю
КАФЕДРЫ
11
будут иметь четвертую нормальную форму. То есть дальнейшая
нормализация модели не потребуется.
Преобразование объектных множеств и атрибутов. Объектное
множество с атрибутами может быть преобразовано в реляционную таблицу
с именем объектного множества в качестве имени таблицы и атрибутами
объектного множества в качестве атрибутов таблицы. Если некоторый набор
этих атрибутов может быть использован в качестве ключа таблицы, то он
выбирается ключом таблицы. В противном случае в таблицу добавляется
атрибут, значения которого будут однозначно определять объекты-элементы
исходного объектного множества, и который, таким образом, может служить
ключом таблицы.
Преобразуем объектные множества ГРУППЫ, КАФЕДРЫ, ПРЕДМЕТЫ в
реляционные таблицы с соответствующими названиями. Потенциальными
ключами этих таблиц могут быть выбраны атрибуты Название (группы,
кафедры, предмета), при условии, что названия не будут повторяться. Но мы
для однозначной идентификации каждого элемента таблицы, введем в эти
таблицы атрибут Номер (группы, кафедры, предмета) и будем его
использовать в качестве первичного ключа. Этим ключом будет проще
пользоваться при повседневной работе по вводу данных.
Таким образом, имеем реляционные таблицы (ключевые поля
выделены курсивом):
ГРУППЫ (Номер_группы, Название_группы, Количество_студентов, Курс);
КАФЕДРЫ (Номер_кафедры, Название_кафедры, Телефон_кафедры,
ФИО_Заведующего);
ПРЕДМЕТЫ (Номер_предмета, Название_предмета, Всего_часов,
Часов_лекций, Часов_практики, Часов_лабораторных) .
Объект ВИДЫ_ЗАНЯТИЙ преобразуется в таблицу с единственным
атрибутом: ВИДЫ_ЗАНЯТИЙ (Вид_занятия).
В объекте СТУДЕНТЫ для идентификации студента может быть выбрана
фамилия. Однако, учитывая возможность повторений, лучше в качестве
идентификатора студента рассматривать его порядковый номер
(идентификаторы типа «№_зачетной_книжки», «№_удостоверения»,
«№_РНН» не рекомендуется применять, ввиду их неудобства при вводе
данных и возможных изменений, например, при утере):
СТУДЕНТЫ (Номер_студента, Фамилия_студента, Имя_студента,
Отчество_студента, Дата_рождения_студента, Адрес_студента).
Аналогично определяется структура таблицы ПРЕПОДАВАТЕЛИ:
ПРЕПОДАВАТЕЛИ (Номер_преподавателя, Фамилия_преподавателя,
Имя_преподавателя, Отчество_преподавателя,
Должность_преподавателя, Ученая_степень).
Преобразование отношений. В любом отношении «один-ко-многим» в
таблицу, описывающую объект, мощность со стороны которого равна
«многим», включается столбец, являющийся внешним ключом,
указывающим на другой объект.
12
Связи между объектами ГРУППЫ и СТУДЕНТЫ характеризуются одно-
многозначными отношениями, поскольку одна группа включает много
студентов, а один студент входит только в одну группу. Тогда по правилам
преобразований отношений, связь между ними осуществляется по номеру
группы. Этот атрибут будет внешним ключом таблицы СТУДЕНТЫ. Кроме
того, добавим в таблицу атрибут Студент_староста; в этом поле будем
указывать номер студента, который является старостой группы, то есть
значения ключа этой же таблицы. Этот атрибут связывает объект СТУДЕНТЫ с
самим собой – так называемое рекурсивное отношение. Атрибут
Студент_староста – это рекурсивный внешний ключ. Итак, структура
таблицы СТУДЕНТЫ примет вид:
СТУДЕНТЫ (Номер_студента, Фамилия_студента, Имя_студента,
Отчество_студента, Дата_рождения_студента, Адрес_студента,
Номер_группы, Студент_староста).
Заметим, что в этой таблице можно было выбрать составной ключ из
номера студента и номера группы. Такой идентификатор позволял бы явно
определять принадлежность студента к группе. Но в этом случае для
определения старост групп потребовалась бы отдельная таблица. Мы решили
использовать простой ключ.
Объекты КАФЕДРЫ и ПРЕПОДАВАТЕЛИ также находятся в одно-
многозначных отношениях. Связь между ними осуществляется по
уникальному ключу главного объекта КАФЕДРЫ - номеру кафедры, который
включается в подчиненный объект:
ПРЕПОДАВАТЕЛИ (Номер_преподавателя, Фамилия_преподавателя,
Имя_преподавателя, Отчество_преподавателя,
Должность_преподавателя, Ученая_степень, Номер_кафедры).
Объект ИЗУЧЕНИЕ определяет много-многозначные отношения
(рисунок 1). Для преобразования отношений «много-ко-многим» создается
таблица пересечений, в которой используются только ключевые столбцы
исходных таблиц. Таблица пересечений может иметь дополнительные
неключевые атрибуты, присущие только ей. Определим атрибуты таблицы
ИЗУЧЕНИЕ:
ИЗУЧЕНИЕ (Номер_группы, Номер_предмета, Номер_преподавателя,
Вид_занятий, Часов_занятий).
Примечание. В дальнейшем при реализации проекта мы не будем
создавать таблицу ВИДЫ_ЗАНЯТИЙ, так как единственный атрибут этой
таблицы входит в состав ключевых атрибутов таблицы ИЗУЧЕНИЕ.
Объект ИЗУЧЕНИЕ играет роль объекта-связки в рассматриваемых
много-многозначных отношениях объектов.
В каждой группе проводится ряд видов занятий в соответствии с
изучаемыми предметами. С другой стороны, каждый вид занятия определен
для конкретной группы. Поэтому имеет место связь типа «один-ко-многим»
между объектами ГРУППЫ и ИЗУЧЕНИЕ.
По каждому предмету проводится множество занятий в различных
13
группах разными преподавателями. С другой стороны, каждое занятие
проводится по конкретному предмету, что определяет отношения типа «один-
ко-многим» между объектами ПРЕДМЕТЫ и ИЗУЧЕНИЕ. Аналогично
определяются отношения типа «один-ко-многим» между объектами
ПРЕПОДАВАТЕЛИ и ИЗУЧЕНИЕ.
Объект УСПЕВАЕМОСТЬ обеспечивает хранение информации об
итоговых оценках студента за семестр по каждому виду занятия,
отображенному в объекте ИЗУЧЕНИЕ. Такая оценка определяется с одной
стороны идентификатором студента (Номер_студента), а с другой стороны –
идентификатором занятия (Номер_группы + Номер_преподавателя +
Номер_предмета + Вид_занятия). Их объединение образует уникальный
идентификатор объекта УСПЕВАЕМОСТЬ. Этот объект содержит данные об
успеваемости конкретного студента по конкретному виду занятий. По разным
видам занятий в различное время могут проводиться различные виды
контроля (экзамен, зачет, дифференцированный зачет, допуск). Атрибуты
Вид_контроля, Дата_сдачи и Оценка являются неключевыми атрибутами этой
таблицы: УСПЕВАЕМОСТЬ
(Номер_студента, Номер_группы, Номер_предмета,
Номер_преподавателя, Вид_занятий, Вид_контроля, Дата_сдачи, Оценка).
14
SQL Server существует несколько способов, базирующихся на выполнении
определенной команды. Для ввода и тестирования процедур
и операторов Transact-SQL используется SQL Server Query Analyser
(анализатор запросов SQL) – средство, входящее в комплект поставки SQL
Server 7. Окно этого средства можно вызвать из меню Tools основного окна
программы.
Размещение пользовательских баз может меняться в зависимости от
версии SQL и размещения Program Files. Выяснить место расположения
пользовательских баз можно из основного окна программы, выбрав из
контекстного меню Свойства (Properties) любой базы в списке Databases.
Также в окне свойств на вкладке TransactionLog просмотрите место
расположения журнала транзакций. Команды резервного копирования и
восстановления базы данных тоже выбираются в контекстном меню: строка
Все задачи (All Tasks), команды Backup Databases и Restore Databases.
15
PRIMARY - Определяет файл, содержащий логическое начало базы данных и
системных таблиц. В базе данных может быть только один первичный
(PRIMARY) файл. Если этот параметр пропущен, то первичным считается
первый файл в списке.
LOG ON - Определяет список файлов на диске, в которых будет храниться
журнал транзакций. Если этот параметр не определен, то размер журнала
транзакций будет составлять 25% от общего размера файлов данных.
education_data – Определяет логическое имя, которое SQL Server будет
использовать для обращения к файлу.
FILENAME – Задает параметры файла операционной системы (имя файла,
который должен находиться на сервере, где установлен SQL Server,
первоначальный и максимальный размеры базы данных и приращение для
увеличения размера базы данных).
16
Stud_FAM char(20) not null,
Stud_IMA char(10) not null,
Stud_OTCH char(15) not null,
Stud_DATE datetime not null,
Stud_ADDRESS char(25) null,
Grup_ID integer not null FOREIGN KEY
REFERENCES Gruppa (Grup_ID ),
Stud_STAR bigint not null,
CONSTRAINT PK_Students PRIMARY KEY (Stud_ID),
CONSTRAINT FK_Students_Students FOREIGN KEY (Stud_STAR)
REFERENCES Students (Stud_ID)
)
17
Grup_ID integer not null FOREIGN KEY
REFERENCES Gruppa (Grup_ID ),
Subj_ID integer not null FOREIGN KEY
REFERENCES Subject (Subj_ID ),
Teach_ID bigint not null FOREIGN KEY
REFERENCES Teacher (Teach_ID),
Form_Study char (20) not null,
Lesson_Hours integer not null,
CONSTRAINT PK_Study
PRIMARY KEY (Grup_ID, Subj_ID, Teach_ID, Form_Study )
)
19
INSERT INTO Students
VALUES (030101, 'Ахметов', 'Данияр', 'Муратович', 02/04/85,'Алматы', 1, 30101)
INSERT INTO Students
VALUES (030102,'Ким', 'Алла', 'Юрьевна',11/09/85б, 'Алматы',1, 030101)
Если необходимо ввести пустое значение (NULL), просто укажите его в
списке значений (при создании таблицы поле должно быть описано как
NULL). Например:
INSERT INTO Students
VALUES (030103, 'Цой', 'Олег','Иванович',10/05/85, NULL,1,030101)
Удаление строк из таблиц. Это еще одна операция, которую
необходимо уметь выполнять для поддержки базы данных. Для удаления
строк из таблицы используется команда DELETE. Синтаксис инструкции:
DELETE [FROM] имя_таблицы
WHERE имя_столбца = значение
Ключевое слово FROM в инструкции необязательно. Инструкция
DELETE без предложения WHERE применяется очень редко. Прежде чем
выполнить операцию, убедитесь в правильности написания инструкции, так
как можно непреднамеренно удалить все строки таблицы.
Чтобы удалить все содержание таблицы студентов вы можете ввести
команду:
DELETE FROM students
Чаще всего не рекомендуется выполнять эту команду! Обычно Вам
требуется удалять некоторые определенные строки в таблице. Чтобы
определить какие строки будут удалены, используйте условие отбора.
Например, чтобы удалить определенную запись о студенте, можно ввести:
DELETE FROM students
WHERE Stud_ID = 30103
Разумеется, если условию будет соответствовать несколько записей, все
они будут удалены.
В отличие от файловых СУБД, SQL Server не помечает записи как
удаленные, а удаляет их физически, то есть восстановлению они не подлежат.
Будьте осторожны с командой DELETE!
Изменение значения поля. Для изменения существующих значений в
столбцах таблицы используется инструкция UPDATE. Упрощенный синтаксис
этой инструкции следующий:
UPDATE имя_таблицы
SET имя_столбца_1 = значение, …, имя_ столбца_n = значение
WHERE имя_столбца оператор_сравнения значение
20
Команда UPDATE позволяет изменять некоторые или все значения в
существующей записи в таблице. Эта команда содержит предложение
UPDATE, за которым указывается имя таблицы, и предложение SET,
указывающее на изменение, которое нужно сделать для определенного
столбца. Например, чтобы изменить должности всех преподавателей на
доцента можно ввести команду:
UPDATE Teacher SET
Teach_POSITION = ‘доцент’
Аналогично команде DELETE, команда UPDATE может использовать
условия для выбора записей, подлежащих изменению. Вот так можно
изменить размер стипендии студента (код студента 30102):
UPDATE Students
SET Stud_STIP = 2000
WHERE Stud_ID = 30102
В предложении SET можно указывать несколько столбцов, разделяя их
запятыми.
21
3 Лабораторная работа № 3 Запросы к базе данных
22
Выбранные строки и столбцы таблиц базы данных всегда собираются во
временную таблицу. В большинстве случаев эта таблица существует ровно
столько времени, сколько нужно, чтобы данные были переданы
запрашивающему их клиенту.
Столбцы таблицы можно отобразить в отличном от первоначального
порядке:
SELECT Stud_ID, Stud_ADDRESS, Stud_FAM, Stud_IMA
FROM Students
Возможность изменения порядка отображения столбцов таблицы базы
данных соответствует характеристикам реляционной базы данных, поскольку
доступ к информации реляционной базы данных не зависит от реального
способа хранения информации. Можно отображать один и тот же столбец
таблицы в нескольких местах. Это удобно при необходимости улучшить
восприятие таблицы.
DISTINCT - аргумент, который обеспечивает устранение двойных
значений в команде SELECT. Предположим, необходимо узнать, какие
студенты в настоящий момент имеют хотя бы по одной оценке (сами оценки
пока не нужны, нужен только список кодов студентов):
SELECT Stud_ID
FROM Progress
При выполнении этой команды, коды дублируются (некоторые студенты
имеют по несколько оценок). Для получения списка без дубликатов надо
ввести:
SELECT DISTINCT Stud_ID
FROM Progress
DISTINCT может указываться только один раз в команде SELECT. Если
выбираются несколько столбцов, то DISTINCT опускает строки, где все
выбранные поля идентичны. Строки, в которых некоторые значения
одинаковы, а некоторые различны - будут сохранены.
Если вместо DISTINCT указать ALL, это будет иметь противоположный
эффект, дублирование строк сохранится. Поскольку это тот же самый случай,
когда не указывается никакой аргумент, то ALL по существу лишь
пояснительный аргумент.
Ограничение строк таблицы. Таблицы имеют тенденцию становиться
очень большими. Поскольку обычно только некоторые их них интересуют
Вас в данное время, имеется возможность устанавливать критерии, чтобы
определить какие строки будут выбраны. Для этого используется ключевое
слово WHERE - предложение команды SELECT, позволяющее задавать
условие, которое может быть верным или неверным для любой строки
таблицы. Команда извлекает только те строки из таблицы, для которых это
условие верно. Синтаксис предложения WHERE:
23
Инструкция SELECT с предложением WHERE сужает результирующий
набор запроса. Она может возвратить всего одну строку или даже вообще не
возвратить ничего, если строки, совпадающие с указанным в инструкции
критерием, не найдены. Предположим, необходимо получить имена и
фамилии всех студентов с отчеством “Николаевич”.
SELECT Stud_FAM, Stud_IMA
FROM Students
WHERE Stud_OTCH = ' Николаевич '
Когда в запросе имеется предложение WHERE, SQL Server
просматривает всю таблицу построчно и исследует каждую строку, чтобы
определить верно ли утверждение.
Примечание: Строковые константы типа 'Москва' в Transact-SQL
ограничиваются либо апострофами ', либо кавычками ".
Теперь попробуем построить запрос с числовым полем в
предложении WHERE. Выберем всех студентов со стипендией 1200:
SELECT *
FROM Students
WHERE Stud_STIP = 1200
24
Параметры ASC (ascending) – по возрастанию, DESC (descending) – по
убыванию задают порядок сортировки.
26
• знак процента % - замещает последовательность любого числа
символов.
Например, '%м%р' будет соответствовать 'компьютер' и 'омар'.
Давайте выберем студентов, чьи имена начинаются с буквы 'О':
SELECT *
FROM Students
WHERE Stud_IMA LIKE 'О%'
LIKE удобен при поиске значений - можно использовать ту часть
значения, которую помните.
Часто необходимо различать строки, содержащие значения NULL в
каком-либо столбце. Так как NULL указывает на отсутствие значения, для
сравнненя с NULL существует специальный оператор - IS NULL. Выберем из
нашей базы студентов с NULL значениями в столбце Stud_STIP:
SELECT *
FROM Students
WHERE Stud_STIP IS NULL
27
количество уникальных значений в колонке Stud_ID таблицы Progress. Если
опустить его, результат изменится.
Чтобы подсчитать общее число строк в таблице используйте функцию
COUNT со звездочкой вместо имени поля:
SELECT COUNT (*)
FROM Students
Предложение GROUP BY позволяет задавать Вам подмножество
значений, для которых применяется агрегатная функция. Это дает
возможность объединять поля и агрегатные функции в одном предложении
SELECT. Предположим, что надо найти номера студентов с минимальной
оценкой из ведомости успеваемости:
SELECT Stud_ID, MIN(ocenka )
FROM Progress
GROUP BY Stud_ID
Чтобы названия столбцов были осмысленными, измените предыдущую
инструкцию следующим образом (примените псевдонимы для столбцов):
SELECT Stud_ID, MIN(ocenka) AS MIN_OCENKA
FROM Progress
GROUP BY Stud_ID
GROUP BY применяет агрегатные функции к группам записей. Условие
формирования группы - одинаковое значение поля (в данном случае Stud_ID).
GROUP BY можно использовать с несколькими полями. Усложним
предыдущий запрос:
SELECT Stud_ID, Pr_Date, MAX(ocenka )
FROM Progress
GROUP BY Stud_ID, Pr_DATE
28
То есть мы выбираем строки с номерами студентов и максимальные
оценки, полученные ими на каждую дату. Дни, в которые не было оценок, не
будут показаны.
Ключевое слово HAVING используется в операторе SELECT вместе с
ключевым словом GROUP BY, чтобы указать какие из групп должны быть
представлены в выводе. Для GROUP BY ключевое слово HAVING играет ту же
роль, что и WHERE для.ORDER BY.
Предположим, что мы хотим получить максимальную оценку каждого
студента, которая больше 4. Для достижения такого эффекта применяется
предложение HAVING, которое определяет критерий, используемый для
удаления групп из результата запроса, как это делает предложение WHERE
для отдельных строк:
SELECT Stud_ID, Pr_DATE, MAX (ocenka )
FROM Progress
GROUP BY Stud_ID, Pr_DATE
HAVING MAX (ocenka ) > 4
Агрегатные функции позволяют не просто выбирать определенные
значения из базы, но и производить их обобщение и анализ.
29
Выполните поиск информации в отдельных таблицах:
3.4.1 Список преподавателей с указанием их должностей в алфавитном
порядке.
3.4.2 Названия кафедр с фамилиями заведующих.
3.4.3 Список студентов с различными фамилиями, обучающихся в
первой группе (предполагается, что в этой группе есть однофамильцы).
3.4.4 Список студентов, у которых стипендия больше 2000.
3.4.5 Список студентов, проживающих в Астане и Караганде.
3.4.6 Список студентов второй группы, у которых нет стипендии.
3.4.7 Список студентов третьей группы, фамилии которых начинаются
на букву «А».
3.4.8 Список студентов, которые родились в 1986 году.
3.4.9 Посчитайте суммарную стипендию студентов третьей группы.
3.4.10 Посчитайте среднее число лекционных часов по всем предметам.
3.4.11 Сколько студентов введено в базу данных?
3.4.12 Выведите всю информацию о предметах.
3.4.13 Список студентов, которые не проживают в Алматы.
3.4.14 Список студентов, чьи дни рождения в мае.
3.4.15 Номера студентов с минимальной оценкой из ведомости
успеваемости.
3.4.16 Номера студентов с максимальной оценкой из ведомости
успеваемости.
30
именами каждого из стобцов указываются имена соответствующих таблиц.
Это называется подробным определением столбца в запросе. Подробные
определения требуются только для тех столбцов, которые присутствуют в
нескольких из указанных в запросе таблиц. Но в операторе обычно
указываются подробные определения для всех столбцов:
SELECT Teacher.Teach_FAM, Chair.Chair_NAME
FROM Teacher, Chair
WHERE Teacher.Chair_ID = Chair.Chair_ID
Этот оператор возвращает фамилии преподавателей и названия кафедр,
на которых они работают. Номер преподавателя присутствует в обеих
таблицах, имена двух столбцов таблиц рассматриваются как эквивалентные
(что задается равенством).
В следующем запросе столбец Chair_ID имеется в обеих таблицах, но
извлекается только из таблицы Teacher, так как во второй таблице
соответствующий столбец содержит точно такую же информацию.
SELECT Teacher.*, Chair.Chair_NAME
FROM Teacher, Chair
WHERE Teacher.Chair_ID = Chair.Chair_ID
31
SQL Server проверяет каждую комбинацию строк двух таблиц и
проверяет их на условие, указанное в предложении WHERE. Если эта
комбинация удовлетворяет ему, то она выводится.
Предположим, что мы хотим найти всех студентов, сдавших хорошо
преподавателю Серикову. Для этого требуется связать четыре таблицы:
32
подзапрос не вернет никакого значения, то основной запрос не выведет
никаких значений.
Если Вы хотите использовать подзапрос, который возвращает
несколько строк, то необходимо использовать оператор IN. Например, если в
базе несколько студентов с фамилией Сидоров и все имеют оценки:
SELECT *
FROM Progress
WHERE Stud_ID IN (
SELECT Stud_ID
FROM Students
WHERE Stud_FAM = 'Сидоров' )
Найдем все оценки для предмета Информатика:
SELECT *
FROM Progress
WHERE Subj_ID IN (
SELECT Subj_ID
FROM Subject
WHERE Subj_NAME = 'Информатика' )
Этот результат можно получить и с помощью объединения:
SELECT Progress.*
FROM Subject, Progress
WHERE Subject.Subj_ID = Progress.Subj_ID AND
Subject.Subj_NAME = 'Информатика'
SELECT *
FROM Students C
WHERE '2004-06-03' IN (
SELECT Pr_DATE
FROM Progress O
WHERE O.Stud_ID = C.Stud_ID )
Можно было бы использовать объединение следующего вида:
SELECT C.*
FROM Students C, Progress O
WHERE C.Stud_ID = O.Stud_ID AND
O. Pr_DATE = '2004.06.03'
34
Использование операторов ANY, ALL. Рассмотрим новый способ
поиска студента, сдавшего экзамен:
SELECT *
FROM Students
WHERE Stud_ID = ANY (
SELECT Stud_ID
FROM Progress )
Оператор ANY берет все значения, выведенные подзапросом, и
оценивает их как верные, если любое из них равняется значению в текущей
строке внешнего запроса. Это означает, что подзапрос должен выбирать
значения такого же типа как и те, которые сравниваются в основном условии.
В приведенном выше запросе можно было бы использовать оператор
IN. Однако оператор ANY можно применять не только с оператором равенства.
Оператор ALL считает условие верным, если каждое значение,
выбранное подзапросом, удовлетворяет условию внешнего запроса. Выберем
тех студентов, у которых стипендия выше 1500:
SELECT *
FROM Students
WHERE Stud_STIP > ALL(
SELECT Stud_stip
FROM Students
WHERE Stud_STIP = 1500 )
Использование команды UNION. Команда UNION объединяет вывод
нескольких запросов с исключением повторяющихся строк. Например,
приведенный ниже запрос выводит всех студентов и преподавателей, чьи
фамилии размещены между буквами К и С:
SELECT Stud_FAM
FROM Students
WHERE Stud_FAM BETWEEN 'К' AND 'С'
UNION
SELECT Teach_FAM
FROM Teacher
WHERE Teach_FAM BETWEEN 'К' AND 'С' Для
применения команды UNION существует 2 правила:
• число и порядок следования колонок должны быть одинаковы во всех
запросах
• типы данных должны быть совместимы
35
SELECT Stud_FAM
FROM Students
UNION ALL
SELECT Teach_FAM FROM Teacher
38
CREATE PROCEDURE old_course
AS
UPDATE GRUPPA
SET Grup_COURSE = Grup_COURSE -1
EXEC old_course
SELECT *
FROM GRUPPA
5.2 Триггеры
Триггер – это откомпилированная процедура, используемая для
выполнения действий, инициируемых происходящими в базе данных
событиями. Триггер представляет собой сохраненную в базе данных
процедуру, которая запускается тогда, когда в отношении таблицы
выполняются определенные действия. Триггер может выполняться до или
после операторов INSERT, UPDATE или DELETE. Наиболее распространенное
применение триггеров – это проверка сложных критериев в базе данных.
Триггер - особый инструмент SQL-сервера, поддерживающий целостность
данных в БД .
Рассмотрим пример. Определим триггер tri_ins_progress для таблицы
Progress, который будет запускаться каждый раз, когда запись вставляется в
39
таблицу Progress или модифицируется. Если экзамен или зачет сданы не в
срок (например, после 15-го числа месяца), то запись не принимается.
Для создания триггера с помощью утилиты SQL Server Enterprise
Manager необходимо выбрать таблицу Progress в списке объектов базы
данных, после чего выполнить команду контекстного меню Аll tasks (Все
задачи) - Manage Triggers. Эти действия приведут к открытию диалогового
окна свойств триггера. Введите в это окно следующий текст:
41
6.1.4 В следующем окне задаем имя альяса (например, My_Application),
описание и тип сервера (рисунок 3).
6.1.5 В одном из следующих окон выбирается из выпадающего списка
источник данных – например, education (рисунок 4), язык, используемый для
сообщений (Russian).
42
Рисунок 4 - Выбор источника данных
43
экране появится диалоговое окно ввода запроса. Щелкните на ОК.
Произойдет подключение к базе данных и в таблице появятся строки.
Верните значение Active:= false для компонента Query1.
6.2.5 Добавьте в нижнюю часть формы две кнопки (Button из раздела
Standard). Установите свойства:
Caption для Button1 – Подключиться
Caption для Button2 – Выход
6.2.6 Напишите методы-обработчики события OnClick для кнопок.
Щелкните дважды на кнопке Button1 и отредактируйте ее метод OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Active::=true;
Button1.Enabled:=false;
end;
Метод кнопки Button2 (эта кнопка закрывает приложение): procedure
TForm1.Button1Click(Sender: TObject); begin
Работа с данными
6.2.11 Запустите свое приложение. Для перехода к режиму
редактирования установите курсор в редактируемой позиции и нажмите
44
любую клавишу. Отредактируйте какие-нибудь записи.
6.2.12 Реализуем программно удаление записей. Поместите на форму
кнопку Button3 с надписью «Удалить». Создайте обработчик нажатия этой
кнопки:
procedure TForm1.Button3Click(Sender:TObject);
begin
Query1.Delete;
end;
6.2.13 Перед удалением записи должно появляться предупреждающее
сообщение. Поэтому добавьте обработчик события BeforeDelete (это свойство
компонента SQL на вкладке EVENTS):
procedure TForm1.Query1BeforeDelete(DataSet:DataSet);
begin
if not (MessageDlg(‘Удалить запись?’,
mtError, [mbYes,mbNo],0) = mrYes) then
begin
Abort;
end;
end;
6.2.14 Разместите в нижней части формы элемент TPageControl (из
раздела Win32). На одной из страниц этого элемента поместим элементы
поиска, на другой – справочную информацию о разработчике программы.
Отредактируйте размеры компонента.
6.2.15 Для создания страниц компонента щелкните по нему правой
кнопкой мыши и выберите пункт «New Page” контекстного меню Проставьте
свойства Caption для TabSheet1 – «Поиск», для TabSheet2 – «Справка».
6.2.16 Разместите на странице «Поиск» компоненты TLabel, TEdit,
TButton со следующими свойствами:
Caption для Label1 – Фамилия;
Caption для Button4 – Найти;
Text для Edit1 - пусто.
Создайте обработчик для кнопки Button4:
procedure TForm1.Button4Click(Sender: TObject);
begin
Query1.Locate('Stud_FAM',Edit1.text,[loPartialkey, loCaseInsensitive]);
end;
При нажатии этой кнопки будет происходить поиск записи с фамилией,
начинающейся со строки, введенной в поле Edit1.
6.2.17 У нас запись в базе данных находится даже по части введенного
текста и без учета регистра введенных букв. Изменим поведение функции
поиска. Добавим на форму два компонента TCheckBox (переключатели) с
подписями «По части строки» и «Без регистра».
Изменим обработчик для Button4 следующим образом:
45
procedure TForm1.Button4Click(Sender: TObject);
var LocOpts:TLocateOptions;
begin
LocOpts:=[ ];
if CheckBox1.Checked then LocOpts:= LocOpts+[loPartialKey];
if CheckBox2.Checked then LocOpts:= LocOpts+[loCaseInsensitive];
Query1.Locate (‘Stud_FAM’ Edit1.Text, LocOpts);
end;
Теперь работа функции поиска будет меняться в зависимости от
поставленных пользователем «птичек».
6.2.18 Усовершенствуем программу, чтобы поиск выполнялся по
нескольким полям таблицы, например, еще и по имени. Добавьте поля TEdit,
TLabel. Измените подписи полей и обработчик кнопки Button4:
47
(заполнение таблиц данными); выполнение запросов к базе данных;
результаты выполнения этих команд;
- описание возможностей приложения в Delphi с распечаткой текстов
модулей.
7.9 Студент сдает преподавателю пояснительную записку и
выполненную работу (на дискете).
7.10 После проверки пояснительной записки преподавателем студент
допускается к защите своего проекта. Защита работы предусматривает
демонстрацию работы приложения, ответы на контрольные вопросы.
СПИСОК ЛИТЕРАТУРЫ
1. Хансен Г., Хансен Д. Базы данных: разработка и управление. –
М.: ЗАО «Издательство БИНОМ», 1999.
2. Тихомиров Ю. Microsoft SQL Server 7.0 – СПб.: Издательство
«Питер», 1999.
3. Плю Р., Стефенс Р., Райан К. Освой самостоятельно SQL за 24 часа. –
М.: Издательский дом «Вильямс», 2000.
4. Кандзюба С.П., Громов В.Н. Delphi 6/7. Базы данных и приложения.
– СПб: ООО «ДиаСофт», 2002.
5. Бобровский С. Delphi 5: учебный курс. – СПб: Издательство «Питер»,
2000.
Сводный план 2004 г., поз. 18
Редактор Н.М.Голева
48
Подписано к печати _________ Формат 60х84 1/16
Тираж 50 экз. Бумага типографская №1
Объем 3.0 уч.-изд.л. Заказ Цена тг.
Копировально-множительное бюро
Алматинского института энергетики и связи
480013 Алматы, ул. Байтурсынова, 126
49