- •1 Основные понятия и определения
- •1.1Информационные системы и банки данных
- •1.2Назначение и основные компоненты банка данных
- •1.3Трех уровневая архитектура абстракций базы данных.
- •1.4Физическая и логическая независимость данных
- •1.5Администратор базы данных
- •1.6Системы управления базами данных
- •1.7Схема обмена данными при работе с базой данных
- •1.8Локальные информационные системы
- •1.9Информационные системы в сетях
- •2Модели данных концептуального уровня
- •2.1Иерархическая модель данных
- •2.2Сетевая модель
- •2.3Реляционная модель
- •2.4Постреляционная модель
- •2.5Многомерная модель
- •2.6Объектно-ориентированная модель
- •3Физические модели баз данных
- •3.1Файловые структуры, используемые в базах данных
- •3.2 Хешированные файлы
- •3.2.1Стратегия разрешения коллизий с областью переполнения
- •3.2.2Организация стратегии свободного замещения
- •3.3Индексные файлы
- •3.3.1Файлы с плотным индексом, или индексно-прямые файлы
- •3.3.2Файлы с неплотным индексом, или индексно-последовательные файлы
- •3.3.3Организация индексов в виде b-tree (в-деревьев)
- •3.4Моделирование отношений «один-ко-многим» на файловых структурах
- •3.5Инвертированные списки
- •3.6Модели бесфайловой организации данных
- •4Реляционная модель данных
- •4.1Основные определения
- •4.2Соглашения об отношениях в реляционных системах
- •4.3Классы отношений
- •4.3.1Классы отношений с точки зрения способов создания и хранения
- •4.3.2Классификация отношений с точки зрения их содержания
- •4.4Операции реляционной алгебры
- •4.4.1Основные понятия
- •4.4.2Базовые теоретико-множественные операции
- •4.4.3Специальные операции реляционной алгебры
- •4.4.4Связи между отношениями (таблицами)
- •4.5Реляционное исчисление
- •4.6Язык запросов по образцу qbe
- •4.7Структурированный язык запросов sql
- •4.7.1История развития sql
- •4.7.2Общая характеристика языка
- •4.7.3Структура sql
- •4.7.4Оператор выбора select
- •4.7.5Применение агрегатных функций и группировки
- •4.7.6Раздел order by и ключевое слово top
- •4.7.7Вложенные запросы
- •4.7.8Внутренние и внешние объединения
- •4.7.9Перекрестные запросы
- •4.7.10Операторы манипулирования данными
- •4.7.11Запросы на создание таблиц
- •4.7.12Использование языка определения данных
- •4.8Правила Кодда (требования к реляционным бд)
- •5Проектирование баз данных
- •5.1Этапы проектирования бд
- •5.2Проблемы проектирования реляционных баз данных
- •5.3Нормализация отношений
- •5.4Метод сущность-связь
- •5.5Средства автоматизации проектирования
- •5.5.1Основные определения
- •5.5.2Модели жизненного цикла
- •5.5.3Модели структурного проектирования
- •5.5.4Объектно-ориентированные модели
- •5.5.5 Классификация case-средств
- •6Защита информации в базах данных
- •6.1Общие подходы к обеспечению безопасности данных
- •6.2Назначение и проверка полномочий, проверка подлинности
- •6.3Средства защиты базы данных
- •7Базы данных в сетях
- •7.1Организация базы данных в локальной сети
- •7.2Модели архитектуры клиент-сервер
- •7.3Управление распределенными данными
- •8История развития баз данных
4.7.8Внутренние и внешние объединения
Стандарт SQL2 расширил понятие условного объединения. В стандарте SQL1 при объединении отношений использовались только условия, задаваемые в части WHERE оператора SELECT, и в этом случае в результирующее отношение попадали только сцепленные по заданным условиям кортежи исходных отношений, для которых эти условия были определены и истинны. Однако в действительности часто необходимо объединять таблицы таким образом, чтобы в результат попали все строки из первой таблицы, а вместо тех строк второй таблицы, для которых не выполнено условие соединения, в результат попадали бы неопределенные значения. Или наоборот, включаются все строки из правой (второй) таблицы, а отсутствующие части строк из первой таблицы дополняются неопределенными значениями. Такие объединения были названы внешними в противоположность объединениям, определенным стандартом SQL1, которые стали называться внутренними.
Внутреннее объединение (INNER JOIN) возвращает записи из двух таблиц, если значение первичного ключа первой таблицы соответствует значению внешнего ключа второй таблицы, связанной с первой.
В общем случае синтаксис части FROM в стандарте SQL2 выглядит следующим образом:
FROM <список исходных таблиц>|
<выражение естественного объединения>|
<выражение объединения>|
<выражение перекрестного объединения>|
<выражение запроса на объединение>
где
<список исходных таблиц> -
<имя таблицы1> [имя синонима таблицы1] […]
[,<имя таблицыN> [имя синонима таблицыN]];
<выражение естественного объединения> -
<имя таблицы1> NATURAL { INNER | FULL [OUTER]
LEFT [OUTER] | RIGHT [OUTER]} JOIN <имя таблицы2>|
<выражение объединения> -
<имя таблицы1> { INNER | FULL [OUTER] | LEFT [OUTER] | RIGHT [OUTER]} JOIN { ON условие | [USING
(список столбцов)]} <имя таблицы2>
<выражение перекрестного объединения> -
<имя таблицы1> CROSS JOIN <имя таблицы2>
<выражение запроса на объединение> -
<имя таблицы1> UNION JOIN <имя таблицы2>
В этих определениях INNER – означает внутреннее объединение, LEFT – левое объединение, то есть в результат входят все строки первой таблицы, а части результирующих кортежей, для которых не было соответствующих значений во второй таблице, дополняются значениями NULL (не определено). Ключевое слово RIGHT означает правое внешнее соединение, и в отличие от левого соединения в этом случае в результирующее отношение включаются все строки второй таблицы, а недостающие части из первой таблицы дополняются неопределенными значениями. Ключевое слово FULL определяет полное внешнее объединение: левое и правое. При полном внешнем объединении выполняются и правое и левое внешние объединения и в результирующее отношение включаются все строки из первой таблицы, дополненные неопределенными значениями, и все строки из второй таблицы, также дополненные неопределенными значениями. Ключевое слово OUTER означает внешнее объединение, но если заданы ключевые слова FULL, LEFT, RIGHT, то объединение всегда считается внешним.
Примеры внутренних и внешних объединений
Пример внутреннего объединения с помощью выражения эквивалентности между двумя полями – объединить R2 и R3 по полю Группа. В отношение R2 добавлены два студента – Попова из группы АИ21 и Бурковский – из АИ22.
SELECT R2.ФИО, R2.Группа, R3.Дисциплина
FROM R2, R3
WHERE R2.Группа =R3.Группа;
Результат:
ФИО |
Группа |
Дисциплина |
Петров |
АИ41 |
БД |
Петров |
АИ41 |
Моделирование |
Сидоров |
АИ41 |
БД |
Сидоров |
АИ41 |
Моделирование |
Миронов |
АИ41 |
БД |
Миронов |
АИ41 |
Моделирование |
Трофимов |
АИ42 |
Сети ЭВМ |
Иванова |
АИ42 |
Сети ЭВМ |
Уткина |
АИ42 |
Сети ЭВМ |
Попова |
АИ41 |
БД |
Попова |
АИ41 |
Моделирование |
Бурковский |
АИ42 |
Сети ЭВМ |
Пример внутреннего объединения с помощью ключевых слов INNER JOIN:
SELECT R2.ФИО, R2.Группа, R3.Дисциплина
FROM R2 INNER JOIN R3 ON R2.Группа =R3.Группа;
Результат будет таким же, как и в предыдущем примере.
Пример левого объединения. Полный список студентов с указанием сданных экзаменов, если студент сдавал экзамены и вывод фамилий и групп студентов, не сдававших экзамен.
SELECT [R2].[ФИО], [R2].[Группа],
[R1].[Дисциплина], [R1].[Оценка]
FROM R2 LEFT JOIN R1 ON [R2].[ФИО]=[R1].[ФИО];
Результат:
ФИО |
Группа |
Дисциплина |
Оценка |
Бурковский |
АИ42 |
|
|
Иванова |
АИ42 |
Сети ЭВМ |
5 |
Миронов |
АИ41 |
БД |
2 |
Миронов |
АИ41 |
Моделирование |
|
Петров |
АИ41 |
БД |
5 |
Петров |
АИ41 |
Моделирование |
5 |
Попова |
АИ41 |
|
|
Сидоров |
АИ41 |
БД |
4 |
Сидоров |
АИ41 |
Моделирование |
4 |
Трофимов |
АИ42 |
Сети ЭВМ |
4 |
Уткина |
АИ42 |
Сети ЭВМ |
5 |
Пример правого объединения (список студентов, сдававших экзамены).
SELECT DISTINCT R1.ФИО
FROM R2 RIGHT JOIN R1 ON R2.ФИО = R1.ФИО;
Результат:
ФИО |
Иванова |
Миронов |
Петров |
Сидоров |
Трофимов |
Уткина |
Внешние объединения в Delphi записываются следующим образом:
Левое внешнее объединение, при котором в выборку включаются все записи таблицы, имя которой указано слева от оператора OUTER JOIN.
…
FROM <табл. 1> LEFT OUTER JOIN <табл. 2>
ON <условие соединения таблиц>
Правое внешнее объединение, при котором в выборку включаются все записи таблицы, имя которой указано справа от оператора OUTER JOIN.
…
FROM <табл. 1> RIGHT OUTER JOIN <табл. 2>
ON <условие соединения таблиц>
Полное внешнее объединение означает, что в выборку включаются все записи из правой и левой таблиц.
…
FROM <табл. 1> FULL OUTER JOIN <табл. 2>
ON <условие соединения таблиц>
Пример. Выбрать из таблицы Товары список всех товаров, а из таблицы Продажи – суммарное количество проданных товаров:
SELECT Товары.Наименование, Sum(Продажи.Продано) AS [Всего продано]
FROM Товары LEFT OUTER JOIN Продажи
ON Товары.[Код товара] = Продажи.[Код товара]
GROUP BY Товары.Наименование;
Так как таблица Товары указана слева от оператора LEFT JOIN, то результирующая выборка будет содержать полный список товаров, включая те, что ни разу не были проданы.
