精华内容
下载资源
问答
  • 2021-03-13 22:49:21

    Oracle有很多值得学习的地方,这里我们主要介绍Oracle UNION ALL,包括介绍UNION等方面。通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。假如有column没有被索引,查询效率可能会因为您没有选择OR而降低。在下面的例子中,LOC_ID 和REGION上都建有索引。

    高效:

    SELECT LOC_ID 。 LOC_DESC ,REGION FROM LOCATION WHERELOC_ID=10UNION SELECT LOC_ID ,

    LOC_DESC ,REGION FROM LOCATION WHEREREGION= “MELBOURNE”

    低效:

    SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERELOC_ID=10ORREGION= “MELBOURNE”

    用IN来替换OR:

    这是一条简单易记的规则,但是实际的执行效果还须检验,在Oracle8i下,两者的执行路径似乎是相同的:

    低效:

    SELECT…. FROM LOCATION WHERELOC_ID=10ORLOC_ID=20ORLOC_ID=30

    高效:

    SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);

    避免在索引列上使用IS NULL和IS NOT NULL:

    避免在索引中使用任何能够为空的列,Oracle将无法使用该索引。对于单列索引,假如列包含空值,索引中将不存在此记录。对于复合索引,假如每个列都为空,索引中同样不存在此记录。假如至少有一个列不为空,则记录存在于索引中。举例:假如唯一性索引建立在表的A列和B列上,并且表中存在一条记录的 A,B值为(123,null), Oracle将不接受下一条具备相同A,B值(123,null)的记录(插入)。然而假如任何的索引列都为空,Oracle将认为整个键值为空而空不等于空。因此您能够插入1000 条具备相同键值的记录,当然他们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引。

    总是使用索引的第一个列:

    假如索引是建立在多个列上,只有在他的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引。这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引。

    用Oracle UNION ALL替换UNION ( 假如有可能的话):

    当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以Oracle UNION ALL的方式被合并,然后在输出最终结果前进行排序。假如用 Oracle UNION ALL替代UNION,这样排序就不是必要了。效率就会因此得到提高。需要注意的是,Oracle UNION ALL将重复输出两个结果集合中相同记录。因此各位还是要从业务需求分析使用Oracle UNION ALL的可行性。 UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存。对于这块内存的优化也是相当重要的。

    ===================================================================================

    Union和Union all用法

    UNION指令的目的是将两个SQL语句的结果合并起来。从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。 union只是将两个结果联结起来一起显示,并不是联结两个表

    UNION 的语法如下: [SQL 语句 1]

    UNION

    [SQL 语句 2] 假设我们有以下的两个表格,

    Store_Information 表格 store_name Sales Date

    Los Angeles $1500 Jan-05-1999

    San Diego $250 Jan-07-1999

    Los Angeles $300 Jan-08-1999

    Boston $700 Jan-08-1999

    Internet Sales 表格 Date Sales

    Jan-07-1999 $250

    Jan-10-1999 $535

    Jan-11-1999 $320

    Jan-12-1999 $750

    而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:

    SELECT Date FROM Store_Information

    UNION

    SELECT Date FROM Internet_Sales 结果:

    Date

    Jan-05-1999

    Jan-07-1999

    Jan-08-1999

    Jan-10-1999

    Jan-11-1999

    Jan-12-1999

    有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。

    SQL Union All

    UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。 UNION ALL 的语法如下: [SQL 语句 1]

    UNION ALL

    [SQL 语句 2] 我们用和上一页同样的例子来显示出 UNION ALL 和 UNION 的不同。同样假设我们有以下两个表格:

    Store_Information 表格 store_name Sales Date

    Los Angeles $1500 Jan-05-1999

    San Diego $250 Jan-07-1999

    Los Angeles $300 Jan-08-1999

    Boston $700 Jan-08-1999

    Internet Sales 表格 Date Sales

    Jan-07-1999 $250

    Jan-10-1999 $535

    Jan-11-1999 $320

    Jan-12-1999 $750

    而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的SQL语句:

    SELECT Date FROM Store_Information

    UNION ALL

    SELECT Date FROM Internet_Sales 结果:

    Date

    Jan-05-1999

    Jan-07-1999

    Jan-08-1999

    Jan-08-1999

    Jan-07-1999

    Jan-10-1999

    Jan-11-1999

    Jan-12-1999

    ============

    表1

    A B

    a 1

    b 0

    c 3

    d 0

    e 2

    表2

    A B

    c 0

    e 4

    合并两个表除去重复的数据(以表2的数据为主),我们将会得到以下的表:

    A B

    a 1

    b 0

    c 0

    d 0

    e 4

    select A,B from 表1 where A not in(select A from 表2)

    union

    select A,B from 表2

    值得注意的是,sql union all的执行效率要比sql union效率要高很多,这是因为,使用sqlunion需要进行排重,而sql union All是不需要排重的,这一点非常重要,因为对于一些单纯地使用分表来提高效率的查询,完全可以使用sql union All。

    还有,如果使用了union,无论是sql union还是sql union all一定要记住对数据库表加上索引!

    --合并重复行   select * from A   union    select * from B       --不合并重复行   select * from A   union all   select * from B       按某个字段排序   --合并重复行   select *   from (   select * from A   union    select * from B) AS T   order by 字段名   --不合并重复行   select *   from (   select * from A   union all   select * from B) AS T   order by 字段名   //sql server版   Select * From (   select top 2 id,adddate,title,url from bArticle where ClassId=1 order by adddate desc) A   Union All   Select * From (   select top 2 id,adddate,title,url from bArticle where ClassId=2 order by adddate desc) B   Union All   Select * From (   select top 2 id,adddate,title,url from bArticle where ClassId=3 order by adddate desc) C   Union All   Select * From (   select top 2 id,adddate,title,url from bArticle where ClassId=4 order by adddate desc) D   //mysql版   Select * From (   select id,adddate,title,url from bArticle where ClassId=1 order by adddate desc limit 0,2) A   Union All   Select * From (   select id,adddate,title,url from bArticle where ClassId=2 order by adddate desc limit 0,2) B   Union All   Select * From (   select id,adddate,title,url from bArticle where ClassId=3 order by adddate desc limit 0,2) C   Union All   Select * From (   select id,adddate,title,url from bArticle where ClassId=4 order by adddate desc limit 0,2) D

    更多相关内容
  • 一、UNIONUNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中...
  • 主要给大家介绍了关于MySQL中UNIONUNION ALL的基本使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来
  • UNION ALL 的使用方法

    2019-07-03 08:46:15
    SELECT ... UNION ALL SELECT C.TRD_NO FROM XXXXXXXXX C WHERE C.CLIENT_CD = W_IN_CLIENT_CD ) D WHERE A.TRD_NO = D.TRD_NO AND A.CLIENT_CD = W_IN_CLIENT_CD AND A.RESULT IS NULL ;
  • 主要介绍了MySQL如何使用union all获得并集排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • SQL中Union和Join语句非常类似,但是Union有一个限制条件:两个 SQL 语句所产生的栏位需要是同样的资料种类,最后的结果会看到不同的资料值。 格式: [SQL 语句 1] UNION [SQL 语句 2] 例如: 表store_info 和表...
  • OR、in和union all 查询效率到底哪个快? 网上很多的声音都是说union all 快于 or、in,因为or、in会导致全表扫描,他们给出了很多的实例。 但真的union all真的快于or、in? EXPLAIN SELECT * from employees ...
  • 关于SQL UNION 操作符 UNION 操作符用于合并... SQL UNION 语法(结果集没有重复值): 代码如下: SELECT s FROM table1 UNION SELECT s FROM table2 SQL UNION ALL 语法(结果集有重复的值): 代码如下: SELECT s FRO
  • 代码如下:–合并重复行 select * from A union select * from B –不合并重复行 select * from A union all select * from B 按某个字段排序 –合并重复行 select * from ( select * from A union select * from B) ...
  • 在数据库中,UNIONUNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。 MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算...
  • union 是对数据进行并集操作,不包括重复行,同时进行默认排序Union all 是对数据进行并集操作,包括重复行,不进行排序举例说明: 创建数据库表: CREATE TABLE `t_demo` ( `id` int(32) NOT NULL, `name` ...
  • SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中...SQL UNION ALL 语法SELECT
  • 当我们要对两个或两个以上的表进行操作时。我们经常会用到unionunion all
  • UNION指令的目的是将两个SQL语句的结果合并起来。从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料。
  • 本文带领大家通过5分钟了解MySQL5.7中union all用法的黑科技,需要的朋友可以参考下
  • 我们可以经常发现在处理SQL Server的时,很多人都会有一句出结果的习惯,但值得注意的是,不恰当的合并处理语句,往往会产生负面的性能,本文针对使用UNION ALL代替IF语句的合并处理做出一个简单的事例,用来说明...
  • Mssql UnionUnion All区别,场景示例说明
  • mysql的unionunion all

    千次阅读 2022-03-14 22:54:12
    1. sql中 unionunion all 的用法 如果我们需要将两个 select 语句的结果作为一个整体显示出来,我们就需要用到 union 或者 union all 关键字。union (或称为联合)的作用是将多个结果合并在一起显示出来。 ...

    1. sql中 union 和 union all 的用法

    如果我们需要将两个 select 语句的结果作为一个整体显示出来,我们就需要用到 union 或者 union all 关键字。union (或称为联合)的作用是将多个结果合并在一起显示出来。

    unionunion all 的区别是,union 会自动压缩多个结果集合中的重复结果,而 union all 则将所有的结果全部显示出来,不管是不是重复。

    union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表 union
    如下sql:

    SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
    UNION
    SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
    
    

    结果:
    001.png

    union all:对两个结果集进行并集操作,包括重复行,不进行排序; 如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
    如下sql:

    SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
    UNION ALL
    SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
    
    

    结果:
    002.png

    2. 注意事项

    2.1、UNION 和 UNION ALL 内部的 SELECT 语句必须拥有相同数量的列

    image.png

    2.2、每条 SELECT 语句中列的顺序必须相同

    • 先来说下,如果顺序不同,会是什么结果?
      答:结果字段的顺序以union all 前面的表字段顺序为准。
      union all 后面的表的数据会按照顺序依次附在后面。注意:按照字段顺序匹配,而不是按照字段名称匹配。

    • sql如下:顺序对结果的影响

    SELECT * 
    FROM(
    	SELECT msku,create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
    UNION ALL
    	SELECT create_time,msku FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK') t
    
    

    image.png

    综上:

    union all 结果字段的顺序以 union all 前面的表字段顺序为准。union all 后面的表的数据会按照字段顺序依次附在后面,而不是按照字段名称匹配。

    我们上面以*来表示顺序的不同,其实你写成不同顺序的字段结果一致。
    image.png

    3. union all 使用场景

    • sql 中的组合in,可用 union all 来代替,提高查询效率

    修改前:组合in sql

    SELECT ***, ***, ***, ***, ***
    FROM e_rating_info 
    WHERE rating_quantity <> 0 AND (***, ***) 
    IN (('***', '***'), ('***', '***'), 
    ('***', '***'), ('***', '***'), 
    ('***', '***'), ('***', '***'), 
    ('***', '***'), ('***', '***'), 
    ('***', '***'), ('***', '***')) 
    ORDER BY *** DESC
    
    

    修改后:UNION ALL sql

    <select id="queryRatingInfo" resultType="***">
            <foreach collection="ratingList" item="item" index="index" open="" separator="UNION ALL" close="">
                SELECT ***, ***, ***, ***, ***
                FROM e_rating_info
                WHERE rating_quantity &lt;&gt; 0
                AND country_code = #{item.***}
                AND asin = #{item.***}
            </foreach>
            ORDER BY *** DESC;
        </select>
    
    

    另外,如果系统中进行了分表,一定要保证各个表的字段顺序一致。特别是修改的时候。否则,如果使用 *汇总查询结果,肯定是会有问题的…亲身踩坑。

    展开全文
  • oracle中unionunion all区别与性能分析

    千次阅读 2021-05-08 07:53:35
    [ 概要 ]经常写sql的同学可能会用到unionunion all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并,那么二者有什么区别呢? 下面我们就简单的分析下.[ 比较 ]union: 对两个结果集进行并集操作, 不...

    [ 概要 ]

    经常写sql的同学可能会用到union和union all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并,

    那么二者有什么区别呢? 下面我们就简单的分析下.

    [ 比较 ]

    union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序;

    union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;

    下面我们举一个简单的例子来证明上面的结论:

    1. 准备数据:

    drop table student;

    create table student

    (

    id int primary key,

    name nvarchar2(50) not null,

    score number not null

    );

    insert into student values(1,‘Aaron‘,78);

    insert into student values(2,‘Bill‘,76);

    insert into student values(3,‘Cindy‘,89);

    insert into student values(4,‘Damon‘,90);

    insert into student values(5,‘Ella‘,73);

    insert into student values(6,‘Frado‘,61);

    insert into student values(7,‘Gill‘,99);

    insert into student values(8,‘Hellen‘,56);

    insert into student values(9,‘Ivan‘,93);

    insert into student values(10,‘Jay‘,90);

    commit;

    2. 比较不同点

    查询比较①

    -- union all

    select * from student where id 

    union all

    select * from student where id > 2 and id 

    -- union

    select * from student where id 

    union

    select * from student where id > 2 and id 

    union all 查询结果:

    17858a1fd7c0e4634c78bb9607fc3cce.png

    union 查询结果:

    fd8a8a5dd58b27e29308b8512cc58fc8.png

    通过比较不难看出, union all不会去掉重复记录, 而union去掉了重复的记录.

    查询比较②

    -- union all

    select * from student where id > 2 and id 

    union all

    select * from student where id 

    -- union

    select * from student where id > 2 and id 

    union

    select * from student where id 

    union all 查询结果:

    dcec91ae81232a4aa8e6e7bd535f2b74.png

    union 查询结果:

    ac05bc33ba4d82a4b1029e7498647657.png

    通过比较不难看出, union all会按照关联的次序组织数据, 而union会依据一定的规则进行排序.

    那么这个规则是什么呢? 我们通过下面的查询得出规律:

    -- union

    select score,id,name from student where id > 2 and id 

    union

    select score,id,name from student where id 

    a18f0923b79f391316473c55fe1c3fd3.png

    结论: 按照字段出现的顺序进行排序, 之前的查询相当于order by id, name, score, 刚刚的查询相当于order by score, id, name.

    [ 总结 ]

    1.  因为union all仅仅是简单的合并查询结果, 并不会做去重操作, 也不会排序, 所以union all效率要比union高.

    所以在能够确定没有重复记录的情况下, 尽量使用union all.

    2. 通常如果表有多个索引列时, 用union替换where子句中的or会起到较好的效果, 索引列使用or会造成全表扫描.

    注意: 以上规则只针对多个索引列有效, 假如有column没有被索引, 那还是用or吧.

    例如: 还是使用上面的例子, 假定name和score上建有索引.

    1 -- 高效2 select id, name, score from student where name like ‘%y%‘3 union4 select id, name, score from student where score between 80 and 905

    6 -- 低效7 select id, name, score from student where name like ‘%y%‘ or score between 80 and 90

    展开全文
  • union all与order by用法

    2012-12-19 09:33:19
    union all与order by用法,并详细举例,oracle pl/sql
  • MySQL:UNIONUNION ALL以及7种SQL JOINS的实现

    千次阅读 多人点赞 2021-12-13 11:26:08
    MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替。 合并查询结果 ...各个SELECT语句之间使用UNIONUNION ALL关键字分隔。 语法格式: SELECT column,... FROM table1 UNION [ALL] SELEC..

    在这里插入图片描述

    写在开头:跟随B站的康师傅学习mysql的笔记摘要和自我总结。

    前言:

    • 虽然MySQL不支持FULL JOIN(满外连接),但是可以用 LEFT JOIN UNION RIGHT JOIN代替。

    • 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

    语法格式:

    SELECT column,... FROM table1
    UNION [ALL]
    SELECT column,... FROM table2
    

    UNION操作符

    在这里插入图片描述

    UNION 操作符返回两个查询的结果集的并集,去除重复记录

    UNION ALL操作符

    在这里插入图片描述
    UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

    注意:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

    举例:查询部门编号>90或邮箱包含a的员工信息

    #方式1
    SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;
    
    #方式2
    #一个员工可能符合所有条件,所以要去重
    SELECT * FROM employees  WHERE email LIKE '%a%'
    UNION
    SELECT * FROM employees  WHERE department_id>90;
    

    举例:查询中国用户中男性的信息以及美国用户中年男性的用户信息

    #由题目可知,该两者之间无任何关联,所以不用去重,UNION ALL 效率高
    SELECT id,cname FROM t_chinamale WHERE csex='男'
    UNION ALL
    SELECT id,tname FROM t_usmale WHERE tGender='male';
    

    7种SQL JOINS的实现(重点!)

    • 7种SQL JOINS 可以归纳为以下图形:

    在这里插入图片描述

    代码实现

    以employees表和departments表为例:

    #中图:内连接(A B 共有)
    SELECT employee_id,last_name,department_name
    FROM employees e JOIN departments d
    ON e.`department_id` = d.`department_id`;
    
    #左上图:左外连接(A 的全集)
    SELECT employee_id,last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.`department_id` = d.`department_id`;
    
    #右上图:右外连接(B 的全集)
    SELECT employee_id,last_name,department_name
    FROM employees e RIGHT JOIN departments d
    ON e.`department_id` = d.`department_id`;
    
    #左中图:(A 的独有)
    SELECT employee_id,last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE d.`department_id` IS NULL
    
    #右中图:(B 的独有)
    SELECT employee_id,last_name,department_name
    FROM employees e RIGHT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE e.`department_id` IS NULL
    
    #左下图:满外连接
    SELECT employee_id,last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE d.`department_id` IS NULL
    UNION ALL  #没有去重操作,效率高
    SELECT employee_id,last_name,department_name
    FROM employees e RIGHT JOIN departments d
    ON e.`department_id` = d.`department_id`;
    
    #右下图(A 的独有 + B 的独有)
    SELECT employee_id,last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE d.`department_id` IS NULL
    UNION ALL
    SELECT employee_id,last_name,department_name
    FROM employees e RIGHT JOIN departments d
    ON e.`department_id` = d.`department_id`
    WHERE e.`department_id` IS NULL
    

    课后练习题加强:

    t_dept表、t_emp表如图所示:
    在这里插入图片描述

    #例题1.所有有门派的人员信息 ( A、B两表共有) 
    SELECT t1.* 
    FROM t_dept t1 INNER JOIN t_emp t2
    ON t1.`id` = t2.`id`;
    
    #例题2.列出所有用户,并显示其机构信息 (A的全集) 
    SELECT t1.* 
    FROM t_emp t1 LEFT JOIN t_dept t2
    ON t1.`id` = t2.`id`;
    
    #例题3.列出所有门派 (B的全集) 
    SELECT *
    FROM t_dept ;
    
    #例题4.所有不入门派的人员 (A的独有) 
    SELECT t1.*
    FROM t_emp t1 LEFT JOIN t_dept t2
    ON t1.`id` = t2.`id`
    WHERE t2.`id` IS NULL;
    
    #例题5.所有没人入的门派 (B的独有)
    SELECT t1.*
    FROM t_dept t1 LEFT JOIN t_emp t2
    ON t1.`id` = t2.`id`
    WHERE t2.id IS NULL;
    
    #例题6.列出所有人员和机构的对照关系(AB全有)
    SELECT * 
    FROM t_emp A  LEFT JOIN t_dept B
    ON A.deptId = B.id 
    UNION 
    SELECT * 
    FROM t_emp A  RIGHT JOIN t_dept B 
    ON A.deptId = B.id
    
    #查询结果:
    +------+----------+------+--------+--------+------+----------+---------+
    | id   | name     | age  | deptId | empno  | id   | deptName | address |
    +------+----------+------+--------+--------+------+----------+---------+
    |    1 | 风清扬   |   90 |      1 | 100001 |    1 | 华山     | 华山    |
    |    2 | 岳不群   |   50 |      1 | 100002 |    1 | 华山     | 华山    |
    |    3 | 令狐冲   |   24 |      1 | 100003 |    1 | 华山     | 华山    |
    |    4 | 洪七公   |   70 |      2 | 100004 |    2 | 丐帮     | 洛阳    |
    |    5 | 乔峰     |   35 |      2 | 100005 |    2 | 丐帮     | 洛阳    |
    |    6 | 灭绝师太 |   70 |      3 | 100006 |    3 | 峨眉     | 峨眉山  |
    |    7 | 周芷若   |   20 |      3 | 100007 |    3 | 峨眉     | 峨眉山  |
    |    8 | 张三丰   |  100 |      4 | 100008 |    4 | 武当     | 武当山  |
    |    9 | 张无忌   |   25 |      5 | 100009 |    5 | 明教     | 光明顶  |
    |   10 | 韦小宝   |   18 |   NULL | 100010 | NULL | NULL     | NULL    |
    | NULL | NULL     | NULL |   NULL |   NULL |    6 | 少林     | 少林寺  |
    +------+----------+------+--------+--------+------+----------+---------+
    
    #例题7.列出所有没入派的人员和没人入的门派(A的独有 + B的独有)
    SELECT * 
    FROM t_emp A  LEFT JOIN t_dept B 
    ON A.deptId = B.id 
    WHERE B.`id` IS NULL 
    UNION ALL
    SELECT * 
    FROM t_emp A  RIGHT JOIN t_dept B 
    ON A.deptId = B.id 
    WHERE A.`deptId` IS NULL;
    
    #查询结果;
    +------+--------+------+--------+--------+------+----------+---------+
    | id   | name   | age  | deptId | empno  | id   | deptName | address |
    +------+--------+------+--------+--------+------+----------+---------+
    |   10 | 韦小宝 |   18 |   NULL | 100010 | NULL | NULL     | NULL    |
    | NULL | NULL   | NULL |   NULL |   NULL |    6 | 少林     | 少林寺  |
    +------+--------+------+--------+--------+------+----------+---------+
    

    爱在结尾:1、UNION ALL 效率比 UNION 高,尽量使用 UNION ALL。 2、若查询A表中独有的数据,查询条件的 is (not) null 对应的字段应该选择B表中为非空的字段。 3、left join (right join) 要理解其作用:在不加筛选条件下,用left join 可以查到所有的字段。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 218,934
精华内容 87,573
关键字:

Union all