oracle中的minus,union

本文详细介绍了Oracle SQL中的MINUS与UNION操作符的使用方法及注意事项,包括如何利用MINUS找出两个表之间的差异记录,以及如何通过UNION合并来自不同表的数据。

oracle中minus用来做减法操作,对结果集进行减法操作,A minus B就意味着将结果集A去除结果集B中所包含的所有记录后的结果,即在A中存在,而在B中不存在的记录。就是去除A表和B表的交集,对于B表中存在而A表中不存在的数据,不作任何操作,也不会抛出异常。

Oracle的minus是按列进行比较的,所以A minus B的前提条件是两表中有相同的列数,且列的数据类型相同,此外minus会对结果集进行去重,即如果A表中如果存在多条相同记录,在minus B表后对结果集重复的记录去重操作,只会留下一条。

实例:

那么:

       (1)“select id from t_user where id<6 minus select id from t_user where id between 3 and 7”的结果将为:

(2)“select age,level_no from t_user where id<8 minus select age,level_no from t_user where level=3”的结果为:



其实很好理解,可以一步步来,先写出select A表的记录,再写出B表的select记录,minus后得到是:

对于这个结果集最后要进行去重复操作,那么就得到了正确答案。

我们再来看两张表的情况:

测试例子:
s_info 店面营业额表:
s_name     s_date      sales
Angeles   2011-10-20   66.00
Diego     2012-01-20   128.00
angel     2013-01-01   500.00

i_info 网络营业额表:
s_date         sales 
2012-8-9       250.00
2012-01-20     120.98 
2013-02-8      360.00 
2011-10-25     400.68

而我们要知道有哪几天是有店面营业额而没有网络营业额的。要达到这个目的,我们用以下的 SQL 语句:
SELECT s_date FROM s_info
MINUS
SELECT s_date FROM i_info
结果:
s_date
2011-10-20
2013-01-01

说明:"2011-10-20", "2012-01-20", and "2013-01-01" 是 "SELECT Date FROM Store_Information" 所产生的结果。在这里面,"2012-01-20" 是存在于 "SELECT s_date FROM i_info" 所产生的结果中。因此 "2012-01-20" 并不在最后的结果中。
请注意,在 MINUS 指令下,不同的值只会被列出一次。

SQL中的UNION用法
UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。
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-08-1999

表格: Internet Sales
Date             Sales
Jan-07-1999      $250
Jan-10-1999      $535
Jan-11-1999      $320
Jan-12-1999      $750

而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:
SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,
那我们会得到完全一样的结果。
名字可以不一样。但是,数据类型必须相似。
也就是说主表(第一个表)第一列是varchar(100),副表(第一个以外的所有表)的第一列都要是varchar(100&&<100)(char好像也可以你试一下吧,或是可以自动转换数据类型),其它是不行的,
还有几个表的列数必须相同
++++++++++++++++++++++++
与MINUS功能类似的有
第一个
SELECT   表1.*    
FROM     表1,   表2
WHERE    表1.主键=表2.主键(+)  
AND   表2.主键   IS   NULL;
第二个
select   *   from   表1   where   not   exists(select   1   from   表2   where   表1.主键=表2.主键);
第三个
select   *   from   表1   where   表1.主键 not   in (select  主键   from   表2);
当然效率较高的还是MINUS。

<think> 首先,用户的问题是关于Oracle数据库中MINUS的含义。我需要参考提供的引用内容来回答。 引用内容: - [^1]: OracleMINUS的意思是"减",类似于减法操作。 - [^2]: OracleMINUS是按列进行比较的,要求两个结果集有相同的列数和数据类型。它返回在第一个结果集中但不在第二个结果集中的行,并进行去重。 - [^3]: MINUS用于比较两个表格或查询结果,返回第一个中有但第二个中没有的记录。 所以,MINUSOracle中是一个集合操作符,类似于SQL中的EXCEPT(在某些数据库中),它返回第一个查询结果中独有的行,减去第二个查询结果中的行。 我的回答需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 在行内数学表达式使用$...$格式,但这里可能不涉及数学表达式,除非必要。 - 独立公式使用$$...$$格式,但这里可能不需要。 - 在引用的段落末尾自然地添加引用标识,如[^1]。 - 生成相关问题。 用户的问题:"我想了解oracle数据库中minus的含义 请问oracle数据库中minus的含义" 所以,我需要解释MINUS的含义、用法和注意事项。 回答结构: 1. 介绍MINUS的含义:MINUSOracle中的一个集合操作符,用于返回第一个查询结果中独有的行。 2. 解释用法:如何编写MINUS查询。 3. 注意事项:如列数相同、数据类型匹配、去重等。 4. 添加引用标识。 5. 生成相关问题。 最后,生成相关问题。 确保回答基于引用内容。 大纲回答: - 开头:Oracle中的MINUS是一个集合操作符,用于比较两个查询结果集的差异。 - 详细解释:使用MINUS时,查询必须返回相同数量和类型的列。它返回在第一个查询结果中出现但不在第二个查询结果中出现的行。Oracle会自动去除重复行。 - 示例:引用[^3]中的示例。 - 结束:添加引用。 - 生成相关问题。 相关问题: 1. MINUS与其他集合操作符(如UNION、INTERSECT)的区别? 2. MINUS的性能优化? 3. MINUS在实际应用中的案例? </think> ### Oracle数据库中MINUS的含义详解 在Oracle数据库中,`MINUS` 是一个集合操作符,用于比较两个查询结果集(或表),并返回在第一个结果集中出现但不在第二个结果集中出现的行。简单来说,它类似于数学中的“减法”操作,即从第一个集合中“减去”第二个集合的元素[^1]。下面我将逐步解释其含义、用法和注意事项,确保回答清晰可靠。 #### 1. **MINUS的核心含义** - `MINUS` 操作符用于获取两个结果集的差集。如果结果集A有数据行,结果集B也有部分相同行,那么 `A MINUS B` 会返回A中独有的行。 - 示例:假设有两个表: - student1表: | SNO | SNAME | SSEX | |-----|-------|------| | 1 | 1 | 1 | | 2 | 2 | 2 | | 5 | 5 | 5 | - student2表: | SNO | SNAME | SSEX | |-----|-------|------| | 1 | 1 | 1 | | 2 | 2 | 2 | | 4 | 4 | 4 | - 执行 `SELECT * FROM student1 MINUS SELECT * FROM student2` 会返回: | SNO | SNAME | SSEX | |-----|-------|------| | 5 | 5 | 5 | - 因为只有SNO=5的行在student1中存在,但不在student2中[^3]。 #### 2. **MINUS的使用语法** - 基本语法格式: ```sql SELECT column1, column2, ... FROM table1 MINUS SELECT column1, column2, ... FROM table2; ``` - 要求: - 两个查询必须返回相同数量的列。 - 对应列的数据类型必须兼容(例如,第一个查询的第一列是数字,第二个查询的第一列也必须是数字)。 - Oracle会对最终结果自动去重,确保返回的行是唯一的[^2]。 #### 3. **注意事项** - **去重特性**:`MINUS` 会自动去除重复行。例如,如果A中有多条相同的记录,`A MINUS B` 后只保留一条。 - **性能考虑**:在大数据量场景下,`MINUS` 可能比使用 `NOT EXISTS` 或 `LEFT JOIN` 更高效,因为它直接基于集合操作优化。 - **数据类型匹配**:如果列类型不匹配(如一个查询返回VARCHAR,另一个返回NUMBER),查询会失败并报错。 - 实际应用中,`MINUS` 常用于数据比较,如验证数据迁移的一致性或查找差异记录[^2][^3]。 #### 4. **与类似操作符的区别** - 与 `UNION`(并集)和 `INTERSECT`(交集)不同,`MINUS` 专注于“差集”。 - 在SQL标准中,其他数据库(如PostgreSQL)可能使用 `EXCEPT`,但Oracle中只有 `MINUS`,功能相同。 通过以上解释,您可以看到 `MINUS` 是Oracle中处理数据集差异的强大工具。如果您有具体查询示例或性能问题,欢迎进一步说明![^1][^2][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值