An INTERSECT operation retrieves the matching set of distinct values (not rows) from two columns. The INTERSECT ALL returns the set of matching individual rows. An INTERSECT and/or EXCEPT operation is done by matching ALL of the columns in the top and bottom result sets. In other words, these are rows, not the column, operations. It is not possible to only match on the keys, yet at the same time, also fetch non-key columns. To do this, one needs to use a sub-query. The UNION operation is a logical OR, INTERSECT is a logical AND. When multiple operations are done in the same SQL statement, there are precedence rules:
- Operations in parenthesis are done first.
- INTERSECT operations are done before either UNION or EXCEPT.
- Operations of equal worth are done from top to bottom.
SQL treats NULLS differently in these operations than it does when handing NULLS in joins and scans. SQL treats set operations NULL values as equal to each other; that is, the evaluation expression (NULL = NULL) produces the result TRUE whereas, in JOIN or SCAN, NULL equality expression evaluates to UNKNOWN
INTERSECT Syntax
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] INTERSECT/ INTERSECT ALL SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] Let’s consider below example Table R1 Table R2 R1 R2 Abhi Abhi Abhi Abhi Abhi Baby Baby Baby Baby Baby Cat Cat Cat Dan Cat Elie SELECT R1 FROM R1 INTERSECT/ INTERSECT ALL SELECT R2 FROM R2 ORDER BY 1; INTERSECT INTERSECT ALL Abhi Abhi Baby Abhi Cat Baby Baby Cat
EXCEPT & EXCEPT ALL
An EXCEPT operation retrieves the set of distinct data values (not rows) that exist in the first table but not in the second. The EXCEPT ALL returns the set of individual rows that exist only in the first table.
NOTE: Only the EXCEPT operation is not commutative. Both the UNION and the INTERSECT operations work the same regardless of which table is on top or on the bottom.
Example: Table R1 Table R2 R1 R2 Abhi Abhi Abhi Abhi Abhi Baby Baby Baby Baby Baby Cat Cat Cat Dan Cat Elie SELECT R1 FROM R1 EXCEPT/ EXCEPT ALL SELECT R2 FROM R2 ORDER BY 1; EXCEPT EXCEPT ALL Elie Abhi Cat Cat Elie
WARNING: Unlike the UNION and INTERSECT operations, the EXCEPT statement is not commutative. This means that “A EXCEPT B” is not the same as “B EXCEPT A”. So if you use the EXCEPT operation in the reverse direction (i.e. R2 to R1 instead of R1 to R2) will give a different result:
SELECT R2 FROM R2 EXCEPT/ EXCEPT ALL SELECT R1 FROM R1 ORDER BY 1; EXCEPT EXCEPT ALL Dan Baby Dan