#创建集合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.按照从左=>右的执行顺序执行;
















