Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
03_Пособие.doc
Скачиваний:
21
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

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, то результирующая выборка будет содержать полный список товаров, включая те, что ни разу не были проданы.