#创建集合DB:WJM_CollectDemo 1 IF DB_ID('WJM_CollectDemo') IS NOT NULL 2 DROP DATABASE WJM_CollectDemo 3 GO 4 CREATE DATABASE WJM_CollectDemo
#创建员工表
CREATE TABLE Employees ( empID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, empName VARCHAR(50), position VARCHAR(50), degree VARCHAR(50), jiGuan VARCHAR(50), tel VARCHAR(50), )
INSERT INTO Employees VALUES ('张三','销售经理','本科','上海','021-298989'), ('李四','销售','本科','北京','010-298181'), ('李明','销售','','深圳','0755-698988'), ('王华','销售','本科','杭州','0571-593132')
#创建销售表
CREATE TABLE Sales ( salesID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, empID INT, empName VARCHAR(50), position VARCHAR(50), degree VARCHAR(50), SaleCount VARCHAR(100) )
INSERT INTO Sales VALUES ('1','张三','销售经理','本科','5000w'), ('3','李明','销售','','100w'), ('4','王华','销售','本科','1500w'), ('','张涛','外聘销售','硕士','2000w')
并集运算(UNION)
(1)UNION ALL(不删除重复行)
SELECT empID,empName,position,degree FROM Employees UNION ALL SELECT empID,empName,position,degree FROM Sales
结果分析:第一个查询结果与第二个查询结果集简单的组合,保留重复行
(2)UNION(隐式DINSTINT,删除重复行)
SELECT empID,empName,position,degree FROM Employees UNION SELECT empID,empName,position,degree FROM Sales
结果分析:UNION(隐式DISTINCT)相当与把UNION ALL当做中间结果,然后在其基础上通过DISTINCT过滤掉重复行。
小结:a.并集为两个查询结果集的简单组合
b.多集指集合中有重复的行,单集指集合中没有重复行
c.UNION ALL一般为多集,UNION(UNION DISTINCT)一般为集合
d.具有对称性,无论哪个查询在前面,查询结果都是一样的
交集运算(INTERSECT)
SELECT empID,empName,position,degree FROM Employees INTERSECT SELECT empID,empName,position,degree FROM Sales
结果分析:交集为第一个查询结果集和第二个查询结果集公有的部分
差集
SELECT empID,empName,position,degree FROM Employees EXCEPT SELECT empID,empName,position,degree FROM Sales
结果分析:差集运算对两个输入查询的结果集进行操作,返回出现在第一个结果集,但不出现在第二个结果集中的所有行.
集合运算的优先级:
SQL定义了集合运算之间的优先级。INTERSECT优先级比UNION和EXCEPT高,UNION和EXCEPT优先级一样。执行顺序为从左到右执行。
SELECT empID,empName,position,degree FROM Employees UNION SELECT empID,empName,position,degree FROM Sales INTERSECT SELECT empID,empName,position,degree FROM Employees
结果分析:a.INTERSECT优先级最高,UNION和EXCEPT优先级一样;
b.按照从左=>右的执行顺序执行;