zoukankan      html  css  js  c++  java
  • Mysql联合查询UNION和UNION ALL的使用介绍

    一、UNION和UNION ALL的作用和语法

    UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。
    UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。
    同时,每条 SELECT 语句中的列的顺序必须相同.
    SQL UNION 语法:

    复制代码代码如下:
    SELECT column_name FROM table1
    UNION
    SELECT column_name FROM table2


    注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行
    SQL UNION ALL 语法

    复制代码代码如下:
    SELECT column_name FROM table1
    UNION ALL
    SELECT column_name FROM table2


    注释:另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
    注意:1、UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名
    2、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同


    二、union的用法及注意事项

    union:联合的意思,即把两次或多次查询结果合并起来。
    要求:两次查询的列数必须一致
    推荐:列的类型可以不一样,但推荐查询的每一列,想对应的类型以一样
    可以来自多张表的数据:多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准。
    如果不同的语句中取出的行,有完全相同(这里表示的是每个列的值都相同),那么union会将相同的行合并,最终只保留一行。也可以这样理解,union会去掉重复的行。
    如果不想去掉重复的行,可以使用union all。
    如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选。
    如:

    复制代码代码如下:
    (select * from a order by id) union (select * from b order id);

    在子句中,order by 需要配合limit使用才有意义。如果不配合limit使用,会被语法分析器优化分析时去除。

    三、学习例子

    下面的例子中使用的原始表:
    Employees_China:

    复制代码代码如下:
    E_ID E_Name
    01 Zhang, Hua
    02 Wang, Wei
    03 Carter, Thomas
    04 Yang, Ming


    Employees_USA:

    复制代码代码如下:
    E_ID E_Name
    01 Adams, John
    02 Bush, George
    03 Carter, Thomas
    04 Gates, Bill

    使用 UNION 命令实例

    列出所有在中国和美国的不同的雇员名:

    复制代码代码如下:
    SELECT E_Name FROM Employees_China
    UNION
    SELECT E_Name FROM Employees_USA


    结果:

    复制代码代码如下:
    E_Name
    Zhang, Hua
    Wang, Wei
    Carter, Thomas
    Yang, Ming
    Adams, John
    Bush, George
    Gates, Bill


    注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。

    使用 UNION ALL 命令实例

    UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

    复制代码代码如下:
    SQL Statement 1
    UNION ALL
    SQL Statement 2

    实例:
    列出在中国和美国的所有的雇员:

    复制代码代码如下:
    SELECT E_Name FROM Employees_China
    UNION ALL
    SELECT E_Name FROM Employees_USA


    结果

    复制代码代码如下:
    E_Name
    Zhang, Hua
    Wang, Wei
    Carter, Thomas
    Yang, Ming
    Adams, John
    Bush, George
    Carter, Thomas
    Gates, Bill


    四、项目使用例子

    web项目中经常会碰到整站搜索的问题,即客户希望在网站的搜索框中输入一个词语,然后在整个网站中只要包含这个词的页面都要出现在搜索结果中。由于一个web项目不可能用一张表就全部搞定的,所以这里一般都是要用union联合搜索来解决整个问题的。

    下面列举一下本次使用的union联合搜索的sql语句:

    复制代码代码如下:

    select * from

    (SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND `subject` LIKE '%调整图片%' ORDER BY `add_time` DESC)

    as t1

    union all

    select * from

    (SELECT `id`,`class_name` AS `subject` FROM `web_class` WHERE `active`='1' AND `class_name` LIKE '%调整图片%' ORDER BY `class_id` DESC)

    as t2

    union

    select * from

    (SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND (`subject` LIKE '%调整%' OR `subject` LIKE '%图片%') ORDER BY `add_time` DESC)

    as t3;

    以上SQL语句的联合查询主要用到了union all和union,至于这两者的区别就是union all会列举所有符合条件的查询结果,而union会将所有符合条件的查询结果做一下去除重复结果的筛选。

    对于以上SQL语句的解释就是由于article表和web_class表分属两个不同的表,所以这里不用去除重复结果。然而以上联合查询的第三个分支的sql查询语句是由分词然后组合出来的查询语句,这条sql语句查询的结果是肯定包含第一个分支sql语句的查询结果的,这里就显得没必要了,所以没有使用all而去掉重复的查询结果。

  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8316753.html
Copyright © 2011-2022 走看看