Опубликован: 28.12.2011 | Уровень: для всех | Доступ: свободно
Лекция 8:

Соединения таблиц в предложении SELECT

Аннотация: Рассматриваются основы построения соединений таблиц в запросах SELECT и возможности построения соединений в Oracle.

Операция соединения в предложении SELECT

Запрос SELECT считается соединением, если обращается к нескольким источникам данных при том, что столбцы разных источников сравниваются друг с другом (в общем случае условным выражением общего вида). Соединение является одной из основных операций в реляционной модели, а в SQL она попала в искаженном виде по причине необязательности в SQL правила ключа применительно к таблицам.

Операция соединения издавна привлекала внимание разработчиков СУБД, так как, во-первых, ее присутствие в прикладной системе неизбежно обусловлено применением к БД теоретически обоснованной нормализации отношений/таблиц, а во-вторых, непродуманно прямолинейная отработка соединения чревата большими затратами СУБД.

По этим причинам операция соединения в свое время подробно исследовалась, подверглась систематизации и получила собственное синтаксическое оформление.

Виды соединений

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

SELECT emp.deptno, dname 
FROM   emp, dept
WHERE  emp.deptno = dept.deptno
;

Возможные варианты соотношений между данными в соединяемых столбцах:

  • столбцы заполнены одинаково;
  • данные одного столбца составляют подмножество данных другого;
  • данные двух столбцов пересекаются между собой;
  • данные столбцов не пересекаются.

Примеры и пояснения некоторых видов соединений, как то: тетасоединения, эквисоединения, естественного соединения, полуоткрытого и открытого, а также антисоединения приводятся ниже.

Тетасоединение

Примерный вид:

SELECT * 
FROM   emp, dept
WHERE  emp.deptno <оператор_сравнения> dept.deptno

(когда оператор сравнения произвольный).

Эквисоединение

Примерный вид:

SELECT * 
FROM   emp, dept
WHERE  emp.deptno = dept.deptno
;

(экви соединение, когда оператор сравнения — равенство).

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

Примерный вид:

SELECT emp.*, dept.dname, dept.loc 
FROM   emp, dept
WHERE  emp.deptno = dept.deptno
;

(когда оператор сравнения — равенство и соединяемые столбцы в таблицах именованы одинаково).

Полнота соединений

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

  • закрытое;
  • полуоткрытое "левое";
  • полуоткрытое "правое";
  • открытое полное;
  • антисоединения, "правое" и "левое";

На приводимом рисунке фигурными скобками обозначены строки, отбираемые для построения результата соединений перечисленных видов:

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

Обратите внимание, что полуоткрытые соединения порождают строки с NULL, при том что эти NULL имеют смысл "значение неприменимо". Это способно породить ту же проблему выбора способа дальнейшей обработки результата, что возникала в запросах с GROUP BY ROLLUP и CUBE. Однако здесь специальной функции-различителя нет, и смысл пропущенного значения должен определяться программистом на основе его местонахождения.

Ярослав Прозоров
Ярослав Прозоров
Ошибка таблицы сравнения запросов
Володимир Миколайчук
Володимир Миколайчук
помогите разобраться в вопросе с теста
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Дмитрий Квашнёв
Дмитрий Квашнёв
Россия, Коломна, Московский государственный открытый университет, 2001