暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql中union的用法

麦子酱OvO 2021-07-14
611

文章都是前一天晚上抽出固定时间写,第二天定点8:00准时推送,记录每日所学,所想,持续输入输出,不断分享,提升自己。

最近在写sql,要让两个表中结果值字段相加,首先我的sql如下:

SELECT
IFNULL( FIRST, 0 ) + IFNULL( SECOND, 0 ) AS 订单总金额
FROM
(
SELECT
*
FROM
(
SELECT
sum( osi.price * ( osi.notInC2MQuantity + osi.amountReturnQuantity ) ) AS FIRST
FROM
order_sale os
INNER JOIN order_sale_item osi ON os.id = osi.orderSaleId
WHERE
os.mallId = 11
AND os.payType = 4
AND os.buyerType = 3
AND os.state = 5
AND ( osi.notInC2MQuantity > 0 || osi.amountReturnQuantity > 0 )
) AS a,
(
SELECT
sum( osi.price * osi.quantity ) AS SECOND
FROM
order_sale os
INNER JOIN order_sale_item osi ON os.id = osi.orderSaleId
WHERE
os.mallId = 11
AND os.payType = 4
AND os.buyerType = 3
AND os.state IN ( 3, 4 )
) AS b
) c
sql解释如下:
  • 第一步先把其中一个表的数据取出来,取名为a
  • 第二步把另外一个表的数据取出来,取名为b
  • 第三步把这两个表最为一个临时表取名为c
  • 然后把临时表两列字段相加

以上sql虽然也可以得出结果,但是sql的可读性太差了。那有没有其他的方法呢?问了下后端,可以用union对两个表结果组合到一个结果集。查了下union官方的语法如下:

MySQL UNION 操作符语法格式:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
  • expression1, expression2, ... expression_n: 要检索的列。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选, 检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。
于是修改后的sql如下:
SELECT
sum( amount ) AS 订单总金额,
sum( quantity ) AS 订单总数量
FROM
(
SELECT
sum( osi.price * ( osi.notInC2MQuantity + osi.amountReturnQuantity ) ) AS amount,
count( DISTINCT sn ) AS quantity
FROM
order_sale os
INNER JOIN order_sale_item osi ON os.id = osi.orderSaleId
WHERE
os.mallId = 11
AND os.payType = 4
AND os.buyerType = 3
AND os.state = 5
AND ( osi.notInC2MQuantity > 0 || osi.amountReturnQuantity > 0 ) UNION
SELECT
sum( osi.price * osi.quantity ) AS amount,
count( DISTINCT sn ) AS quantity
FROM
order_sale os
INNER JOIN order_sale_item osi ON os.id = osi.orderSaleId
WHERE
os.mallId = 11
AND os.payType = 4
AND os.buyerType = 3
AND os.state IN ( 3, 4 )
) AS result2

上面的sql相比前一个是不是很清晰,一眼就看出是对两个表结果组合一个结果集,然后对这个结果集的两列字段求和。

如果文章对你有帮助,可以关注我,已坚持日更10/365


   

文章转载自麦子酱OvO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论