- •Раздел 1. Проектирование баз данных. 2
- •Раздел 2. Разработка приложений для работы с Базами Данных в среде Delphi. 25
- •Раздел 1. Проектирование баз данных.
- •1.1. Основы построения баз данных. Модели данных.
- •1.1.1. Реляционная модель данных.
- •1.1.2. Нормализация базы данных.
- •1.2. Проектирование базы данных методом “сущность-связь”.
- •Раздел 2. Разработка приложений для работы с Базами Данных в среде Delphi.
- •2.1. Технология создания информационной системы.
- •2.1.1.Создание таблиц базы данных в Database Desktop.
- •2.1.2. Целостность базы данных.
- •Программа bde Administrator и модули данных.
- •Компоненты доступа и работы с данными. Тема: Наборы данных. Состояние и режимы наборов данных.
- •Тема: Объекты поля. Операции с полями.
- •Тема. Отображение и выбор значения поля.
- •Тема. Визуальные компоненты отображения записей из набора данных.
- •Закладки.
- •Тема. Ограничения на вводимые значения.
- •Тема. Сортировка набора данных.
- •Тема. Операции с таблицей базы данных.
- •Тема. Фильтрация записей.
- •Тема. Поиск записей.
- •Тема. Модификация набора данных.
- •Тема. Работа с отчетами
- •Отчет для связанных наборов данных
- •Составной отчет
- •Модули данных
- •Конструктор отчетов Rave Report
- •Реляционный способ доступа к данным.
- •Основные сведения о языке sql.
- •Оператор выбора Select.
- •Агрегирование и группирование записей.
- •Объединение таблиц.
- •Вложенные запросы.
- •Модификация записей.
- •Примеры баз данных
Вложенные запросы.
В SQL-запросе можно использовать запросы, вложенные в первый. Это можно применить и к операторам, возвращающих совокупные характеристики, и к операторам, возвращающим множество значений.
Например,
Определить всех однофамильцев в таблицах Sotrudniki и Sotrudniki1, имеющих одинаковую структуру:
SELECT * FROM Sotrudniki
WHERE S_fio IN (SELECT S_fio FROM Sotrudniki1)
- вложенный оператор SELECT возвращает множество фамилий из таблицы Sotrudniki1, а конструкция WHERE основного оператора SELECT отбирает в таблице Sotrudniki те записи, которые имеются во множестве фамилий из таблицы Sotrudniki1.
Вывести из БД Sotrudniki фамилию (фамилии) самого молодого сотрудника:
SELECT S_Fio, EXTRACT(YEAR FROM S_Birthday)
FROM Sotrudniki
WHERE EXTRACT(YEAR FROM S_Birthday)=
(SELECT max(EXTRACT(YEAR FROM S_Birthday))
FROM Sotrudniki)
- вложенный оператор SELECT возвращает максимальный год рождения, который используется в условии WHERE основного оператора SELECT.
Вывести из БД Students все оценки конкретного студента, например, Петрова:
SELECT S_fam, P_nazv, E_mark FROM
Examination,Predm, Students
WHERE E_student=(SELECT S_code FROM Students
WHERE S_fam='Петров')
AND E_Predm=P_code AND E_Student=S_code
во вложенной конструкции SELECT определяется код студента по фамилии 'Петров', а последние условия обеспечивают исключение избыточности при внутреннем объединении таблиц.
Связанные подзапросы. Во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложении FROM внешнего запроса. Такой связанный подзапрос выполняется по одному разу для каждой строки таблицы основного запроса.
Например, получить сведения о предметах, по которым проводился экзамен конкретного числа, например, ‘10.01.2006’:
SELECT * FROM Predm PR
WHERE '14.01.2006' IN (SELECT E_date
FROM Examination
WHERE PR.P_code=E_predm)
Эту же задачу можно решить с помощью операции соединения таблиц:
SELECT DISTINCT P_nazv FROM Predm, Examination
WHERE P_code=E_predm AND E_date= '14.01.2006'
Пример. Вывести фамилию (фамилии) студента, получившего на экзамене оценку выше среднего балла
SELECT DISTINCT S_fam FROM Students, Examination
WHERE
E_mark>(SELECT AVG(E_mark) FROM Examination)
AND S_code=E_student
В условии WHERE при работе с множествами записей можно использовать ключевые слова ALL и ANY. ALL - условие выполняется для всех записей, ANY - условие выполняется хотя бы для одной записи.
Например,
вывести фамилии сотрудников из таблицы Sotrudniki, которые не старше любого сотрудника в таблице Sotrudniki1:
SELECT S_fio,S_birthday FROM Sotrudniki
WHERE S_birthday>= ALL (SELECT S_birthday
FROM Sotrudniki1)
вывести фамилии сотрудников из таблицы Sotrudniki, которые моложе хотя бы одного сотрудника в таблице Sotrudniki1:
SELECT S_fio,S_birthday FROM Sotrudniki
WHERE S_birthday> ANY (SELECT S_birthday FROM Sotrudniki1)
Во вложенных конструкциях SELECT можно использовать ключевое слово EXISTS, которое означает отбор только тех записей, для которых вложенный запрос возвращает одно или более значений.
Например,
SELECT S_fio,S_birthday FROM Sotrudniki S1
WHERE EXISTS (SELECT S_fio,S_birthday
FROM Sotrudniki S2
WHERE (S1.S_birthday=S2.S_birthday)
AND (S1.S_code!=S2.S_code))
- получение списка сотрудников, которые имеют хотя бы одного сверстника.
Примеры.
Написать запрос, выбирающий данные о фамилиях студентов, имеющих по предмету с идентификатором 2 балл ниже общего среднего балла.
SELECT DISTINCT S_fam
FROM Students, Examination
WHERE E_mark>(SELECT AVG(E_mark)
FROM Examination)
AND S_code=E_student AND E_predm=2
Написать запрос, выполняющий вывод количества предметов, по которым экзаменовался каждый студент, сдававший более 2-х предметов.
SELECT COUNT(E_predm)
FROM Examination
GROUP BY E_student
HAVING COUNT (E_predm)>2
предложение HAVING указывает только поля или выражения, которые на выходе имеют единственное значение для каждой выводимой группы.
!!! Предложение HAVING определяет критерий, по которому группы следует включать в выходные данные, по аналогии с предложением WHERE, которое осуществляет это для отдельных строк!!!
Написать запрос, который выполняет вывод а) среднего, б) минимального, в) максимального баллов всех студентов для каждой даты сдачи экзаменов и который представляет результаты в порядке убывания этих значений.
SELECT AVG(E_mark),E_date
FROM Examination
GROUP BY E_date
ORDER BY 1 DESC
SELECT MIN(E_mark),E_date
FROM Examination
GROUP BY E_date
ORDER BY 1 DESC
SELECT MAX(E_mark),E_date
FROM Examination
GROUP BY E_date
ORDER BY 1 DESC