当前位置:   article > 正文

MYSQL用法(三) UNION,UNION ALL 用法_mysql union all

mysql union all

一  知识点

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

即 UNION在进行表连接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。    

UNION 语法:

SELECT 字段名FROM 表1  UNION    SELECT 字段名 FROM 表2;

这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序

UNION ALL 语法:

SELECT 字段名FROM 表1  UNION  ALL  SELECT 字段名 FROM 表2;

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
注意:

1、UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名  

2、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。

     同时,每条 SELECT 语句中的列的顺序必须相同。

3、 一般地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

二  举例

2.1   UNION 用法

mysql > SELECT   A.USER_ID, A.USER_NAME   FROM  a AS A
UNION   SELECT   B.PRODUCT_ID,B.PRODUCT_NAME  FROM b AS B

mysql > SELECT  T.*   FROM (  SELECT  A.USER_ID, A.USER_NAME  FROM  a AS A
UNION  SELECT  B.PRODUCT_ID, B.PRODUCT_NAME  FROM  b AS B ) AS T



2.2 UNION ALL 用法

mysql > SELECT  T.*   FROM (  SELECT  A.USER_ID, A.USER_NAME  FROM  a AS A
 UNION ALL  SELECT  B.PRODUCT_ID, B.PRODUCT_NAME  FROM  b AS B ) AS T



三   注意事项

union:联合的意思,即把两次或多次查询结果合并起来。

要求:两次查询的列数必须一致
推荐:列的类型可以不一样,但推荐查询的每一列,想对应的类型以一样可以来自多张表的数据:

多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准。

如果不同的语句中取出的行,有完全相同(这里表示的是每个列的值都相同),那么union会将相同的行合并,最终只保留一行。也可以这样理解,union会去掉重复的行。

如果不想去掉重复的行,可以使用union all。如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选。

如: 

mysql > (select * from a order by product_id) union (select * from b order product_id);

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


四   使用实例

1)查询两张表的集合,求和

语法: 已知 表A,表B两张表 

select * from (select column AS col from A where 查询条件 ) AS a  UNION ALL (select column AS col from B where 查询条件) ORDER by 排序字段 limit 0,20

  1. SELECT
  2. *
  3. FROM
  4. (
  5. SELECT
  6. RECHARGE_MENOY AS trande_money,
  7. '充值' AS trande_type,
  8. RECHARGE_STATUS AS trande_status,
  9. RECHARGE_TIME AS trande_time
  10. FROM
  11. AC_RECHARGE
  12. WHERE
  13. RECHARGE_USERID = 'c3f19f5deef044fd91c933012327ef85'
  14. AND (
  15. CREATE_GMT > '2014-09-25 15:09:49'
  16. OR UPDATE_GMT > '2014-09-25 15:09:49'
  17. )
  18. AND (
  19. CREATE_GMT < '2015-03-25 15:09:49'
  20. OR UPDATE_GMT < '2015-03-25 15:09:49'
  21. )
  22. ) AS a
  23. UNION ALL
  24. (
  25. SELECT
  26. CASH_MENOY AS trande_money,
  27. '提现' AS trande_type,
  28. CASH_STATUS AS trande_status,
  29. UPDATE_GMT AS trande_time
  30. FROM
  31. AC_CASH
  32. WHERE
  33. CASH_USERID = 'c3f19f5deef044fd91c933012327ef85'
  34. AND (
  35. CREATE_GMT > '2014-09-25 15:15:09'
  36. OR UPDATE_GMT > '2014-09-25 15:15:09'
  37. )
  38. AND (
  39. CREATE_GMT < '2015-03-25 15:15:09'
  40. OR UPDATE_GMT < '2015-03-25 15:15:09'
  41. )
  42. )
  43. ORDER BY
  44. trande_time DESC
  45. LIMIT 0,20



2)统计两张表的个数,然后再求和

语法:

select sum(num) from (select count(*) as num from A where 查询条件 UNION ALL select count(*) as num from B where 查询条件) AS b

  1. SELECT
  2. sum(num)
  3. FROM
  4. (
  5. SELECT
  6. count(*) AS num
  7. FROM
  8. AC_RECHARGE
  9. WHERE
  10. RECHARGE_USERID = 'c3f19f5deef044fd91c933012327ef85'
  11. AND (
  12. CREATE_GMT > '2014-09-25 15:09:49'
  13. OR UPDATE_GMT > '2014-09-25 15:09:49'
  14. )
  15. AND (
  16. CREATE_GMT < '2015-03-25 15:09:49'
  17. OR UPDATE_GMT < '2015-03-25 15:09:49'
  18. )
  19. UNION ALL
  20. SELECT
  21. count(*) AS num
  22. FROM
  23. AC_CASH
  24. WHERE
  25. CASH_USERID = 'c3f19f5deef044fd91c933012327ef85'
  26. AND (
  27. CREATE_GMT > '2014-09-25 15:15:09'
  28. OR UPDATE_GMT > '2014-09-25 15:15:09'
  29. )
  30. AND (
  31. CREATE_GMT < '2015-03-25 15:15:09'
  32. OR UPDATE_GMT < '2015-03-25 15:15:09'
  33. )
  34. ) AS b

3)ibatis配置:




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/554672
推荐阅读
相关标签
  

闽ICP备14008679号