SQL中MINUS、INTERSECT、UNION、UNION All

一、基本概念
差集:MINUS
交集:INTERSECT
并集:UNION、UNION All。UNION将重复的元组去掉,UNION ALL则不会。
 
表Store_Information 店面营业表


store_name


Sales


Date


分店1


1500


2013-01-05


分店2


250


2013-01-07


分店1


300


2013-01-08


分店3


700


2013-01-08

表Internet Sales 网络营业表


Date


Sales


2013-01-07


850


2013-01-10


535


2013-01-11


320


2013-01-12


750

应用两个集合的相减,相交和相加时,是有严格要求的:内部的SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。每条SELECT
语句中的列的顺序必须相同

①两个集合的字段必须明确,用*报错
②字段类型和顺序相同,名称可以不同,如集合1的字段1是NUMBER,字段2是VARCHAR,那集合2的字段1必须也是NUMBER,字段2必须是VARCHAR
③不能排序,如果要对结果排序,可以在集合运算后,外面再套一个查询,然后排序。
SELECT * FROM (SELECT order_id FROM made_order MINUS SELECT order_id FROM charge_detail) ORDER
BY ORDER_ID 

二、MINUS

SELECT column_name(s) FROM table_name1
MINUS
SELECT column_name(s) FROM table_name2

查找有店面营业额,但没有网络营业额的日期。
SELECT Date FROM Store_Information
MINUS
SELECT Date FROM Internet_Sales
结果:
Date
2013-01-05
2013-01-08
可以这样理解,两个表的Date字段组成了一个[5,7,8,10,11,12]全集,减去网络营业表的Date[7,10,11,12]剩下[5,8]就是需要的结果。

三、UNION、UNION All
查找所有有营业额的日子
SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
Date 
2013-01-05 
2013-01-07 
2013-01-08
2013-01-10 
2013-01-11
2013-01-12

UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的数据都列出来,无论资料值有无重复。

SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales
Date 
2013-01-05 
2013-01-07 
2013-01-08 
2013-01-08 
2013-01-07 
2013-01-10 
2013-01-11
2013-01-12

四、INTERSECT可以查相关资料

五、性能问题和注意点
虽然同样的功能可以用简单SQL语句来实现,但性能差别非常大。made_order共23万笔记录,charge_detail共17万笔记录:
SELECT order_id FROM made_order
MINUS
SELECT order_id FROM charge_detail
耗时:1.14 sec
  
SELECT a.order_id FROM made_order a
 WHERE a.order_id NOT exists (
 SELECT order_id
 FROM charge_detail
 WHERE order_id = a.order_id
)
耗时:18.19 sec

性能相差15.956倍。因此在遇到这种问题的时候,还是用MINUS,INTERSECT和UNION ALL来解决问题。

原帖地址:
http://www.cnblogs.com/fxgachiever/archive/2010/09/10/1823057.html
http://blog.csdn.net/gan690416372/article/details/5012397

时间: 2024-09-30 00:18:58

SQL中MINUS、INTERSECT、UNION、UNION All的相关文章

sql中UNION和UNION ALL比较与用法

union只是将两个结果联结起来一起显示,并不是联结两个表---- UNION 的语法如下: [SQL 语句 1] UNION [SQL 语句 2] 假设我们有以下的两个表格,   Store_Information 表格   store_name Sales Date  代码如下 复制代码 Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300 Jan-08-1999 Boston $700 Jan-0

sqlserver-关于sql中union的问题

问题描述 关于sql中union的问题 这个问题我已经找了很久,但是没有找到满意答案,不找到csdn大神们能不能帮我解决. 问题是这样的:我有一个存储过程,里面有几个查询,用union all连接,在sql server 2000中执行,单条都很快.但是用union all连起来,就变的非常缓慢.在sql server2008中执行,没有任何问题.请问大神们,这是什么原因呢?

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询.     1.先看一段正常的SQL语句,使用了Union(All)查询:      SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --

sql 高级查询运算词 UNION EXCEPT right及外部连接

sql 高级查询运算词 union except right及外部连接 a: union 运算符 union 运算符通过组合其他两个结果表(例如 table1 和 table2)并消去表中任何重复行而派生出一个结果表.当 all 随 union 一起使用时(即 union all),不消除重复行.两种情况下,派生表的每一行不是来自 table1 就是来自 table2. sql union 语法 select column_name(s) from table_name1 union selec

sql union sql union all用法 union union all效率

sql union  sql union all用法与实例教程以及,sql union union all效率 UNION 操作符用于合并两个或多个 SELECT 语句的结果集 UNION 组合多个表(或结果集)并将其作为单个结果集返回; UNION ALL 在结果中包含所有的行,包括重复行. 也就是说,使用UNION组合两个表时,将重复的记录删除:而使用UNION ALL组合两多个表时,不考虑结果集中是否存在重复记录,包括重复行. SQL UNION ALL 语法 SELECT column_

《SQL与关系数据库理论——如何编写健壮的SQL代码》一2.7 SQL中的类型检查和型转

2.7 SQL中的类型检查和型转 SQL只支持弱形式的强类型化(如果你明白我的意思的话).具体说包括: BOOLEAN值只能赋值到BOOLEAN变量,并只能和BOOLEAN值比较. 数字值只能赋值给数值变量,并且只能与数字值比较(此处的"数字"(numeric)指的是SMALLINT.BIGINT.NUMERIC.DECIMAL 或者FLOAT ). 字符串值只能赋值给字符串变量并且只能与字符串值进行比较(此处的"字符串"指的是CHAR.VARCHAR或者CLOB)

sql中case语句的用法浅谈_MsSql

SQL中Case的使用方法 Case具有两种格式.简单Case函数和Case搜索函数. 复制代码 代码如下: --简单Case函数 CASE sex          WHEN '1' THEN '男'          WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' THEN '男'          WHEN sex = '2' THEN '女' ELSE '其他' END 这两种方式,可以实现相同的功能.简单Ca

sql中case语句的用法浅谈

SQL中Case的使用方法 Case具有两种格式.简单Case函数和Case搜索函数.复制代码 代码如下:--简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END 这两种方式,可以实现相同的功能.简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功

oracle-jdbc执行sql中日期参数问题

问题描述 jdbc执行sql中日期参数问题 select 1 from dual where sysdate='2013-01-01';这样一个sql语句,在jdbc中可以正确执行,在pl/sql中确报错:"ORA-01861: literal does not match format string",select 1 from dual where sysdate='01-1月-2013'在pl/sql中可以正常执行,求教大神,jdbc会改变我的sql语句吗?jdbc是怎么执行sq