- •Добряк Павел Вадимович управление данными
- •Управление данными
- • Угту-упи, 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.4. Запросы к нескольким таблицам
Вывести номера и имена продавцов и соответствующих им заказчиков, если они живут в одном городе (запрос приведен на Лист. 24, результат - Табл. 36):
Лист. 24. Запрос на соединение трех таблиц
SELECT DISTINCT Сделки.N_Продавца, Продавцы.Имя, Сделки.N_Покупателя, Покупатели.Имя
FROM Сделки, Продавцы, Покупатели
WHERE Сделки.N_Продавца = Продавцы.N
AND Сделки.N_Покупателя = Покупатели.N
AND Продавцы.Город = Покупатели.Город;
Табл. 36. Результат запроса на соединение трех таблиц
19 Соединение 3х таблиц |
|||
N_Продавца |
Продавцы.Имя |
N_Покупателя |
Покупатели.Имя |
1 |
Иванов |
2 |
Андреев |
3 |
Сидоров |
3 |
Сергеев |
Вывести номера и имена продавцов и имена соответствующих им начальников (запрос приведен на Лист. 25, результат -Табл. 37):
Лист. 25. Запрос с псевдонимами к таблице с рекурсивной связью
SELECT А.N, A.Имя, B.Имя
FROM Продавцы А, Продавцы B
WHERE A.N_Начальника = B.N;
Табл. 37. Результат запроса с псевдонимами к таблице с рекурсивной связью
20 Псевдонимы по рекурсии |
||
N |
А.Имя |
B.Имя |
1 |
Иванов |
Иванов |
2 |
Петров |
Иванов |
3 |
Сидоров |
Иванов |
4 |
Шмидт |
Петров |
5 |
Зайцев |
Петров |
Ошибка №8. Необходимость в псевдонимах к одной таблице для начинающих программистов не всегда ясна. Нужно смотреть по тексту задания, в каких смыслах упоминается одна и та же таблица. Так, в этом запросе в явном виде написана таблица продавцы и упоминаются начальники (которые фактически тоже хранятся в таблице продавцы). Таким образом, таблица «Продавцы» должна два раза встретиться в запросе под двумя псевдонимами. Мы фактически создаем две копии одной таблицы и работаем с ними, как будто это разные таблицы.
Вывести имена тех продавцов, которые продавали клиентам Иванова (запрос приведен на Лист. 26, результат - Табл. 38):
Лист. 26. Запрос с псевдонимами к одной таблице
SELECT DISTINCT B.Имя
FROM Продавцы AS А, Продавцы AS B, Сделки AS C, Сделки AS D
WHERE А.Имя='Иванов' And B.Имя<>'Иванов' And А.N=C.N_Продавца And B.N=D.N_Продавца And C.N_Покупателя=D.N_Покупателя;
Табл. 38. Результат запроса с псевдонимами к одной таблице
21 Псевдонимы по одной связи |
Имя |
Петров |
Вывести пары продавцов, у которых были общие клиенты (запрос приведен на Лист. 27, результат - Табл. 39):
Лист. 27. Запрос №2 с псевдонимами к одной таблице
SELECT DISTINCT А.Имя, B.Имя
FROM Продавцы AS А, Продавцы AS B, Сделки AS C, Сделки AS D
WHERE А.Имя<>B.Имя And А.N=C.N_Продавца And B.N=D.N_Продавца And C.N_Покупателя=D.N_Покупателя;
Табл. 39. Результат запроса №2 с псевдонимами к одной таблице
22 Псевдонимы по одной связи 2 |
|
А.Имя |
B.Имя |
Иванов |
Петров |
Петров |
Иванов |
Вывести все товары и даты, в которые эти товары продавались; в случае, если товар не продавался ни разу, вывести пустое место (запрос приведен на Лист. 28, результат - Табл. 40).
Лист. 28. Запрос с оператором Left Join
SELECT Товары. Название, Сделки.Дата
FROM Товары LEFT JOIN Сделки
ON Товары.N = Сделки.N_Товара
Табл. 40. Результат запроса с оператором Left Join
23 Left join |
|
Название |
Дата |
Шило |
02.01.2009 |
Шило |
01.01.2009 |
Мыло |
01.01.2009 |
Мыло |
01.01.2009 |
Мыло |
01.01.2009 |
Яблоко |
|
Вывести все названия товаров с количеством товара на складе больше 15 и их суммарное проданное количество, отсортировав по суммарному проданному количеству место (запрос приведен на Лист. 29, результат - Табл. 1). В этом запросе таблицы соединяются с помощью левого соединения, затем идет фильтрация с помощью where. Дополнительную трудность в понимании создают атрибуты из разных таблиц с одинаковым названием – «количество».
Лист. 29. Запрос с операторами Left Join, Where, Group By, Order By
SELECT Товары.Название, sum(Сделки.Количество) AS суммарное_количество
FROM Товары LEFT JOIN Сделки ON Товары.N=Сделки.N_Товара
GROUP BY Товары.Название
ORDER BY sum(Сделки.Количество);
Табл. 41 Результат запроса с операторами Left Join, Where, Group By, Order By
23A Left join Where Group by Order by |
|
Название |
суммарное_количество |
Яблоко |
|
Мыло |
70 |
Из запроса виден порядок операторов в языке SQL:
select
from
join
where
group by
having
order by
Аналогично работают другие виды соединений (см. Табл. 42).
Табл. 42. Описание различных видов соединений.
Соединение |
Оператор |
Описание |
Внутреннее |
Inner join ... on |
Соединяет записи из двух таблиц, если они удовлетворяют условию после on. Аналогично таблицы можно соединять с помощью where |
Левое |
Left join ... on |
Соединяет записи из двух таблиц, если они удовлетворяют условию после on. При этом, если некоторым записям в левой таблице нет соответствия в правой, они выводятся с пустыми значениями справа. |
Правое |
Right join ... on |
Соединяет записи из двух таблиц, если они удовлетворяют условию после on. При этом, если некоторым записям в правой таблице нет соответствия в левой, они выводятся с пустыми значениями слева. |
Полное |
Full join ... on |
Соединяет записи из двух таблиц, если они удовлетворяют условию после on. При этом, если некоторым записям в таблицах нет соответствия в другой таблице, они выводятся с пустыми значениями в соответствующих полях. |
Ошибка №9. Тяжело опознать случаи, когда надо выводить все записи из одной таблицы, если остальные условия накладываются на другую таблицу (при этом записям в первой таблице может не быть соответствий во второй). Такие случаи можно увидеть, если в задании встречается слово «все».
