- •Содержание
- •Глава 1 Концепция баз данных 6
- •Глава 2 Модели данных 12
- •Глава 3 Реляционная модель данных 24
- •Глава 4 Элементы языка sql 42
- •Глава 5 Проектирование баз данных 66
- •Глава 6 Функции субд и системы обработки транзакций 81
- •Глава 7 Технологии, модели и архитектура систем обработки данных 88
- •Глава 1 Концепция баз данных
- •1.1 Данные и эвм
- •1.2 Поколения субд и направления исследований
- •1.3 Терминология в субд
- •1.4 Вопросы для самоконтроля к главе 1
- •Глава 2 Модели данных
- •2.1. Классификация моделей данных
- •2.2 Основные особенности систем, основанных на инвертированных списках
- •2.2.1 Структуры данных
- •2.2.2 Манипулирование данными
- •2.2.3 Ограничения целостности
- •2.3 Иерархические модели
- •2.3.1. Иерархические структуры данных
- •2.3.2 Манипулирование данными
- •2.3.3 Ограничения целостности
- •2.4 Сетевые модели
- •2.4.1 Сетевые структуры данных
- •2.4.2 Манипулирование данными
- •2.4.3 Ограничения целостности
- •2.5 Физические модели организации баз данных
- •Файловые структуры, используемые для хранения данных в бд
- •Модели страничной организации данных в современных бд
- •Этапы доступа к бд
- •Вопросы и упражнения для самоконтроля к главе 2
- •Глава 3 Реляционная модель данных
- •3.1 Базовые понятия реляционных баз данных
- •3.1.1. Тип данных
- •3.1.2. Домен
- •3.1.3 Схема отношения, схема базы данных
- •3.1.4 Кортеж, отношение, ключи
- •3.1.5 Связи в реляционных базах данных
- •3.2 Фундаментальные свойства отношений
- •3.2.1 Отсутствие кортежей-дубликатов
- •3.2.2 Отсутствие упорядоченности кортежей
- •3.2.3 Отсутствие упорядоченности атрибутов
- •3.2.4 Атомарность значений атрибутов
- •3.3. Характеристика реляционной модели данных
- •3.4 Трехзначная логика (3vl)
- •3.5 Реляционная алгебра
- •Эквисоединение. Наиболее важным частным случаем -соединения является случай, когда есть просто равенство. Синтаксис эквисоединения:
- •3.6 Особенности операций реляционной алгебры
- •Реляционное исчисление
- •Вопросы и упражнения для самоконтроля к главе 3
- •Глава 4 Элементы языка sql
- •4.1 История языка sql
- •4.2 Структура языка sql
- •Ddl (Data Definition Language) - операторы определения объектов базы данных:
- •Dml (Data Manipulation Language) - операторы манипулирования данными:
- •Dcl (Data Control Language) - операторы контроля данных, защиты и управления данными:
- •4.3 Создание запроса с помощью оператора select
- •4.3.1 Создание простых запросов
- •4.3.2. Агрегирование данных в запросах
- •4.3.3 Формирование запросов на основе соединения таблиц
- •4.3.4 Формирование структур вложенных запросов
- •Простые подзапросы
- •4.3.4.2 Соотнесенные (коррелированные) подзапросы
- •Запросы с использованием кванторов
- •4.3.5 Объединение нескольких запросов в один
- •4.3.6 Синтаксис оператора select
- •4.4 Операторы манипулирования данных
- •4.4.1 Оператор удаления данных delete
- •4.4.2 Оператор вставки данных insert
- •4.4.3 Оператор обновления данных update
- •Операторы определения объектов базы данных
- •4.5.1 Операторы определения таблицы
- •4.5.2 Оператор определения представлений create view
- •Операторы контроля данных, защиты и управления данными
- •4.6.1 Операторы управления привилегиями
- •4.6.2 Операторы управления транзакциями
- •4.6.3 Проблемы параллельной работы транзакций
- •Вопросы и упражнения для самоконтроля к главе 4
- •Глава 5 Проектирование баз данных
- •5.1 Проектирование реляционных бд с использованием принципов нормализации
- •Проектирование реляционных бд с использованием семантических моделей
- •5.2.1 Применение семантических моделей при проектировании
- •5.2.2. Основные понятия модели Entity-Relationship
- •5.2.3 Пример разработки простой er-модели
- •Практические рекомендации по проектированию бд
- •Вопросы и упражнения для самоконтроля к главе 5
- •Глава 6 Функции субд и системы обработки транзакций
- •6.1 Основные функции субд
- •1.Непосредственное управление данными во внешней памяти
- •2. Управление буферами оперативной памяти
- •3. Управление транзакциями
- •4. Журнализация
- •5. Поддержка языков бд
- •Системы обработки транзакций
- •6.2.1 Oltp-системы
- •6.2.2 Olap -системы
- •6.2.3 Мониторы транзакций
- •Архитектура субд
- •6.4 Пользователи бд
- •6.4 Вопросы и упражнения для самоконтроля по главе 6
- •Глава 7 Технологии, модели и архитектура систем обработки данных
- •7.1 Технологии и модели архитектуры «клиент-сервер»
- •7.2 Распределенная обработка данных
- •Аспекты сетевого взаимодействия
- •Технология распределенной бд (технология star)
- •Технология тиражирования данных
- •7.3 Концепция активного сервера в модели dbs
- •7.4 Вопросы и упражнения для самоконтроля к главе 7
- •Литература
4.3.3 Формирование запросов на основе соединения таблиц
Очевидно, что с помощью соединения несложно сформировать запрос на обработку данных из нескольких таблиц. Кроме того, в такой запрос можно включить любые части предложения SELECT, рассмотренные ранее (выражения с использованием функций, группирование с отбором указанных групп и упорядочением полученного результата). Следовательно, соединения позволяют обрабатывать множество взаимосвязанных таблиц как единую таблицу, в которой собрана информация о нескольких сущностей. Различные виды реляционной операции соединения были рассмотрены в п.3.5. В этом пункте остановимся на следующих видах соединений:
эквисоединение (по равенству полей)
соединение через справочную целостность;
соединение таблицы с собой (рекурсия);
внешнее соединение.
Полное имя столбца таблицы фактически состоит из имени таблицы, сопровождаемого точкой и затем имени столбца, например: Продавцы.snum , Продавцы.city, Порядки.odate
Ранее мы могли опускать имена таблиц при указании столбцов, потому что запрашивали только одну таблицу одновременно, а SQL достаточно интеллектуален, чтобы присвоить соответствующий префикс имени таблицы. Даже, если запрос включает несколько таблиц, еще можно опускать имена таблиц, если все столбцы имеют различные имена. Но это не всегда так бывает. Например, если в одном запросе использованы два столбца city, то нужно указать их с именами Продавцы.city или Заказчики.city, чтобы SQL мог их различать.
Пример 4.22 Предположим, что необходимо поставить в соответствии каждому продавцу его заказчиков в том городе, в котором они живут:
SELECT Заказчики.cname, Продавцы.sname, Продавцы.city FROM Продавцы, Заказчики WHERE Продавцы.city = Заказчики.city;
Результат запроса:
cname cname city
Хофман Пил Лондон
Клеменс Пил Лондон
Луи Серенс Мехико
Киснерос Серенс Мехико
Хофман Мотика Лондон
Клеменс Мотика Лондон
Алгоритм выполнения запроса в примере 4.22:
вычисляется декартово произведение, получаем 35 строк (5х7);
производится выборка из полученной таблицы только тех строк, для которых выполняется условие Продавцы.city = Заказчики.city;
из полученной на шаге 2 таблицы выбираются только 3 указанных столбца (проекция).
В этом запросе использовалось эквисоединение.
Пример 4.23 Показать для каждого продавца имена всех заказчиков, которых он обслуживают: SELECT Заказчики.cname, Продавцы.sname FROM Продавцы, Заказчики
WHERE Продавцы.snum = Заказчики.snum;
В этом примере использовано соединение таблиц через справочную целостность, поскольку поле snum в таблице Продавцы является первичным ключом, а в таблице Заказчики – внешним ключом.
Можно создавать запросы, использующие соединение более чем двух таблиц.
Пример 4.24 Предположим, что нужно найти все порядки заказчиков, не находящихся в тех городах, где живут их продавцы. Для этого необходимо связать все три таблицы:
SELECT onum, cname, Порядки.cnum, Порядки.snum FROM Продавцы, Заказчики, Порядки WHERE Заказчики.city < > Продавцы.city AND Порядки.cnum = Заказчики.cnum
AND Порядки.snum = Продавцы.snum;
Результат вывода:
onum cname cnum snum
------ ------- ----- -----
3001 Киснерос 2008 1007
3002 Перера 2007 1004
3006 Джованни 2002 1003
3007 Грасс 2004 1002
3010 Грасс 2004 1002
В запросе таблица может соединяться сама с собой. В этом случае для экземпляров таблицы задаются псевдонимы, которые определяются в предложении FROM после имени таблицы.
Пример 4.25 Найти все пары заказчиков с одинаковым рейтингом:
SELECT a.cname, b.cname, a.rating FROM Заказчики a, Заказчики b WHERE a.rating = b.rating;
Результат запроса:
cname cname rating
Хофман Хофман 100
Хофман Клеменс 100
Хофман Перера 100
Джованни Джованни 200
Джованни Луи 200
Луи Джованни 200
Луи Луи 200
Грасс Грасс 300
Грасс Киснерос 300
Клеменс Хофман 100
Клеменс Клеменс 100
Клеменс Перера 100
Киснерос Грасс 300
Киснерос Киснерос 300
Перера Хофман 100
Перера Клеменс 100
Перера Перера 100
Обратите внимание на избыточность в выводе: каждая комбинация заказчиков выведена дважды; выводится комбинация строки сама с собой. Для устранения избыточности необходимо добавить еще одно условие в предикат, чтобы сделать предикат ассиметричным, и те же самые значения в обратном порядке не будут выбираться снова, например:
Пример 4.26 SELECT a.cname, b.cname, a.rating FROM Заказчики a, Заказчики b WHERE a.rating = b.rating AND a.cname < b.cname;
Вывод в этом случае будет содержать только 5 строк.
В Access для соединения таблиц используется фраза JOIN. К их числу относится операция внутреннего соединения (INNER JOIN) и операции внешнего соединения (LEFT JOIN и RIGHT JOIN). Эти операции могут использоваться в любом предложении FROM. Операция INNER JOIN объединяет записи из двух таблиц, если связывающие поля содержат одинаковые значения. LEFT JOIN выбирает все записи из левой таблицы, даже. Если в правой таблице нет совпадающих значений. Это относится и к операции RIGHT JOIN, только все записи выбираются из правой таблицы
Синтаксис предложения FROM:
FROM таблица_1 [INNER | LEFT| RIGHT | JOIN таблица_2 ON таблица_1.поле_1 оператор таблица_2.поле_2],
где таблица_1, таблица_2 – имена таблиц, которые подлежат соединению;
поле_1, поле_2 – имена полей, используемые для связи;
оператор – чаще всего «=».