假设我们有一个表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,‘A’,78);
insert into student values(2,‘B’,76);
insert into student values(3,‘C’,89);
insert into student values(4,‘D’,90);
insert into student values(5,‘E’,73);
insert into student values(6,‘F’,61);
insert into student values(7,‘G’,99);
insert into student values(8,‘H’,56);
insert into student values(9,‘I’,93);
insert into student values(10,‘J’,90);
commit;
Union和Union All的区别:
--对于查询出来两个结果集_(求并集);求并集的指令:Union或Union all
select * from student where id < 4
union
select * from student where id > 2 and id < 6;
左边是 Union 结果集: 右边的是:Union all 结果集:
1 A 78 1 A 78
2 B 76 2 B 76
3 C 89 3 C 89
3 C 89
4 D 90 4 D 90
5 E 73 5 E 73
--Union默认对重复的记录不再操作显示,同时进行默认规则的排序
--若需要对结果集中重复操作显示,则使用 Union all 指令
--可以看到,Union和Union All的区别之一在于对重复结果的处理。
--Union(求并集) 、Minus(求差集)及Intersect(求交集)的操作和基本一致
- Minus(求差集) 操作含义: 将在第一个集合中 减去 第二个集合中的记录,产生的结果集即差结果集
或者说两个集合中不一样的元素所产生的集合结果。
Intersect(求交集)恰恰相反 两个集合中共同拥有的元素所产生的 交集结果集。
注意集合操作符号有以下限制:
- 对与LOB,VARRAY 和嵌套表来说,集合操作符是无效的。
- 对long列来说,Union、Intersect、Minus操作符是无效的。
集合操作的规范:
-两个查询的 SELECT 列表必须在个数上匹配
-第二个查询中的每个列的数据类型必须与第一个查询中相应列的数据类型匹配
-可以使用括号来改变执行的顺序
-ORDER BY 可以也只可以出现在整个语句的结尾。
-除了 UNION ALL 以外,其余的三个操作符都会消除结果集中的重复行。
-结果集使用第一个查询中的列名显示
-默认情况下,除 UNION ALL 外,输出以升序进行排序