Соединение данных из множества таблиц. Рекомендации по выполнению работы и перечень типовых заданий. Учебно–методическое пособие
.pdf
полей из правой таблицы. Покажем это с помощью диаграммы
Венна [20], [24].
Рисунок 4 – Изображение LEFT OUTER JOIN с помощью
диаграммы Венна
Пример 4
Показать жителей всех городов.
SELECT c."Name"
, c2."FirstName" FROM "Cities" c
LEFT OUTER JOIN "Citizens" c2
ON c."ID" = c2."ID_City";
Рисунок 5 – Результат выполнения оператора LEFT OUTER JOIN
Результат выполнения запроса (Пример 4)
Как видно (Рисунок 5), в результирующий набор данных попали все записи из таблицы Cities, которая указана первой и соответствующие
11
записи из таблицы Citizens. Так как в городе Казань никто не живет, то значение в поле FirstName отсутствует.
Пример 5
Показать города, в которых проживают все жители.
SELECT c."Name"
, c2."FirstName" FROM "Citizens" c2
LEFT OUTER JOIN "Cities" c
ON c."ID" = c2."ID_City";
Рисунок 6 – Результат запроса LEFT OUTER JOIN
Результат выполнения запроса (Пример 5)
Результирующий набор (Рисунок 6) содержит шесть строк, так как таблица, к которой происходит соединение, имеет шесть строк. Последняя строка не содержит значение в поле FirstName. С точки зрения теории реляционных баз данных значение внешнего ключа не должно быть пустым,
однако в жизни может встречаться такая ситуация как промежуточный результат (при удалении записи из главной таблицы, все ссылки в дочерних таблицах принимают значение NULL) или, человек Анатолий лишился жилья.
12
Пример 6
Показать стандартную цену для каждого продукта.
SELECT
P."Name"
,P."ModifiedDate"
,P."ListPrice"
,C."StandardCost"
FROM "Production"."Product" P
LEFT OUTER JOIN "Production"."ProductCostHistory" C
ON P."ProductID" = C."ProductID"
ORDER BY P."Name";
Рисунок 7 – Результат запроса LEFT OUTER JOIN
Как видно из результатов запроса (Рисунок 7), в результирующем наборе присутствуют все строки из таблицы Production.Product. Строки из таблицы Production.ProductCostHistory, значения столбца
ProductID в которых не совпадают со значениями одноименного столбца из таблицы Production.Product, присутствуют, но имеют значение NULL.
RIGHT OUTER JOIN
Правое внешнее соединение отличается от левого внешнего соединения направлением ассоциации. Покажем это с помощью диаграммы Венна [20], [24].
13
Рисунок 8 – Изображение RIGHT OUTER JOIN с помощью
диаграммы Венна
Следующие два запроса покажут одинаковый результат:
Запрос с применением LEFT OUTER JOIN
SELECT
T1.Field1
,...
,T1.FieldN
,T2.Field1
,...
,FieldM
FROM Table1 T1
LEFT JOIN Table2 T2
ON T1.FieldK = T2.FieldK
Запрос с применением RIGHT OUTER JOIN
SELECT T1.Field1 ,...
,T1.FieldN
,T2.Field1
,...
,FieldM FROM Table2 T2
RIGHT JOIN Table1 T1
ON T2.FieldK = T1.FieldK
14
Пример 7
Используя RIGHT OUTER JOIN, выполнить задание (Пример 4).
SELECT c2."Name"
, c."FirstName" FROM "Citizens" c
RIGHT OUTER JOIN "Cities" c2
ON c2."ID" = c."ID_City";
Рисунок 9 – Результат выполнения оператора RIGHT OUTER JOIN
Результат выполнения запроса (Пример 4)
Пример 8
Используя RIGHT OUTER JOIN, выполнить задание Пример 5.
SELECT c2."Name"
, c."FirstName" FROM "Cities" c2
RIGHT OUTER JOIN "Citizens" c
ON c2."ID" = c."ID_City";
15
Рисунок 10 – Результат запроса RIGHT OUTER JOIN
Результат выполнения запроса (Пример 5)
Сравнивая результаты выполнения скриптов (Рисунок 5 и Рисунок 9) и
(Рисунок 6 и Рисунок 10), мы видим их идентичность.
FULL OUTER JOIN
Оператор полное внешнее соединение применяется, когда нужно соединить таблицы по неключевому полю. В итоге, в результирующем наборе будут присутствовать сроки из левой таблицы, строки, которые совпадают по полю соединения с правой таблицей и строки из правой таблицы. Если нет совпадения по полю соединения, то значение в этой строке будет NULL.
Покажем это с помощью диаграммы Венна [20], [24].
Рисунок 11 – Изображение FULL JOIN
с помощью диаграммы Венна
16
Пример 9
Выполнить FULL OUTER JOIN для таблицы Город (Cities) и
Жители (Citizens).
SELECT c2."Name"
, c."FirstName" FROM "Cities" c2
FULL OUTER JOIN "Citizens" c
ON c2."ID" = c."ID_City";
Рисунок 12 – Результат выполнения оператора FULL OUTER JOIN
Создание своей базы данных
Для лучшего понимания операторов соединения создадим свою базу данных. Пусть имеется магазин, который завозит товары (Products) со склада (Stores) и продаёт (Purchases) их. Также имеется таблица поставщиков (Vendors), так как один вид товара может поставляться разными поставщиками. Время, цена покупки и продажи записываются соответственно в таблицы Stores и Purchases. После создания БД [30],
получим следующую ER–диаграмму (Рисунок 13). Установим нотацию
Crows Foot, выбрав ее в меню, полученном нажатием правой клавиши мыши (Рисунок 14).
17
Рисунок 13 – ER–диаграмма созданной БД [30]
Рисунок 14 – Выбор нотации схемы данных
Все таблицы заполним данными [31]. 18
Пример 10
Показать, какие товары поставляются какими поставщиками. База
данных Shop (Магазин).
SELECT
V."Name" AS Vendor
, Pr."Name" AS Product
FROM "Purchases" AS P
INNER JOIN "Vendors" AS V
ON V."ID" = P."ID_Vendors"
INNER JOIN "Products" AS Pr
ON Pr."ID" = P."ID_Products"
ORDER BY V."Name";
Рисунок 15 – Результат выполнения скрипта (Пример 10)
Пример 11
Показать продажи продуктов. База данных Shop (Магазин).
SELECT P."Name"
,s."Price" AS Price
,CAST(s."Date" AS VARCHAR(15))
FROM "Stores" s
INNER JOIN "Products" P
ON P."ID" = S."ID_Products";
19
Рисунок 16 – Результат выполнения скрипта (Пример 11)
20
