Пересечение наборов записей (INTERSECT)

Пересечение двух наборов записей осуществляется с помощью оператора INTERSECT (пересечение), возвращающего таблицу, записи в которой содержатся одновременно в двух наборах:

Запрос1 INTERSECT Запрос2;

При этом в результатной таблице остаются только отличающиеся записи. Чтобы сохранить в ней повторяющиеся записи, после оператора INTERSECT следует написать ключевое слово ALL.

Как и в операторе UNION, в INTERSECT можно использовать клю­чевое слово CORRESPONDING. В этом случае исходные наборы дан­ных не обязательно должны быть совместимыми для объедине­ния, но соответствующие столбцы должны иметь одинаковые тип и длину.

Как известно, различные технические системы могут содержать одинаковые компоненты. Если требуется получить список ком­понентов, входящих одновременно в две различные системы, то можно воспользоваться таким запросом:

SELECT * FROM Система1

INTERSECT

SELECT * FROM Система2;

Здесь предполагается, что таблицы Система1 и Система2 имеют одинаковые структуры. Если же структуры этих таблиц в чем-то различаются, но столбцы ID_компонента и Тип_компонента имеют одинаковые тип и длину, то можно применить следующий запрос:

SELECT * FROM Система1

INTERSECT CORRESPONDING( ID_компонента, Тип_компонента)

SELECT * FROM Система2;

Если в операторе INTERSECT используется ключевое слово CORRESPONDING, то после него в круглых скобках можно указать имена столбцов, значения которых должны проверяться на ра­венство при выполнении операции пересечения.

Вычитание наборов записей (EXCEPT)

Дляполучения записей, содержащихся в одном наборе и отсутст­вующих в другом, служит оператор EXCEPT (за исключением):

Запрос1 ЕХCЕРТ Запрос2;

С помощью этого оператора из первого набора удаляются записи, входящие во второй набор. Так же, как и в операторах UNION и INTERSECT, в операторе EXCEPT можно использовать ключевое словоCORRESPONDING.

Например, таблицы Клиенты и Контакты имеют однотипные столбцы Имя и Адрес. Чтобы узнать, все ли клиенты содержатся в списке контактов, можно воспользоваться следующим запросом:

SELECT * FROM Клиенты

EXCEPT CORRESPONDING (Имя, Адрес)

SELECT * FROM Контакты;

Возвращенные этим запросом записи будут содержать сведения о клиентах, которых нет в таблице контакты. Если же запрос вер­нет пустую таблицу, то это будет означать, что все клиенты пред­ставлены в таблице Контакты.

Операции соединения

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

Существуют несколько разновидностей соединения, которым соот­ветствуют определенные ключевые слова, добавляемые к слову JOIN. Так, например, декартово произведение явля­ется операцией перекрестного соединения. В SQL-выражении для обозначения этой операции используется оператор CROSS JOIN. Впрочем, декартово произведение можно получить и без исполь­зования этих ключевых слов. В основе любого соединения набо­ров записей лежит операция их декартового произведения.

Примечание:

Довольно часто операции, основанные на операторе JOIN, на­зывают объединением таблиц (наборов записей). Однако тер­мин "объединение" лучше подходит для UNION — оператора теоретико-множественного объединения записей, при котором записи исходных наборов не комбинируются (не соединяются) друг с другом, а просто к одному набору записей добавляется другой набор. В случае оператора JOIN в результатную таблицу попадают записи, полученные из разных наборов путем присое­динения одной из них к другой. Поэтому операции, основанные на операторе JOIN, будем называть операциями соединения таблиц (наборов записей).