Пересечение наборов записей (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, будем называть операциями соединения таблиц (наборов записей).