Более сложные конструкции оператора выборки

 

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

 

Соединенные таблицы

 

В примерах предыдущей и данной лекций присутствовало много запросов с соединениями двух или более таблиц. Условия соединения задавались предикатами сравнения столбцов таблиц, специфицированных в разделе FROM, и входили в состав логических выражений раздела WHERE (или, реже, раздела HAVING). Поскольку на практике требуются разные виды соединений, в стандарте SQL/92 появилась альтернативная возможность спецификации соединений – соединенная таблица (joined table). Соответствующая конструкция может использоваться в разделе FROM выражения запросов и, фактически, позволяет строить выражения соединений таблиц. Синтаксические правила построения таких выражений выглядят следующим образом:

 

joined_table ::= cross_join
| qualified_join
| natural_join
| union_join

 

cross_join ::= table_reference CROSS JOIN table_primary

 

qualified_join ::= table_reference [ join_type ] JOIN table_primary
join_specification

 

natural_join ::= table_reference NATURAL [ join_type ] JOIN table_primary

 

union_join ::= table_reference UNION JOIN table_primary

 

join_type ::= INNER | { LEFT | RIGHT | FULL } [ OUTER ]

 

join_specification ::= ON conditional_expression
| USING (column_comma_list)

 

Напомним, что синтаксические правила для table_reference и table_primary были показаны в Лекции 13.

 

Как показывается сводка синтаксических правил, в SQL поддерживается много вариантов соединений. Чтобы объяснить особенности разных видов соединений на неформальном уровне, требуется очень большой объем текста с большим числом повторений. Поэтому сначала мы приведем достаточно формальное описание порядка определения заголовка и тела результирующей таблицы для всех разновидностей соединений. Фактически, это описание напрямую позаимствовано из стандарта SQL:1999 с некоторыми незначительными упрощениями. Затем мы представим ряд иллюстрирующих примеров.