Как отмечалось ранее и как вы, вероятно, заметили, SQL напоминает реляционное исчисление наличием целевого списка (фраза SELECT) и определяющего выражения (фраза WHERE). В SQL2, однако, реализованы некоторые операции реляционной алгебры, которые мы сейчас обсудим. В частности, объединение, пересечение, разность и соединение реализованы в явном виде как операторы SQL. Мы рассмотрим их по очереди.
Операторы UNION (объединение), INTERSECT (пересечение) и EXCEPT (разность). Как и в реляционной алгебре, операторы объединения, пересечения и разности применяются к двум таблицам, которые должны быть объединительно-совместимы. Этот термин в SQL имеет несколько отличающееся значение. Две таблицы объединительно-совместимы, если в них одинаковое число столбцов и соответствующие столбцы имеют совместимые типы данных, то есть такие типы, которые могут быть легко преобразованы друг в друга. Например, два числовых типа не обязательно должны совпадать, но они должны преобразовываться друг в друга.
Объединительно-совместимые таблицы. Две или более таблицы, имеющие эквивалентные (по количеству и областям) наборы столбцов.
При обсуждении объединения, пересечения и разности мы воспользуемся следующим примером (рис. 3).
Рис. 3. Две реляционные таблицы с информацией о торговых агентах
UNION. Предположим, что мы хотим получить одну таблицу, содержащую информацию обо всех торговых агентах. Воспользуемся SQL-выражением
(SELECT * FROM SP_SUBORD)
UNION
(SELECT * FROM SP_MGR)
или в другом виде
SELECT *
FROM (TABLE SP_SUBORD UNION TABLE SP_MGR)
Результат представлен на рис. 4. Как и в реляционной алгебре, объединением двух реляционных таблиц будет реляционная таблица, содержащая каждую строку, лежащую хотя бы в одной из двух таблиц.
|
Рис. 4. Объединение таблиц SP_SUBORD и SP_MGR
В нашем примере ни одна строка не появляется более одного раза, даже если она есть в обеих таблицах. Однако, если мы воспользуемся формой
(SELECT * FROM SP_SUBORD)
UNION ALL
(SELECT * FROM SP_MGR)
илиформой
SELECT *
FROM (TABLE SP_SUBORD UNION ALL TABLE SP_MGR)
то тогда те строки, которые входят в обе таблицы, будут повторяться в объединении дважды.
UNION. Операция, создающая теоретико-множественное объединение двух таблиц.
INTERSECT. Предположим, что мы хотим идентифицировать тех торговых агентов, которые одновременно подчиняются кому-либо и сами являются менеджерами. Другими словами, нам нужно пересечь две таблицы, чтобы найти строки, лежащие в них обеих. Мы воспользуемся SQL-выражением
INTERSECT. Операция, создающая теоретико-множественное пересечение двух таблиц.
(SELECT * FROM SP_SUBORD) INTERSECT
(SELECT * FROM SP_MGR)
или в другой форме
SELECT *
FROM (TABLE SP_SUBORD INTERSECT TABLE SP_MGR)
Результат представлен на рис. 5.
Рис. 5. Пересечение таблиц SP_SUBORD и SP_MGR
Как и в случае объединения, ни одна строка не появляется в пересечении более одного раза. Однако, если в одной таблице имеется m копий строки, а в другой таблице имеется n копий строки, и m<n, то пересечение будет содержать m копий этой строки, если мы воспользуемся таким синтаксисом:
(SELECT * FROM SP_SUBORD)
INTERSECT ALL
(SELECT * FROM SP_MGR)
Как и в случае объединения, ключевое слово ALL означает, что повторы строк нужно рассматривать как отдельные строки.
EXCEPT. Предположим, что мы хотим найти всех торговых агентов, которые никому не подчиняются. Мы хотим вычесть таблицу SP_SUBORD из таблицы SP_MGR. В SQL-92 разность множеств поддерживается оператором EXCEPT. В нашем примере мы воспользуемся выражением
|
EXCEPT. Операция, создающая теоретико-множественную разность двух таблиц.
(SELECT * FROM SP_SUBORD)
EXCEPT
(SELECT * FROM SP_MGR)
или в другой форме
SELECT *
FROM (TABLE SP_SUBORD EXCEPT TABLE SP_MGR)
Результат представлен на рис. 6.
Рис. 6. Результат операции SP_MGR - SP_SUBORD
Если мы воспользуемся синтаксисом
(SELECT * FROM SP_SUBORD)
EXCEPT ALL
(SELECT * FROM SP_MGR)
в случае, когда в таблице SP_MGR имеется m копий строки, а в таблице SP_SUBORD имеется n копий строки, где m > n, то в результирующей таблице будет m-n копий этой строки. Если же m <= n,то в результирующей таблице не будет ни одной копии этой строки.
Теперь, когда мы дали общее представление об операторах SQL UNION, INTERSECT и EXCEPT, мы хотим взглянуть на них более пристально. Ограничение, накладываемое на таблицу, к которой применяются операторы объединительной совместимости, кажется слишком сильным. В конце концов, как часто мы имеем дело с таблицами, у которых в точности одинаковые столбцы? Рассмотрим слегка модифицированный синтаксис операторов и примеры, в которых ограничение не соблюдается. Рассмотрим такой запрос:
Запрос: Кто из штукатуров начинает работу 9 октября?
(SELECT * FROM WORKER
WHERE SKILL_TYPE = 'Штукатур')