Ульяновский государственный университет
Опубликован: 10.09.2004 | Доступ: свободный | Студентов: 31900 / 3237 | Оценка: 4.06 / 3.65 | Длительность: 16:15:00
ISBN: 978-5-9556-0101-4
Лекция 5:

Соединения и теоретико-множественные операции над отношениями

< Лекция 4 || Лекция 5: 123 || Лекция 6 >

Операция соединения по двум отношениям (таблицам)

Соединение - это процесс, когда две или более таблицы объединяются в одну. Способность объединять информацию из нескольких таблиц или запросов в виде одного логического набора данных обусловливает широкие возможности SQL.

В языке SQL для задания типа соединения таблиц в логический набор записей, из которого будет выбираться необходимая информация, используется операция JOIN в предложении FROM.

Формат операции:

FROM имя_таблицы_1 {INNER | LEFT | RIGHT} 
    JOIN имя_таблицы_2 
ON условие_соединения

Существуют различные типы операций соединения:

  • тета-соединение R \triangleright\triangleleft_{F} S ;
  • соединение по эквивалентности R \triangleright\triangleleft_{=} S ;
  • естественное соединение R \triangleright\triangleleft S ;
  • внешнее соединение R \supset\triangleleft S, R \triangleright\subset S ;
  • полусоединение R \triangleright_{F} S.

Операция тета-соединения

Операция тета-соединения R \triangleright \triangleleft _{F} S определяет отношение, которое содержит кортежи из декартова произведения отношений R и S, удовлетворяющие предикату F. Предикат F имеет вид R.ai \Theta S.bj, где вместо \Theta может быть указан один из операторов сравнения ( >, >=, <, <=, =, <> ).

Если предикат F содержит только оператор равенства ( = ), то соединение называется соединением по эквивалентности.

Таблица 5.2.
R \triangleright \triangleleft _{F} S, F=(R.a2=S.b1)
R.a1 R.a2 S.b1 S.b2
a 1 1 h
a 2 2 g
b 3 3 h
b 1 1 h

Операция тета-соединения в языке SQL называется INNER JOIN (внутреннее соединение ) и используется, когда нужно включить все строки из обеих таблиц, удовлетворяющие условию объединения. Внутреннее соединение имеет место и тогда, когда в предложении WHERE сравниваются значения полей из разных таблиц. В этом случае строится декартово произведение строк первой и второй таблиц, а из полученного набора данных отбираются записи, удовлетворяющие условиям объединения.

В условиях объединения могут участвовать поля, относящиеся к одному и тому же типу данных и содержащие один и тот же вид данных, но они не обязательно должны иметь одинаковые имена.

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

Если в предложении FROM перечислено несколько таблиц и при этом не употребляется спецификация JOIN, а для указания соответствия полей из таблиц используется условие в предложении WHERE, то некоторые реляционные СУБД (например, Access) оптимизируют выполнение запроса, интерпретируя его как соединение.

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

SELECT R.a1, R.a2, S.b1, S.b2
FROM R, S
WHERE R.a2=S.b1

    или

SELECT R.a1, R.a2, S.b1, S.b2
FROM R INNER JOIN S ON  R.a2=S.b1
5.4. Тета-соединение отношений в SQL.

Естественное соединение

Естественным соединением называется соединение по эквивалентности двух отношений R и S, выполненное по всем общим атрибутам, из результатов которого исключается по одному экземпляру каждого общего атрибута.

Таблица 5.3.
R \triangleright \triangleleft S, F=(R.a2=S.b1)
R.a1 R.a2 или S.b1 S.b2
a 1 h
a 2 g
b 3 h
b 1 h
SELECT R.a1, R.a2, S.b2
FROM R, S
WHERE R.a2=S.b1

    или 

SELECT R.a1, S.b1, S.b2
FROM R INNER JOIN S ON  R.a2=S.b1
5.5. Естественное соединение отношений в SQL.

Пример 5.6. Вывести информацию о проданных товарах.

SELECT *
FROM Сделка, Товар
WHERE Сделка.КодТовара=Товар.КодТовара

    Или (что эквивалентно)

SELECT *
FROM Товар INNER JOIN Сделка 
    ON Товар.КодТовара=Сделка.КодТовара
5.6. Выборка информации о проданных товарах.

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

Пример 5.7. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях.

SELECT Товар.Название, Сделка.Количество, Сделка.
    Дата, Клиент.Фирма
FROM Клиент INNER JOIN 
    (Товар INNER JOIN Сделка
ON Товар.КодТовара=Сделка.КодТовара) 
ON Клиент.КодКлиента=Сделка.КодКлиента
5.7. Выборка сведений о товарах, дате сделок, количестве проданного товара и покупателях.

Использование общих имен таблиц для идентификации столбцов неудобно из-за их громоздкости. Каждой таблице можно присвоить какое-нибудь краткое обозначение, псевдоним.

Пример 5.8. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях. В запросе используются псевдонимы таблиц.

SELECT Т.Название, С.Количество, 
       С.Дата, К.Фирма
FROM Клиент AS К INNER JOIN 
    (Товар AS Т INNER JOIN
    Сделка AS С 
ON Т.КодТовара=С.КодТовара) 
ON К.КодКлиента=С.КодКлиента;
5.8. Выборка сведений о товарах, дате сделок, количестве проданного товара и покупателях с использованием псевдонима.

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

Какая из таблиц будет ведущей, определяет вид соединения. LEFT - левое внешнее соединение, ведущей является таблица, расположенная слева от вида соединения ; RIGHT - правое внешнее соединение, ведущая таблица расположена справа от вида соединения.

Левое внешнее соединение

Левым внешним соединением называется соединение, при котором кортежи отношения R, не имеющие совпадающих значений в общих столбцах отношения S, также включаются в результирующее отношение.

Таблица 5.4.
R \supset \triangleleft S
R.a1 R.a2 S.b1 S.b2
a 1 1 h
a 2 2 g
b 1 1 h
b 3 3 h
b 4 null null
SELECT R.a1,  R.a2, S.b1, S.b2
FROM R LEFT JOIN S ON R.a2=S.b1
5.9. Левое внешнее соединение отношений в SQL.

Существует и правое внешнее соединение R \triangleleft \subset S, называемое так потому, что в результирующем отношении содержатся все кортежи правого отношения. Кроме того, имеется и полное внешнее соединение, в его результирующее отношение помещаются все кортежи из обоих отношений, а для обозначения несовпадающих значений кортежей в нем используются определители NULL.

SELECT R.a1,  R.a2, S.b1, S.b2
FROM R RIGHT JOIN S ON  R.a2=S.b1
5.10. Правое внешнее соединение отношений в SQL.

Пример 5.11. Вывести информацию о всех товарах. Для проданных товаров будет указана дата сделки и количество. Для непроданных эти поля останутся пустыми.

SELECT Товар.*, Сделка.*
FROM Товар LEFT JOIN Сделка 
ON Товар.КодТовара=Сделка.КодТовара;
5.11. Выборка информации о всех товарах.

Полусоединение

Операция полусоединения определяет отношение, содержащее те кортежи отношения R, которые входят в соединение отношений R и S .

Таблица 5.5.
R \triangleleft _F S, F=(R.a2=S.b1)
R.a1 R.a2
a 1
a 2
b 3
b 1
SELECT R.a1, R.a2
FROM R, S
WHERE R.a2=S.b1

    или

SELECT R.a1,   R.a2
FROM R INNER JOIN S ON R.a2=S.b1
5.12. Полусоединение отношений в SQL.
< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Ирина Мельник
Ирина Мельник

Здравствуйте, записалась на курс основы SQL, подскажите, стоимость курса.

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?

Валерия Воропаева
Валерия Воропаева
Россия, г. Москва
Светлана Кудинова
Светлана Кудинова
Россия