Oracle中的MINUS和UNION用法
MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有
的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存在于第一个 SQL 语句所产生的结果
内,那这笔资料就被抛弃。
MINUS 的语法如下:
[SQL 语句 1]
MINUS
[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
而我们要知道有哪几天是有店面营业额而没有网络营业额的。要达到这个目的,我们用以下的 SQL 语句:
SELECT Date FROM Store_Information
MINUS
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-08-1999
"Jan-05-1999", "Jan-07-1999", and "Jan-08-1999" 是 "SELECT Date FROM Store_Information" 所产生的结果。在这里面,"Jan-07-1999"
是存在于 "SELECT Date FROM Internet_Sales" 所产生的结果中。因此 "Jan-07-1999" 并不在最后的结果中。
请注意,在 MINUS 指令下,不同的值只会被列出一次。SQL中的UNION用法 UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度
来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是
同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。 UNION 的语法如下: [SQL 语
句 1]
UNION
[SQL 语句 2] 假设我们有以下的两个表格, 表格: Store_Informationstore_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 SalesDate 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好像也可以
你试一下吧,或是可以自动转换数据类型),其它是不行的, 还有几个表的列数必须相同
-------------------------------------------------------------------------------------------------------------------------------
假设我们有一个表Student,包括以下字段与数据:
drop table student;
create table student
(
id int primary key,
name nvarchar2(50) not null,
score number not null
);
insert into student values(1,'Aaron',78);
insert into student values(2,'Bill',76);
insert into student values(3,'Cindy',89);
insert into student values(4,'Damon',90);
insert into student values(5,'Ella',73);
insert into student values(6,'Frado',61);
insert into student values(7,'Gill',99);
insert into student values(8,'Hellen',56);
insert into student values(9,'Ivan',93);
insert into student values(10,'Jay',90);
commit;
Union和Union All的区别。
select *
from student
where id < 4
union
select *
from student
where id > 2 and id < 6
结果将是
1 Aaron 78
2 Bill 76
3 Cindy 89
4 Damon 90
5 Ella 73
如果换成Union All连接两个结果集,则返回结果是:
1 Aaron 78
2 Bill 76
3 Cindy 89
3 Cindy 89
4 Damon 90
5 Ella 73
可以看到,Union和Union All的区别之一在于对重复结果的处理。
接下来我们将两个子查询的顺序调整一下,改为
--Union
select *
from student
where id > 2 and id < 6
union
select *
from student
where id < 4
看看执行结果是否和你期望的一致?
--Union All
select *
from student
where id > 2 and id < 6
union all
select *
from student
where id < 4
那么这个呢?
据此我们可知,区别之二在于对排序的处理。Union All将按照关联的次序组织数据,而Union将进行依据一定规则进行排序。那么这个规则是?我们换个查询方式看看:
select score,id,name
from student
where id > 2 and id < 6
union
select score,id,name
from student
where id < 4
结果如下:
73 5 Ella
76 2 Bill
78 1 Aaron
89 3 Cindy
90 4 Damon
和我们预料的一致:将会按照字段的顺序进行排序。之前我们的查询是基于id,name,score的字段顺序,那么结果集将按照id优先进行排序;而现在新的字段顺序也改变了查询结果的排序。并且,是按照给定字段a,b,c...的顺序进行的order by。即结果是order by a,b,c...........的。我们看下一个查询:
select score,id,name
from student
where id > 2
union
select score,id,name
from student
where id < 4
结果如下:
56 8 Hellen
61 6 Frado
73 5 Ella
76 2 Bill
78 1 Aaron
89 3 Cindy
90 4 Damon
90 10 Jay
93 9 Ivan
99 7 Gill
可以看到,对于score相同的记录,将按照下一个字段id进行排序。如果我们想自行控制排序,是不是用order by指定就可以了呢?答案是肯定的,不过在写法上有需要注意的地方:
select score,id,name
from student
where id > 2 and id < 7
union
select score,id,name
from student
where id < 4
union
select score,id,name
from student
where id > 8
order by id desc
order by子句必须写在最后一个结果集里,并且其排序规则将改变操作后的排序结果。对于Union、Union All、Intersect、Minus都有效。
注意:
1,Union可以对字段名不同但数据类型相同的结果集进行合并;
2,如果字段名不同的结果集进行Union,那么对此字段的Order by子句将失效。
=================================================================================================================
Intersect和Minus的操作和Union基本一致,这里一起总结一下:
Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All,对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
可以在最后一个结果集中指定Order by子句改变排序方式
分享到:
相关推荐
交叉连接(CROSS JOIN)生成两个表的笛卡尔积,即所有可能的行组合。 IN和EXISTS子句用于查询条件筛选。IN子句用于检查某列的值是否在另一个查询的结果集中,而EXISTS则检查是否存在匹配的子查询结果。一般来说,当...
- **概览**:iSQL*Plus是Oracle提供的一款轻量级的SQL命令行工具,用于执行SQL语句并查看结果。 - **SQL 和 iSQL*Plus 交互作用**:通过iSQL*Plus可以执行各种SQL语句,并且可以设置环境变量来优化SQL语句的执行。...
- **iSQL*Plus概览**:iSQL*Plus是Oracle提供的一个命令行工具,用于执行SQL语句和脚本,并查看结果集。 - **SQL和iSQL*Plus交互作用**:通过iSQL*Plus,用户可以直接输入SQL语句并立即看到结果。它还支持一些特殊的...
在Oracle中,如果不使用任何连接条件,两个表之间就会发生笛卡尔积。例如: ```sql SELECT * FROM table1, table2; ``` 在给定的部分内容中,并未直接展示笛卡尔积的应用,但通过`CONNECT BY`和`START WITH`子句来...
- 交叉连接(CROSS JOIN):产生两表的笛卡尔积,如`CROSS JOIN`。 - 自然连接(NATURAL JOIN):基于共享的列自动连接,如`NATURAL JOIN`。 - `USING`子句:指定连接列,如`JOIN USING(deptno)`。 - `ON`子句:...
**联接查询(Join)**是指将两个或多个表的数据行按某种条件连接起来,形成一个新的结果集。在Oracle数据库中,联接查询可以分为以下几种类型: 1. **等值联接(Equijoin)** 2. **非等值联接(Non-Equijoin)** 3....
外连接用于返回两个表中即使连接条件不成立也仍然会返回一部分数据的结果集。 **1. 左外连接(Left Outer Join)** **定义:** 左外连接返回左表的所有记录,即使右表中没有匹配的数据也会返回。对于右表中没有...
5. **交叉连接(CROSS JOIN)**:也称为笛卡尔积,返回左表的每条记录与右表的每条记录的组合,除非明确指定连接条件,否则结果通常非常大。 在`at`这个关键字可能是指Oracle的`AT`时间点功能,它允许我们在特定的...
交叉连接也称为笛卡尔积,其主要功能是将两张表的所有行进行组合,产生一个新的结果集。这个结果集的行数等于两表行数的乘积。交叉连接适用于不需要根据任何条件来筛选数据的情况。 ```sql SELECT * FROM emp CROSS ...
- **HAVING子句**:用于过滤分组后的结果集。 **2.3 管理表** - **表概述** - 表是数据库中存储数据的基本单位,由一系列行和列组成。 - 每个表都属于一个模式。 - **数据完整性与约束条件** - **非空约束**...
- **交叉连接**:生成笛卡尔积。 - **自然连接**:自动匹配公共列进行连接。 - **INNER JOIN**:仅返回两张表中满足连接条件的行。 #### 7. DML语句 - INSERT:向表中插入新行。 - DELETE:删除满足条件的行。 - ...
这意味着第一个表中的每一行都会与第二个表中的每一行组合,形成一个巨大的结果集。例如,如果有20行的“EMPLOYEES”表和8行的“DEPARTMENTS”表,不加条件的连接会产生160行的组合结果。为了避免这种情况,你需要在...
- **5.2.1 使用单行子查询:** 子查询的结果集只有一行。 - **5.2.2 常见错误:** 如子查询返回多行时使用单行比较运算符导致的错误。 **5.3 多行子查询** - 使用多行比较运算符 `IN`, `ANY`, `ALL`。 **5.4 多...
- 使用`HAVING`子句来过滤分组后的结果集。 ```sql SELECT deptno, AVG(sal) FROM emp WHERE AVG(sal) > 2000 GROUP BY deptno; ``` ### 综合案例 - 显示非销售人员的工作名称以及从事同一工作的雇员的月工资...
- **SQL和iSQL*Plus交互作用:** 用户可以通过iSQL*Plus输入SQL语句,查看执行结果,并利用其提供的各种功能进行数据管理。 #### 三、约束和排序 **2.2 用选择限定行** - **限定语法:** 使用`WHERE`子句来限制...
**复合连接**:复合连接是指通过并、交、差等操作将多个结果集进行合并。 ##### 7.2.1 交叉连接(笛卡尔积) 交叉连接发生在没有有效的连接条件或条件被省略的情况下,结果是两个表的所有行的笛卡尔积。 **SQL99...
5. **交叉连接(Cross join)**:生成笛卡尔积的结果集。 6. **自然连接(Natural join)**:基于公共列自动进行连接。 7. **使用子句(Using clause)**:用于指定连接的公共列。 8. **全外连接(Full or two-sided...
在实际操作中,为了防止产生笛卡尔积,即没有有效连接条件时,所有表中的行进行交叉组合,导致大量无意义的结果,我们需要在`WHERE`子句中添加正确的连接条件。例如,如果`employees`表有20行,`departments`表有8行...
在PL/SQL中,全连接可以通过UNION操作结合左连接和右连接来实现,但请注意,这并不完全等同于直接使用FULL OUTER JOIN,因为顺序可能影响结果列的标题。 示例: ``` SELECT * FROM a Aa FULL OUTER JOIN b Bb ON...