Многотабличные запросы и стандарт SQL2

В стандарте SQL1 дано определение только внутреннего соединения таблиц, понятие внешнего соединения в нем отсутствует. Однако внешнее соединение таблиц является полезной частью реляционной модели данных и реализовано во многих СУБД (SQL Server, Oracle, SQLBase). Способы представления внешних соединений в различных программных продуктах сильно отличались друг от друга и выбирались по принципу их наименьшего влияния на язык SQL, поэтому в стандарте SQL2 был определен совершенно новый метод поддержки внешних соединений, не опирающийся ни на одну из популярных СУБД. В спецификации стандарта SQL2 поддержка внешних соединений осуществляется в предложении FROM, синтаксис которой позволяет точно определить, каким образом исходные таблицы должны быть соединены в запросе. Oracle SQL имеет полную поддержку расширенного предложения FROM, начиная с версии Oracle9i.

Результатом соединения, реализованного в предложении FROM, является порожденная таблица, которая и должна обрабатываться остальными операторами запроса. Можно совмещать в одном запросе соединения, заданные посредством расширенного предложения FROM, и соединения, определенные условием соединения WHERE, однако сложность логики исполнения оператора превышает полученные преимущества. Стандарт SQL2 предусматривает использование только одной встроенной операции соединения в каждом предложении FROM.

Для всех соединений, исключая перекрестные соединения и соединения объединения, поддерживаются следующие типы соединения:

тип_соединения = INNER | {LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER]}

Внутреннее соединение (INNER). Это тип соединения по умолчанию. Соединяются только те строки, где найдены совпадающие значения столбцов.

Левое внешнее соединение (LEFT [OUTER]).Это соединение включает в себя все строки из первой таблицы (совпадающие и несовпадающие) и совпадающие значения из второй таблицы. Для строк из первой таблицы, которым не найдено соответствие, в столбцы, извлекаемые из второй таблицы, заносятся значения NULL.

Правое внешнее соединение (RIGHT [OUTER]). Это соединение является обратным предыдущему, оно включает в себя все строки из второй таблицы (совпадающие и несовпадающие) и совпадающие значения из первой таблицы. Для строк из второй таблицы, которым не найдено соответствие, в столбцы, извлекаемые из первой таблицы, заносятся значения NULL.

Полное внешнее соединение (FULL [OUTER]).Это комбинация левого и правого внешних соединений. Присутствуют все строки из обеих таблиц. Если значения столбцов совпадают, то столбцы заполнены реальными значениями. В противном случае столбцы заполняются значениями NULL.

В расширенном предложении FROM используются следующие синтаксические конструкции:

Перекрестное соединение – простое декартово произведение, используются все комбинации строк.

… FROM таблица1 CROSS JOIN таблица2

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

… FROM таблица1 UNION JOIN таблица2

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

… FROM таблица1 [NATURAL] [тип_соединения] JOIN таблица2

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

… FROM таблица1 [тип_соединения] JOIN таблица2 ON предикат

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

… FROM таблица1 [тип_соединения] JOIN таблица2 USING (столбец1[, столбец2, …]) …