“If all my possessions were taken from me but one, I would choose to keep the power of speech, for with it I could soon regain all the rest.”
- Daniel Webster
1.Each query will have at least two SELECT Statements separated by a SET Operator
2.SET Operators are UNION, INTERSECT, or EXCEPT/MINUS
3.Must specify the same number of columns from the same domain (data type/range)
4.If using Aggregates, both SELECTs much have their own GROUP BY
5.Both SELECTS must have a FROM Clause
6.The First SELECT is used for all ALIAS, TITLE, and FORMAT Statements
7.The Second SELECT will have the ORDER BY statement which must be a number
8.When multiple operators the order of precedence is INTERSECT, UNION, and EXCEPT/MINUS
9.Parentheses can change the order of Precedence
10.Duplicate rows are eliminated in the spool unless the ALL keyword is used
SELECT * FROM Table_Red
INTERSECT
SELECT * FROM Table_Blue ;
In this example, what numbers in the answer set would come from the query above?
SELECT * FROM Table_Red
INTERSECT
SELECT * FROM Table_Blue ;
3
In this example, only the number 3 was in both tables so they INTERSECT.
SELECT * FROM Table_Red
UNION
SELECT * FROM Table_Blue ;
In this example, what numbers in the answer set would come from the query above?
SELECT * FROM Table_Red
UNION
SELECT * FROM Table_Blue ;
1 2 3 4 5
Both top and bottom queries run simultaneously, then the two different spools files are merged to eliminate duplicates and place the remaining numbers in the answer set.
SELECT * FROM Table_Red
UNION ALL
SELECT * FROM Table_Blue ;
In this example, what numbers in the answer set would come from the query above?
SELECT * FROM Table_Red
UNION ALL
SELECT * FROM Table_Blue ;
1 2 3 3 4 5
Both top and bottom queries run simultaneously, then the two different spools files are merged together to build the answer set. The ALL prevents eliminating Duplicates.
SELECT * FROM Table_Red
EXCEPT
SELECT * FROM Table_Blue ;
EXCEPT or MINUS mean the same thing. In this example, what numbers in the answer set would come from the query above?
SELECT * FROM Table_Red
EXCEPT
SELECT * FROM Table_Blue ;
1 2
The Top query SELECTED 1, 2, 3 from Table_Red. From that point on, only 1, 2, 3 at most could come back. The bottom query is run on Table_Blue, and if there are any matches, they are not ADDED to the 1, 2, 3 but instead take away either the 1, 2, or 3.
You must have an equal amount of columns in both SELECT lists. This is because data is compared from the two spool files, and duplicates are eliminated. So, for comparison purposes, there must be an equal amount of columns in both queries.
The above query works without error, but no data is returned. There are no First Names that are the same as Department Names. This is like comparing apples to oranges. That means they are NOT in the same Domain
The Top Query is responsible for ALIASING.
The Bottom Query is responsible for the ORDER BY statement.
SELECT Employee_No AS MANAGER
,Trim(Last_Name) || ', ' || First_Name as "Name"
FROM Employee_Table
INNER JOIN
(SELECT Employee_No
FROM Employee_Table
INTERSECT
SELECT Mgr_No
FROM Department_Table)
AS TeraTom (empno)
ON Employee_No = empno
ORDER BY "Name"
MANAGER |
Name |
1256349 |
Harrison, Herbert |
1333454 |
Smith, John |
1000234 |
Smythe, Richard |
1121334 |
Strickling, Cletus |
The Derived Table gave us the empno for all managers, and we were able to join it.
SELECT Department_Name, Dept_No
FROM Department_Table
UNION ALL
SELECT Department_Name, Dept_No
FROM Department_Table
ORDER BY 1;
UNION eliminates duplicates, but UNION ALL does not.
Notice the 2nd SELECT column in that it is a literal ‘Employee ‘ (with two spaces) and the other Literal is ‘Department’. These literals match up because now they are both 10 characters long exactly. The UNION ALL brings back all Employees and all Departments and shows the employees in each valid department
SELECT Dept_No as Department_Number
FROM Department_Table
EXCEPT
SELECT Dept_No
FROM Employee_Table
Department Number
500
This query brought back all Departments without any employees.
Using the EXCEPT keyword, use a combination of a set operator
and a subquery to show all columns in the Customer_Table if a
customer has NOT placed an order in the Order_Table
You can do it brings
SELECT *
FROM Customer_Table
WHERE Customer_Number IN(
SELECT Customer_Number
FROM Customer_Table
EXCEPT
SELECT Customer_Number
FROM Order_Table) ;
The answer is above.
Above we use multiple SET Operators. They follow the natural Order of Precedence in that UNION is evaluated first, then INTERSECT, and finally MINUS.
Above we use multiple SET Operators and Parentheses to change the order of precedence. Above the EXCEPT runs first, then the INTERSECT and lastly, the UNION. The natural Order of Precedence without parentheses is UNION, INTERSECT, and finally EXCEPT or MINUS.
This is a great technique for getting data into tables in parallel.