Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инф. лаб. 4 - SQL.docx
Скачиваний:
7
Добавлен:
25.09.2019
Размер:
63.91 Кб
Скачать

Объединение таблиц

Особенностью оператора SELECT является то, что он оперирует выборкой, а не конкретной таблицей базы данных. Это означает, что выборка столбцов и вычисление условия фильтрации выполняются для каждой строки множества исходных записей разных таблиц, указанных в секции FROM запроса. Простейший случай объединения заключается в перечислении объединяемых таблиц через запятую в секции FROM запроса и наложении связывающего таблицы ограничения в секции WHERE. Например, следующий запрос выбирает имена всех заказчиков и показывает все поступившие от них заказы:

SELECT

[Customers].[CustomerSurname],

[Customers].[CustomerName],

[Orders].[OrderID]

FROM

[Customers],

[Orders]

WHERE

[Customers].[CustomerID] = [Orders].[CustomerID];

Без использования секции WHERE запрос, связывающий две таблицы посредством такого объединения, вернет полное декартово произведение всех строк первой таблицы на все строки второй таблицы. Таким образом, число записей в результирующей выборке будет равно произведению числа записей в первой таблице на число записей во второй.

Более общие случаи объединения таблиц формируются с помощью специального синтаксиса JOIN-секций, которые позволяют задавать внутреннее и внешнее объединение таблиц. Внутреннее объединение означает выборку только связанных записей из обеих таблиц (то есть запись из одной таблицы имеет соответствие в другой). Такое объединение формируется с помощью секции INNER JOIN. Внешнее объединение означает выборку связанных записей из обеих таблиц, но одновременно с этим предоставляется возможность выбрать записи, не имеющие связанных, только из первой, только из второй или из обеих таблиц. Такое объединение формируется с помощью секций LEFT JOIN (выбираются все записи из первой таблицы), RIGHT JOIN (выбираются все записи из второй таблицы), FULL JOIN (выбираются записи из обеих таблиц, а также записи каждой из таблиц, не имеющие связанных).

Синтаксис JOIN-секций может быть обобщенно описан следующим образом:

первая присоединяемая таблица

INNER|LEFT|RIGHT|FULL JOIN

вторая присоединяемая таблица

ON условие объединения

В следующем примере выбирается количество заказов для всех заказчиков, при этом в результирующей выборке присутствуют записи для заказчиков, не имеющих заказов:

SELECT

[Customers].[CustomerSurname],

[Customers].[CustomerName],

COUNT([Orders].[OrderID]) AS [OrderCount]

FROM

[Customers]

LEFT JOIN

[Orders]

ON

[Customers].[CustomerID] = [Orders].[CustomerID]

GROUP BY

[Customers].[CustomerSurname],

[Customers].[CustomerName];

В следующем примере выбираются все покупатели, покупавшие указанный товар (ключевое слово DISTINCT устраняет из выборки дублирующиеся записи):

SELECT DISTINCT

[Customers].*

FROM

[Customers]

INNER JOIN

([Orders]

INNER JOIN

([OrderItems]

INNER JOIN

[Products]

ON

[Products].[ProductID] = [OrderItems].[ProductID])

ON

[OrderItems].[OrderID] = [Orders].[OrderID])

ON

[Orders].[CustomerID] = [Customers].[CustomerID]

WHERE

[Products].[ProductName] = 'Цейлонский чай'

Можно заметить, что многие запросы можно выполнить несколькими способами. Последние приведенные примеры показывают, что нужного результата часто можно добиться с использованием подзапросов, либо с использованием объединений. Предпочтение в зависимости от ситуации следует отдавать либо более производительному, либо более удобочитаемому варианту.