
- •Добряк Павел Вадимович управление данными
- •Управление данными
- • Угту-упи, 2012
- •Введение
- •1. Основные определения
- •1.1. Элементы баз данных
- •1.2. Технологии управления данными
- •1.3. Модели данных
- •2. Реляционная модель
- •2.1. Основные понятия реляционной модели
- •2.2. Нормализация
- •2.3. Проблемы проектирования реляционных баз данных
- •Задачи для самостоятельного решения
- •3. Реляционные алгебра и исчисления
- •3.1. Реляционная алгебра
- •3.2. Реляционное исчисление на кортежах
- •3.3. Реляционное исчисление на доменах
- •4.1. Введение в sql
- •4.2. Пример реляционной базы данных
- •4.3. Запросы к одной таблице
- •4.4. Запросы к нескольким таблицам
- •4.5. Вложенные запросы
- •4.6. Вложенные подзапросы и кванторы
- •4.7. Объединение однотипных запросов
- •4.8. Рекурсивные запросы
- •Объединение однотипных запросов.
- •Запросы для самостоятельного программирования
- •5. Olap и хранилища данных
- •5.1. Архитектура хранилищ данных
- •5.2. Аналитические запросы
- •6. Триггеры, хранимые процедуры, события
- •7. Транзакции
- •7.1. Функции транзакций
- •7.2. Уровни изолированности
- •7.3. Сериализация транзакций
- •7.4. Синхронизационный захват
- •7.5. Метод временных меток
- •8. Обзор перспективных направлений баз данных
- •9. Объектные технологии в субд
- •9.1. Три манифеста баз данных
- •9.2. Объектная модель sql
- •9.3. Модель данных odmg и язык oql
- •10. Запросы к интернет-страницам
- •10.1. Теговая парадигма
- •10.2. Язык запросов xQuery
- •11. Пространственные базы данных
- •12. Лабораторные работы
- •13. Курсовая работа
- •13.1. Концептуальное проектирование
- •13.2. Семантическое проектирование
- •13.3. Физическое проектирование. Реляционная модель данных
- •13.4. Запросы
- •Объединение однотипных запросов.
- •13.5. Интеллектуализация базы данных.
- •13.6. Клиентская часть информационной системы
- •13.7. Дополнительные элементы базы данных
- •Вопросы к экзамену
- •1. Основные определения.
- •2. Реляционная модель
- •3. Реляционные алгебра и исчисления
- •10. Запросы к интернет-страницам
- •11. Пространственные базы данных
- •Литература
- •Список иллюстраций список таблиц
- •Список листингов
- •Алфавитный указатель
- •Список сокращений
4.5. Вложенные запросы
Вывести номера продавцов, заключивших более одной сделки (запрос приведен на Лист. 30, результат - Табл. 43):
Лист. 30. Вложенный подзапрос в Where
SELECT distinct А.N_Продавца
FROM Сделки AS А
WHERE 1<(
SELECT count(*)
FROM Сделки B
WHERE B.N_Продавца=А.N_Продавца);
Табл. 43. Результат вложенного подзапроса в Where
24 Вложенный в Where |
N_Продавца |
1 |
Вывести номера продавцов и максимальную из средних стоимостей их сделок по дням. (запрос приведен на Лист. 31, результат – в Табл. 44):
Лист. 31. Вложенный подзапрос в From
SELECT N_Продавца, max(Средняя_стоимость)
FROM (SELECT N_Продавца, Дата, avg(Стоимость) AS Средняя_стоимость
FROM Сделки GROUP BY N_Продавца, Дата)
GROUP BY N_Продавца;
Табл. 44. Результат запроса с вложенным подзапросом в From
26 Вложенный в From |
|
N_Продавца |
Expr1001 |
1 |
360 |
2 |
840 |
3 |
550 |
Ошибка №10. Вложенные подзапросы помогают поэтапно конструировать запрос в сложных случаях, но злоупотреблять ими не стоит. Так, например, этот запрос легко делается с использованием Having без вложенного подзапроса. См. сравнение одинаковых по результату запросов в Табл. 45.
Табл. 45. Одинаковые по результату запросы с подзапросами и без
Запрос |
Комментарий |
SELECT N_Продавца, AVG(Стоимость) FROM Сделки GROUP BY N_Продавца HAVING AVG(Стоимость)>100; |
Обычный запрос с group by и having. |
SELECT N_Продавца, Средняя_стоимость FROM (Сделки N_Продавца, AVG(Стоимость) as Средняя_стоимость FROM Сделки GROUP BY N_Продавца) WHERE Средняя_стоимость > 100; |
Having нет, есть вложенный в from подзапрос с group by. |
SELECT A.N_Продавца FROM Сделки A WHERE 100 < (SELECT AVG(B.Стоимость) FROM Сделки B WHERE B.N_Продавца = А. N_Продавца); |
Нет having и group by, есть вложенный подзапрос в where и псевдонимы к одной таблице |
Вывести номера продавцов и разницу между средней стоимостью их сделок и средней стоимостью всех сделок (запрос приведен на Лист. 32, результат - Табл. 46):
Лист. 32. Вложенный подзапрос в Select
SELECT N_Продавца, avg(Стоимость) – (SELECT avg(стоимость) FROM Сделки)
FROM Сделки
GROUP BY N_Продавца;
Табл. 46. Результат запроса с вложенным подзапросом в Select
27 Вложенный в Select |
|
N_Продавца |
Разница_между_средними_стоимостями |
1 |
-140,666666666667 |
2 |
356 |
3 |
66 |
Вывести номера продавцов и среднюю стоимость их сделок, если средняя стоимость сделок этих продавцов больше средней стоимости по их отделу (запрос приведен на Лист. 33, результат - Табл. 47):
Лист. 33. Вложенный подзапрос в Having
SELECT B.Имя, avg(А.Стоимость)
FROM Сделки AS А, Продавцы AS B
WHERE А.N_Продавца=B.N
GROUP BY B.Отдел, А.N_Продавца, B.Имя
HAVING avg(А.Стоимость) > ( SELECT avg(C.Стоимость) FROM Сделки C, Продавцы D WHERE C.N_Продавца = D.N AND D.Отдел = B.Отдел);
Табл. 47 Результат запроса с вложенным подзапросом в Having
25 Вложенный в Having |
|
Имя |
Средняя_стоимость |
Сидоров |
550 |
Ошибка №11. Группу во внешнем запросе однозначно идентифицирует А.N_Продавца, но мы в операторе GROUP BY также привели поля из таблицы B. «B.Имя» необходимо вывести на экран, без его указания в GROUP BY его пришлось бы выводить с агрегирующей функцией. «B.Отдел» используется во вложенном подзапросе, поэтому без указания в GROUP BY его тоже пришлось бы приводить в подзапросе с агрегирующей функцией.