集合运算

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值