zoukankan      html  css  js  c++  java
  • SQL中Union与Union All的区别

    在写SQL查询语句时,经常会碰到类似于这种的需求:查询年龄大于60岁的男职工以及所有出生于1950年的职工。在处理这种需求时,无法使用一条简单的SQL语句查询出所有满足条件的结果,此时就需要将这种需求划分为几个小的子需求,然后将子查询得到的结果集合合并即得到了满足查询条件的结果。为了处理类似于这种的需求,SQL提供了Union和Union All操作,如下所示:

    select * from employee  
    where gender='M' and year('2013-09-21')-year(birthday) > 60    
    union (all)    
    select *  from employee   
    where year(birthday)=1950   
    with ur;   --片段一  

    那么这两个操作有什么区别呢,请参看以下例子,为了验证该例子我们创建一个employee表并向其中添加一些数据,具体示例代码如下所示:

    create table employee(eid integer not null, birthday date not null,  
    gender char(1), name varchar(100), mbltel char(13), mail varchar(20); --片段2  
    insert into employee values  
    (1, '1989-01-01','M','李一','1345663221','1345663221@139.com'),  
    (2, '1952-01-01','M','李二','1345663331','1345663331@139.com'),  
    (3, '1951-01-01','F','李三','1345664311','1345664311@139.com'),  
    (4, '1950-01-01','M','李四','1345662111','1345662111@139.com'),  
    (5, '1950-07-01','F','李五','1345343221','1345343221@139.com');  --片段三  

    分别执行样例代码片段一中的Union和Union All操作,会出现以下结果:

    从上面查询得到的结果我们可以看出,Union All操作仅仅是简单的将两个子查询结果集直接求并操作,并不会剔除掉两者结果集中重复的部分,而Union操作除了会剔除掉结果集中重复的部分以外,还会对结果集进行排序(其实执行的实质逻辑应该是先将某一子结果集进行排序,然后再判断是否有重复的数据,若有则删除掉重复的数据)。

    小tips:由于Union需要对查询结果集进行排序操作,当数据量较大时,若非特殊需要,尽量不要使用Union操作,而改用Union All操作,然后对Union All出来的结果执行去重操作即可,这样会使得查询的效率大大的增强。

  • 相关阅读:
    CC3000 SmartConfig
    谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受
    CC3000 SPI接口编程介绍
    cc3000+LM3S9B96
    CC3000 主机驱动API介绍
    Wi-FiR CC3000 模块
    修改远程桌面连接端口及修改端口号后如何连接!
    电脑网线/水晶头的连接方法(A类,B类)
    快速切换IP的批处理!
    IE打开报错,提示该内存不能为read的解决办法!
  • 原文地址:https://www.cnblogs.com/huangjinyong/p/9135391.html
Copyright © 2011-2022 走看看