一个查询就是一个集合:查询的结果集一条记录就是一个元素。
集合运算是用来把两个或多个查询的结果集做并、交、查的集合运算,包含集合运算的查询称为复合查询。*
Select 基本语法如下:
SELECT
column_1,
column_2,
…
FROM
table_name
WHERE
search_condition
ORDER BY
column_1,
column_2;
2.常用集合运算方式的应用
(1)联合运算: 联合运算实际是:结果集1加上结果集2的纪录。
两个表或多个表数据合并到一起。只有所选出的列数据类型匹配的查询才可以进行逻辑运算。
语法如下:
select 字段列表1 from 表1
UNION
select 字段列表2 from 表2
字段列表1 和字段列表2 数据类型一致,长度可以不一致,字段个数必须一致
在合并多个集合(表)的过程中,去掉表的重复记录。
(2)联合运算:是从每个查询返回包括所有重复的结果。
注意:使用union all会比union的速度快,因为省去了去除重复记录的时间。
语法如下:
select 字段列表1 from 表1
UNION all
select 字段列表2 from 表2
(3)相交运算(intersect),该运算不去重,默认升序。
该运算取两个集合的交集,相交运算返回多个查询中所有相同的行。
语法如下:
select 字段列表1 from 表1
INTERSECT
select 字段列表2 from 表2
(4)MINUS:结果集1中有,结果集2中没有的纪录。
语法如下:
select 字段列表1 from 表1
MINUS
select 字段列表2 from 表2
使用该操作时,注意以下加点:
1.选择的列数必须相同;
2.所选列的数据类型必须有相同的数据类型;
3.列的名称不必相同。
【例1】建立职工表,包括员工编号,姓名,薪水,电话号码。建立职工性别表,包括员工编号,姓名,薪水,电话,性别,然后插入测试数据。
要求: 取两个表的并集,有重复的记录也保留;
取两个表的并集,重复的记录需要去掉;
取两个表的交集;
取两个表的差集。
建表,插入数据,代码如下:
create table SM_EMP
( empid VARCHAR2(30),
name VARCHAR2(30),
salary NUMBER(6,2),
telno CHAR(8)
)
create table SM_EMP_SEX
( empid VARCHAR2(30) not null,
name VARCHAR2(30),
salary NUMBER(6,2),
telno CHAR(8),
sex CHAR(2)
)
INSERT INTO sm_emp VALUES(‘0000000001’,‘张飞飞’,5500,'6678562 ');
INSERT INTO sm_emp VALUES(‘0000000002’,‘关庭’,4500,‘87825626’);
INSERT INTO sm_emp VALUES(‘0000000003’,‘孙海’,6200,‘87783617’);
Commit;
INSERT INTO sm_emp_sex VALUES(‘000000001’,‘张飞飞’,5500,'6678562 ',‘男’);
INSERT INTO sm_emp_sex VALUES(‘000000002’,‘关庭’,4500,‘87825626’,‘女’);
INSERT INTO sm_emp_sex VALUES(‘000000006’,‘王兴悦’,6200,‘87783617’,‘女’);
Commit;
取两个表的并集,有重复的记录保留,代码如下:
select a.empid,a.name,a.salary,a.telno from sm_emp a
union all
select b.empid,b.name ,b.salary,b.telno from sm_emp_sex b
查询结果如图3-11所示:
图3-11职工表和性别表取并集的查询结果
2.取两个表的并合,重复的记录需要去掉,代码如下:
select a.empid,name from sm_emp a
union
select b.empid,b.name from sm_emp_sex b
查询结果如如图3-12所示:
图3-12职工表和性别表取并集并去重的查询结果
3.取两个表的交集,代码如下:
select a.empid,name,salary,a.telno from sm_emp a
INTERSECT
select b.empid,b.name ,salary,b.telno from sm_emp_sex b
查询结果如图3-13下:
图3-13职工表和性别表取并交集的查询结果
4.取两个表的差集,代码如下:
select a.empid,name,salary,a.telno from sm_emp a
MINUS
select b.empid,b.name ,salary,b.telno from sm_emp_sex b
查询结果如图3-14所示:
图3-14职工表和性别表取差集的查询结果