这篇文章主要介绍了 Oracle minus 用法详解及应用实例的相关资料, 这里对 oracle minus 的用法进行了具体实例详解,需要的朋友可以参考下
Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系数据库管理系统。到目前仍在数据库市场上占有主要份额。
Oracle minus 用法
"minus" 直接翻译为中文是 "减" 的意思,在 Oracle 中也是用来做减法操作的,只不过它不是传统意义上对数字的减法,而是对查询结果集的减法。A minus B 就意味着将结果集 A 去除结果集 B 中所包含的所有记录后的结果,即在 A 中存在,而在 B 中不存在的记录。其算法跟 Java 中的 Collection 的 removeAll() 类似,即 A minus B 将只去除 A 跟 B 的交集部分,对于 B 中存在而 A 中不存在的记录不会做任何操作,也不会抛出异常。
Oracle 的 minus 是按列进行比较的,所以 A 能够 minus B 的前提条件是结果集 A 和结果集 B 需要有相同的列数,且相同列索引的列具有相同的数据类型。此外,Oracle 会对 minus 后的结果集进行去重,即如果 A 中原本多条相同的记录数在进行 A minus B 后将会只剩一条对应的记录,具体情况请看下面的示例。
下面我们来看一个 minus 实际应用的示例,假设我们有一张用户表 t_user,其中有如下记录数据:
id |
no |
name |
age |
level_no |
1 |
00001 |
a |
25 |
1 |
2 |
00002 |
b |
30 |
2 |
3 |
00003 |
c |
35 |
3 |
4 |
00004 |
d |
45 |
1 |
5 |
00005 |
e |
30 |
2 |
6 |
00006 |
f |
35 |
3 |
7 |
00007 |
g |
25 |
1 |
8 |
00008 |
h |
35 |
2 |
9 |
00009 |
i |
20 |
3 |
10 |
00010 |
j |
25 |
1 |
那么:
(1)"select id from t_user where id<6 minus select id from t_user where id between 3 and 7" 的结果将为:
id |
1 |
2 |
(2)"select age,level_no from t_user where id<8 minus select age,level_no from t_user where level=3" 的结果为:
age |
level_no |
25 |
1 |
30 |
2 |
45 |
1 |
看到这样的结果,可能你会觉得有点奇怪,为何会是这样呢?我们来分析一下。首先,"select age,level_no from t_user where id<8" 的结果将是这样的:
age |
level_no |
25 |
1 |
30 |
2 |
35 |
3 |
45 |
1 |
30 |
2 |
35 |
3 |
25 |
1 |
然后,"select age,level_no from t_user where level=3" 的结果将是这样的:
age |
level_no |
35 |
3 |
35 |
3 |
20 |
3 |
然后,直接 A minus B 之后结果应当是:
age |
level_no |
25 |
1 |
30 |
2 |
45 |
1 |
30 |
2 |
25 |
1 |
这个时候,我们可以看到结果集中存在重复的记录,进行去重后就得到了上述的实际结果。其实这也很好理解,因为 minus 的作用就是找出在 A 中存在,而在 B 中不存在的记录。
上述示例都是针对于单表的,很显然,使用 minus 进行单表操作是不具备优势的,其通常用于找出 A 表中的某些字段在 B 表中不存在对应记录的情况。比如我们拥有另外一个表 t_user2,其拥有和 t_user 表一样的表结构,那么如下语句可以找出除 id 外,在 t_user 表中存在,而在 t_user2 表中不存在的记录。
- select no,
- name,
- age,
- level_no from t_user minus select no,
- name,
- age,
- level_no from t_user2;
来源: