Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000259.doc
Скачиваний:
27
Добавлен:
30.04.2022
Размер:
1.27 Mб
Скачать

3.5.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, то объединение всегда считается внешним.

Примеры внутренних и внешних объединений

Пусть даны три таблицы. Ключевые поля подчеркнуты.

Товары (Индекс, Наименование). Поставщики (Код, Фирма, Директор, Телефон). Поставка (Номер, Индекс, Код, Дата, Количество). Таблицы Товары и Поставка связаны по полю Индекс. Таблицы Поставщики и Поставка связаны по полю Код.

Примеры таблиц.

Товары

32

Молоко «Поддубный» 2.5 %

33

Молоко «Поддубный» 3.5 %

34

Молоко «Вкуснотеево» 2.5 %

45

Творог «Поддубный» 5 %

48

Творог Вкуснотеево» 9 %

Поставщики

231

ВМЗ № 1

Петров А.И.

2-88-45-23

235

ВМЗ № 2

Васильев С.Н.

2-90-90-90

301

ООО «Каменка-молоко»

Кудрин А.Н.

2-77-90-55

Поставка

10

32

231

12.09.12

200

11

33

231

12.09.12

100

12

34

235

12.09.12

150

14

48

235

12.09.12

10

Пример внутреннего объединения. Выбрать поля Номер, Наименование, Фирма, Количество.

SELECT Номер, Наименование, Фирма, Количество

FROM Товары Inner Join (Поставщики Inner Join Поставка On Поставщики.Код = Поставка.Код)

On Товары.Индекс = Поставка.Индекс;

Результат.

Номер

Наименование

Фирма

Количество

10

Молоко «Поддубный» 2.5 %

ВМЗ № 1

200

11

Молоко «Поддубный» 3.5 %

ВМЗ № 1

100

12

Молоко «Вкуснотеево» 2.5 %

ВМЗ № 2

150

14

Творог Вкуснотеево» 9 %

ВМЗ № 2

10

Пример левого объединения. Выбрать все поля из таблицы Товары и поля Код, Дата, Количество из таблицы Поставка. Результат будет содержать список всех товаров и соответствующие поставки, если они есть. Если поставок нет, то пустые поля.

SELECT Товары.Индекс, Товары.Наименование, Поставка.Код, Поставка.Дата, Поставка.Количество

FROM Товары Left Join Поставка

On Товары.Индекс = Поставка.Индекс;

Результат.

Индекс

Наименование

Код

Дата

Количество

32

Молоко «Поддубный» 2.5 %

231

12.09.12

200

33

Молоко «Поддубный» 3.5 %

231

12.09.12

100

34

Молоко «Вкуснотеево» 2.5 %

235

12.09.12

150

45

Творог «Поддубный» 5 %

48

Творог Вкуснотеево» 9 %

235

12.09.12

10

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