一、并集UNION/UNION ALL
1、 UNION运算符返回两个集合去掉重复元素后的所有记录。与or运算符达到相同的效果。
举例:首先利用or查询数据:
SQL>select empno,ename from emp where ename like '%A%' or ename like '%M%';
EMPNO ENAME
--------------------
7369 SMITH
7499 ALLEN
7521 WARD
7654 MARTIN
7698 BLAKE
7782 CLARK
7876 ADAMS
7900 JAMES
7934 MILLER
已选择9行。
然后使用union运算符取得以上面两个恶条件分别查询的的并集,与上面进行对比:
SQL>select empno,ename from emp where ename like '%A%'
2 union
3 select empno,ename from emp where ename like '%M%';
EMPNO ENAME
--------------------
7369 SMITH
7499ALLEN
7521 WARD
7654 MARTIN
7698 BLAKE
7782 CLARK
7876 ADAMS
7900 JAMES
7934 MILLER
已选择9行。
2、UNION ALL 返回两个集合的所有记录,包括重复的,也就是说利用这个运算符会将先后查到的所有的记录都输出,包括重复的部分。
SQL>select empno,ename from emp where ename like '%A%'
2 union all
3 select empno,ename from empwhere ename like '%M%';
EMPNO ENAME
--------------------
7499 ALLEN
7521 WARD
7654 MARTIN
7698 BLAKE
7782 CLARK
7876 ADAMS
7900 JAMES
7369 SMITH
7654 MARTIN
7876 ADAMS
7900 JAMES
EMPNO ENAME
---------- ----------
7934 MILLER
已选择12行。
二、交集INTERSECT (运算符返回同时属于两个集合的记录)
举例说明:
先分别以两个条件查出相应的数据:
1、查询出emp表中薪资sal在700到1300之间的数据:
SQL>select ename,sal from emp where sal between 700 and 1300
ENAME SAL
---------------
SMITH 800
WARD 1250
MARTIN 1250
ADAMS 1100
JAMES 950
MILLER 1300
已选择6行。
2、 查询出emp表中薪资sal在1200 到1400之间的数据:
SQL>select ename,sal from emp where sal between 1200 and 1400;
ENAME SAL
---------------
WARD 1250
MARTIN 1250
MILLER 1300
然后利用INTERSECT查询交集,与上面的进行比较:
SQL>select ename,sal from emp where sal between 1200 and 1400
2 intersect
3 select ename,sal from emp where sal between 700 and 1300;
ENAME SAL
---------------
MARTIN 1250
MILLER 1300
WARD 1250
三、差集MINUS
差值返回属于第一个集合但不属于第二个集合的记录。同样以上个查询为例,利用MINUS可以得到薪资在700到1200之间的数据。
SQL>select ename,sal from emp where sal between 700 and 1300
2 minus
3 select ename,sal from emp where sal between1200 and 1400;
ENAME SAL
---------------
ADAMS 1100
JAMES 950
SMITH 800
四、集合运算的注意事项:
1、查询语句中前后的select语句的查询参数的类型名称个数都要一致否则会报错。
例如:
SQL> select ename,sal from emp where sal between1200 and 1400
2 union
3 select comm,ename from emp where sal between 799 and 1200;
select ename,sal from emp where salbetween 1200 and 1400
*
第 1 行出现错误:
ORA-01790:表达式必须具有与对应表达式相同的数据类型
3、 可以使用括号改变集合执行的顺序
3、集合采用第一个语句的表头作为表头
4、如果有order by子句,只能出现在最后一个select语句之后,第一个select语句接受的列名称或者别名roder by**(查询结果的列名)必须与第一个select语句的列名一致
SQL>select ename,sal from emp where sal between 700 and 1300
2 union
3 select ename,sal from emp where sal between 1200 and 1400;
ENAME SAL
---------------
ADAMS 1100
JAMES 950
MARTIN 1250
MILLER 1300
SMITH 800
WARD 1250
已选择6行。