- •Методические указания к лабораторной работе №4 «Базы данных. Язык запросов sql»
- •Введение
- •Выборка данных
- •Сортировка данных
- •Фильтрация данных
- •Использование функций
- •Агрегирующие функции
- •Использование подзапросов
- •Объединение таблиц
- •Тестовые данные
- •Варианты заданий
- •Вариант 1 «Хранилище документов»
- •Вариант 2 «Музыкальный архив»
- •Вариант 3 «Библиотека»
- •Вариант 4 «Почтовый сервер»
- •Вариант 5 «Страховая компания»
- •Вариант 6 «Сервисный центр»
- •Список литературы
Объединение таблиц
Особенностью оператора 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] = 'Цейлонский чай'
Можно заметить, что многие запросы можно выполнить несколькими способами. Последние приведенные примеры показывают, что нужного результата часто можно добиться с использованием подзапросов, либо с использованием объединений. Предпочтение в зависимости от ситуации следует отдавать либо более производительному, либо более удобочитаемому варианту.