Basic DB Using SQL Server (Part 7) - Set Operations in SQL
Hello again :) This was written by my lovely friend! She's new to the community, but she's one of the most incredible people I've ever met!
This 7th post will be about Set Operations. The topics we're covering today are...
- Meaning of
UNION
andUNION ALL
- Meaning of
EXCEPT
andINTERSECT
- Union Compatible
- Using
APPLY
operator in MS-SQL Server
More information about SET operation
1) Meaning of UNION
and UNION ALL
-- Q0 Find Customer Numbers and Names --
SELECT CustomerNum, CustomerName FROM Customer
-- Q1 UNION --
SELECT CustomerNum, CustomerName FROM Customer UNION
SELECT CustomerNum, CustomerName FROM Customer
UNION
combines the results of two or more queries into a distinct single result set
- include all the rows that belong to all queries
- put lines from queries after each other
- remove the duplicates
Difference between UNION
and JOIN
- JOIN
makes a certesian product and subset it
-- Q2 UNION ALL --
SELECT CustomerNum, CustomerName FROM Customer UNION ALL
SELECT CustomerNum, CustomerName FROM Customer
-- Q3 UNION ALL with ORDER BY
SELECT CustomerNum, CustomerName FROM Customer UNION ALL
SELECT CustomerNum, CustomerName FROM Customer
ORDER BY CustomerNum
UNION ALL
combines the two or more row sets and keeps duplicates
Order of UNION ALL matters
-- Q4 Add Condition
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500;
-- Q5 be Q4 UNION ALL Q0
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500
UNION ALL
SELECT CustomerNum, CustomerName FROM Customer
-- Q6 be Q0 UNION ALL Q4
SELECT CustomerNum, CustomerName FROM Customer
UNION ALL
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500
UNION keeps only "distinct" - order doesn't matter
-
relationship
- inclusive: the result will be the same
- exclusive: the result will be sorted in ascending order
-- Q7 be Q4 UNION Q0
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500
UNION
SELECT CustomerNum, CustomerName FROM Customer
-- Q8 be Q0 UNION Q4
SELECT CustomerNum, CustomerName FROM Customer
UNION
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500
- Since Q4 and Q0 have inclusive relationship, these two queries will have the same result
- Q0 includes the result of Q4
-- Q9 be Q0 WHERE Balance > 10,000
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance > 10000
-- Q10 be Q9 UNION ALL Q4
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance > 10000
UNION ALL
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500;
-- Q11 be Q9 UNION Q4
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance > 10000
UNION
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500;
- Since Q9 and Q4 have exclusive relationship, these two queries have different result
- UNION ALL: order matters
- UNION: result will be sorted in ascending order
-- Q12 be Q0 WHERE Balance > 5000;
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance > 5000
-- Q13 be Q12 UNION ALL Q4
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance > 5000
UNION ALL
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500;
-- Q14
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance > 5000
UNION
SELECT CustomerNum, CustomerName FROM Customer
WHERE Balance BETWEEN 3000 AND 5500;
- CusNum 408 from Q4 include in Q12
- UNION ALL: 408 appears twice
- UNION: 408 appears once
2) Meaning of EXCEPT
and INTERSECT
-
EXCEPT
returns distinct rows from the left input that are NOT output by the right input query
-
INTERSECT
retirns distinct rows that are output by both the left and right input queries operator.
-- Q15
SELECT CustomerNum FROM Orders
-- Q16
SELECT CustomerNum FROM Customer
-- Q17 be Q16 Customer EXCEPT 15 Order
SELECT CustomerNum FROM Customer
EXCEPT
SELECT CustomerNum FROM Orders
-- Q18 be Q16 Customer INTERSECT Q15 Order
SELECT CustomerNum FROM Customer
INTERSECT
SELECT CustomerNum FROM Orders
-- Q19 be Q15 Order EXCEPT Q16 Customer
SELECT CustomerNum FROM Orders
EXCEPT
SELECT CustomerNum FROM Customer
-- Q20 be Q15 Order INTERSECT Q16 Customer
SELECT CustomerNum FROM Orders
INTERSECT
SELECT CustomerNum FROM Customer
- Q17 Customers who does NOT order any product
- Q18 Customers who order a product
- Q19 There is NO Order without Customer
- Q20 Product that is ordered by Customers
3) UNION Compatibility
- Basic rules for combining the result sets of two or more queries that use
UNION
,UNION ALL
,EXCEPT
,INTERSECT
> 1) The number and order of the columns must be the SAME in all queries > 2) The data types must be compatible
4) APPLY operator
-
APPLY
operator allows user to invoke a table-valued function for each row returned by an outer table expression (left input) of a query.- Table-valued function: Right input
- Outer table expression: Left input
- The Right input is evaluated for each row from the Left input
-
Final Output
- Rows produced by
Apply
operator are combined
- Columns is the set om the Left input followed by the list columns returned by the Right input
- Rows produced by
-
CROSS APPLY
acts asINNER JOIN
- return only rows from the Outer table the produce a result set from the table-valued function
-
OUTTER APPLY
acts asOUTER JOIN
- return both rows that produce a result set, and rows that do not, with NULL values in the columns produced by the table-valued function
CROSS APPLY (INNER JOIN)
-- Q25 INNER JOIN
SELECT * FROM Customer
INNER JOIN Orders
ON Customer.CustomerNum = Orders.CustomerNum
-- Q26 CROSS APPLY
SELECT * FROM Customer
CROSS APPLY
(
SELECT *
FROM Orders
WHERE Customer.CustomerNum = Orders.CustomerNum
)AS T
SELECT * FROM Customer
SELECT * FROM Orders
OUTTER APPLY (OUTTER JOIN)
-- Q27 LEFT OUTTER JOIN
SELECT * FROM Customer
LEFT OUTER JOIN Orders
ON Customer.CustomerNum = Orders.CustomerNum
-- Q28 OUTER APPLY
SELECT * FROM Customer
OUTER APPLY(
SELECT *
FROM Orders
WHERE Customer.CustomerNum = Orders.CustomerNum
) AS T
Note: CROSS APPLY
/ OUTER APPLY
is NOT always equivalent to INNER JOIN
/ OUTTER JOIN
-- Q29 CROSS APPLY
SELECT CustomerNum, CustomerName, T.TotalNumberOfOrders FROM Customer
CROSS APPLY
(
SELECT COUNT(*) AS TotalNumberOfOrders
FROM Orders
WHERE Customer.CustomerNum = Orders.CustomerNum
)AS T
-- Q29 LEFT OUTTER JOIN
SELECT c.CustomerNum, CustomerName, COUNT(o.CustomerNum) AS TotalNumberOfOrders FROM Customer c
LEFT OUTER JOIN Orders o
ON c.CustomerNum = o.CustomerNum
GROUP BY C.CustomerNum, CustomerName
-- Q30 CROSS APPLY with INNER JOIN
SELECT c.CustomerNum,c.CustomerName, T.SumPrice
FROM Customer c
CROSS APPLY (
SELECT SUM(NumOrdered * QuotedPrice) AS SumPrice
FROM Orders
INNER JOIN OrderLine ON Orders.OrderNum = OrderLine.OrderNum
WHERE Orders.CustomerNum = c.CustomerNum
HAVING SUM(NumOrdered * QuotedPrice) > 0
) AS T
-- Q31 OUTER APPLY with INNER JOIN
SELECT c.CustomerNum,c.CustomerName, T.SumPrice
FROM Customer c
OUTER APPLY (
SELECT SUM(NumOrdered * QuotedPrice) AS SumPrice
FROM Orders
INNER JOIN OrderLine ON Orders.OrderNum = OrderLine.OrderNum
WHERE Orders.CustomerNum = c.CustomerNum
HAVING SUM(NumOrdered * QuotedPrice) > 0
) AS T
-- Q32 CROSS APPLY twice
SELECT c.CustomerNum,c.CustomerName, T1.OrderNum, T2.SumPrice
FROM Customer c
CROSS APPLY
(
SELECT COUNT(o.OrderNum) AS OrderNum
FROM Orders o
WHERE c.CustomerNum = o.CustomerNum
)AS T1
CROSS APPLY (
SELECT SUM(NumOrdered * QuotedPrice) AS SumPrice
FROM Orders
INNER JOIN OrderLine ON Orders.OrderNum = OrderLine.OrderNum
WHERE Orders.CustomerNum = c.CustomerNum
HAVING SUM(NumOrdered * QuotedPrice) > 0
) AS T2
-- Q33 OUTTER APPLY twice
SELECT c.CustomerNum,c.CustomerName, T1.OrderNum, T2.SumPrice
FROM Customer c
Outer APPLY
(
SELECT COUNT(o.OrderNum) AS OrderNum
FROM Orders o
WHERE c.CustomerNum = o.CustomerNum
)AS T1
Outer APPLY (
SELECT SUM(NumOrdered * QuotedPrice) AS SumPrice
FROM Orders
INNER JOIN OrderLine ON Orders.OrderNum = OrderLine.OrderNum
WHERE Orders.CustomerNum = c.CustomerNum
HAVING SUM(NumOrdered * QuotedPrice) > 0
) AS T2
Top comments (0)