oracle 的 union union all intersect minus用法(转)

本文介绍了数据库查询中的集合操作,包括并集(Union)、不剔重并集(Union All)、交集(Intersect)和差集(Minus)。通过实例展示了这些操作在主修课程表和选修课程表上的应用。
集合操作有 并,交,差 3种运算。 

 union :得到两个查询结果的并集,并且自动去掉重复行。不会排序 

 union all:得到两个查询结果的并集,不会去掉重复行。也不会排序 

 intersect:得到两个查询结果的交集,并且按照结果集的第一个列进行排序 

 minus:得到两个查询结果的减集,以第一列进行排序 

例子: 

  下面是两个表:一个主修课程表,一个选修课程表。 

这个是主修课程表:minors 

     create table minors( 
         minor_id number primary key, 
         minor_name varchar2(30) not null, 
         credit_hour number(2) 
      ) 

插入3条记录:                

      insert into minors values(10101,'计算机原理',4) 
      insert into minors values(10201,'自动控制原理',3) 
      insert into minors values(10301,'工程制图原理',4) 

下面创建选修课程表minors2 

       create table minors2( 
         minor_id number primary key, 
         minor_name varchar2(30) not null, 
         credit_hour number(2) 
       ) 

插入两条记录: 
        insert into minors2 values(10201,'自动控制原理',3) 
       insert into minors2 values(10301,'工程制图原理',4)   


(1)
两个表使用union all:得到如下结果 

        select minor_id,minor_name,credit_hour from minors union all 
       select minor_id,minor_name,credit_hour from minors2 order by     credit_hour 

结果: 
    
MINOR_ID MINOR_NAME                     CREDIT_HOUR 
---------- ------------------------------ ----------- 
     10201 自动控制原理                             3 
     10201 自动控制原理                             3 
     10101 计算机原理                               4 
     10301 工程制图原理                             4 
     10301 工程制图原理                             4 



(2)
两个表使用union :得到如下结果 

select minor_id,minor_name,credit_hour from minors union 
    select minor_id,minor_name,credit_hour from minors2 order by credit_hour 

结果: 

MINOR_ID MINOR_NAME                     CREDIT_HOUR 
---------- ------------------------------ ----------- 
     10201 自动控制原理                             3 
     10101 计算机原理                               4 
     10301 工程制图原理                             4 



(3)
两个表使用intersect :得到如下结果 

     select minor_id,minor_name,credit_hour from minors intersect 
    select minor_id,minor_name,credit_hour from minors2 

结果: 

MINOR_ID MINOR_NAME                     CREDIT_HOUR 
---------- ------------------------------ ----------- 
     10201 自动控制原理                             3 
     10301 工程制图原理                             4 



(4)
两个表使用minus :得到如下结果 

    select minor_id,minor_name,credit_hour from minors minus 
    select minor_id,minor_name,credit_hour from minors2 

结果: 

MINOR_ID MINOR_NAME                     CREDIT_HOUR 
---------- ------------------------------ ----------- 
     10101 计算机原理                               4 
来自:http://www.douban.com/note/154030850/

转载于:https://www.cnblogs.com/Godblessyou/archive/2011/06/17/2083394.html

### SQL 中 UNIONUNION ALLINTERSECTMINUS 的区别及用法 #### 1. UNION `UNION` 操作符用于合并两个或多个 `SELECT` 语句的结果集。要求每个 `SELECT` 语句的列数必须相同,且对应列的数据类型也必须一致[^2]。此外,`UNION` 会自动去除重复的行。 **语法:** ```sql SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; ``` **示例:** ```sql SELECT empno, ename FROM emp WHERE deptno = 30 UNION SELECT empno, ename FROM emp WHERE job = 'MANAGER'; ``` #### 2. UNION ALL `UNION ALL` 与 `UNION` 类似,但不会去除重复的行,因此性能通常优于 `UNION`[^5]。它将所有结果集中的数据全部显示出来,包括重复项。 **语法:** ```sql SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2; ``` **示例:** ```sql SELECT empno, ename FROM emp WHERE deptno = 30 UNION ALL SELECT empno, ename FROM emp WHERE job = 'MANAGER'; ``` #### 3. INTERSECT `INTERSECT` 操作符返回两个查询结果集的交集,即同时存在于两个结果集中的记录。需要注意的是,`INTERSECT` 在某些数据库中不被支持(如 MySQL 和 PostgreSQL),但在 Oracle 和 SQL Server 中可用[^1]。 **语法:** ```sql SELECT column_name(s) FROM table1 INTERSECT SELECT column_name(s) FROM table2; ``` **示例:** ```sql SELECT empno FROM emp WHERE deptno = 30 INTERSECT SELECT empno FROM emp WHERE job = 'MANAGER'; ``` #### 4. MINUS `MINUS` 操作符返回第一个查询结果集中有但第二个查询结果集中没有的记录。与 `INTERSECT` 类似,`MINUS` 在某些数据库中也不被支持(如 MySQL 和 PostgreSQL),但在 Oracle 和 DB2 中可用。 **语法:** ```sql SELECT column_name(s) FROM table1 MINUS SELECT column_name(s) FROM table2; ``` **示例:** ```sql SELECT empno FROM emp WHERE deptno = 30 MINUS SELECT empno FROM emp WHERE job = 'MANAGER'; ``` #### 数据库兼容性总结 - `UNION` 和 `UNION ALL`:在大多数现代关系型数据库管理系统中通用,包括 Oracle、MySQL、SQL Server、PostgreSQL 和 DB2 等。 - `INTERSECT`:在 Oracle、SQL Server 和 DB2 中可用,但在 MySQL 和 PostgreSQL 中不直接支持。 - `MINUS`:在 Oracle 和 DB2 中可用,但在 MySQL 和 PostgreSQL 中不直接支持。对于不支持的数据库,可以通过其他方法(如 `LEFT JOIN` 和 `WHERE` 子句)实现类似效果[^1]。 #### 使用场景 - **UNION**:当需要合并两个结果集并去重时使用。 - **UNION ALL**:当需要快速合并两个结果集且不需要去重时使用。 - **INTERSECT**:当需要获取两个结果集的交集时使用。 - **MINUS**:当需要获取第一个结果集中有但第二个结果集中没有的记录时使用。 ### 示例代码对比 以下为一个完整的示例,展示四种操作的区别: ```sql -- 表 A CREATE TABLE A (id INT); INSERT INTO A VALUES (1), (2), (3); -- 表 B CREATE TABLE B (id INT); INSERT INTO B VALUES (2), (3), (4); -- UNION SELECT id FROM A UNION SELECT id FROM B; -- UNION ALL SELECT id FROM A UNION ALL SELECT id FROM B; -- INTERSECT SELECT id FROM A INTERSECT SELECT id FROM B; -- MINUS SELECT id FROM A MINUS SELECT id FROM B; ``` #### 结果分析 - **UNION**:返回 `[1, 2, 3, 4]`。 - **UNION ALL**:返回 `[1, 2, 3, 2, 3, 4]`。 - **INTERSECT**:返回 `[2, 3]`。 - **MINUS**:返回 `[1]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值