Операции реляционной алгебры




 

Как отмечалось ранее и как вы, вероятно, заметили, 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 = 'Штукатур')



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: