目录
- 练习 1: 使用 UNION ALL
- 练习 2: 返回特定月份的订单活动
- 练习 3: 查找特定月份都有订单活动的客户
- 练习 4: 查找特定月份都有订单活动且某年没有订单活动的客户
- 练习 5: 保证查询结果的顺序
- 总结
- 引用
- 数据库脚本下载
练习 1: 使用 UNION ALL
SELECT 1 AS n UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7;
输出:
练习 2: 返回特定月份的订单活动
返回 2008 年 1 月有订单活动,2008 年 2 月没有订单活动的客户和雇员。
SELECT * FROM Sales.Orders o
LEFT JOIN Sales.Customers c ON c.custid = o.custid
WHERE o.orderdate BETWEEN '20080101' AND '20080131';
输出:55行
自动去重,自动比对,50 行
SELECT custid, empid FROM Sales.Orders
WHERE orderdate BETWEEN '20080101' AND '20080131'
EXCEPT
SELECT custid, empid FROM Sales.Orders
WHERE orderdate BETWEEN '20080201' AND '20080229';
输出:
SELECT custid, empid FROM Sales.Orders
WHERE orderdate BETWEEN '20080101' AND '20080131'
INTERSECT
SELECT custid, empid FROM Sales.Orders
WHERE orderdate BETWEEN '20080201' AND '20080229';
输出:
练习 4: 查找特定月份都有订单活动且某年没有订单活动的客户
返回 2008 年 1 月和 2008 年 2 月都有订单活动的客户,且 2007 年没有订单活动的客户和雇员。
SELECT custid, empid FROM Sales.Orders
WHERE orderdate BETWEEN '20080101' AND '20080131'
INTERSECT
SELECT custid, empid FROM Sales.Orders
WHERE orderdate BETWEEN '20080201' AND '20080229'
EXCEPT
SELECT custid, empid FROM Sales.Orders
WHERE orderdate BETWEEN '20070101' AND '20071231';
输出:
练习 5: 保证查询结果的顺序
对以下查询增加逻辑处理,保证 Employees 表返回的行位于 Suppliers 表行的前面。注意:参与集合运算的单个查询不允许带有 ORDER BY
子句。
SELECT country, region, city
FROM (
SELECT 1 AS SORTCOL, country, region, city
FROM HR.Employees
UNION ALL
SELECT 2 AS SORTCOL, country, region, city
FROM Production.Suppliers
) D
ORDER BY SORTCOL, country, region, city;
输出:
总结
通过这些练习,可以更好地理解和掌握集合运算的实际应用。