4. Лекция: Выполнение сложных SQL-запросов

В лекции рассматриваются вопросы построения запросов, в которых применяется объединение.

Объединение запросов

Язык SQL предоставляет два способа объединения таблиц:

  • указывая соединяемые таблицы (в том числе подзапросы) во фразе FROM оператора SELECT. Сначала выполняется соединение таблиц, а уже потом к полученному множеству применяются указанные фразой WHERE условия, определяемое фразой GROUP BY агрегирование, упорядочивание данных и т.п.;
  • определяя объединение результирующих наборов, полученных при обработке оператора SELECT. В этом случае два оператора SELECT соединяются фразой UNION, INTERSECT, EXCEPT или CORRESPONDING.

UNION-объединение

Фраза UNION объединяет результаты двух запросов по следующим правилам:

  • каждый из объединяемых запросов должен содержать одинаковое число столбцов;
  • тип значений из попарно объединяемых столбцов должен быть одинаковым или приводимым. Так, нельзя объединять значения из столбца типа integer и столбца типа varchar;
  • из результирующего набора автоматически исключаются совпадающие строки (рис. 4.1);

    Выполнение UNION-объединения с исключением совпадающих строк
    Рис. 4.1.  Выполнение UNION-объединения с исключением совпадающих строк

  • если в строку вставляется какая-либо константа, добавляемая в запросе, то ее значение также влияет на идентичность строк (рис. 4.2).

    Выполнение UNION-объединения, использующего выражения
    Рис. 4.2.  Выполнение UNION-объединения, использующего выражения

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

Для того чтобы явно указать требуемый порядок сортировки, следует использовать фразу ORDER BY. При этом можно использовать как имя столбца, так и его номер (рис. 4.3).

Выполнение UNION-объединения с упорядочиванием результирующего набора
Рис. 4.3.  Выполнение UNION-объединения с упорядочиванием результирующего набора

Фраза UNION ALL выполняет объединение двух подзапросов аналогично фразе UNION со следующими исключениями:

  • совпадающие строки не удаляются из формируемого результирующего набора;
  • объединяемые запросы выводятся в результирующем наборе последовательно без упорядочивания.

При объединении более двух запросов для изменения порядка выполнения операции объединения можно использовать скобки (рис. 4.4).

Выполнение UNION-объединения для трех запросов
Рис. 4.4.  Выполнение UNION-объединения для трех запросов

INTERSECT-объединение

Фраза INTERSECT позволяет выбрать только те строки, которые присутствуют в каждом объединяемом результирующем наборе. На рис. 4.5 приведен пример объединения запросов как пересекающихся множеств.

Выполнение INTERSECT-объединения
Рис. 4.5.  Выполнение INTERSECT-объединения

EXCEPT-объединение

Фраза EXCEPT позволяет выбрать только те строки, которые присутствуют в первом объединяемом результирующем наборе, но отсутствуют во втором результирующем наборе.

Фразы INTERSECT и EXCEPT должны поддерживаться только при полном уровне соответствия стандарту SQL-92. Так, некоторые СУБД вместо фразы EXCEPT поддерживают опцию MINUS (рис. 4.6).

Выполнение MINUS(EXCEPT)-объединения
Рис. 4.6.  Выполнение MINUS(EXCEPT)-объединения

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

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

Фраза CORRESPONDING BY позволяет использовать в объединяемых запросах различное число столбцов: в результирующий набор будут включены только столбцы, указанные в списке. Этот список также определяет порядок включения столбцов в результирующий набор.