MySQL中的ALL字段

2 篇文章 0 订阅

ALL字段不是单独出现的,而是和一些其他字段配合使用,例如UNION、聚合函数的参数。

 

假设存在如下【Products】表:

 

、在聚合函数如SUM,MAX,MIN,AVG等中,ALL是默认行为:

select sum(prod_price) from products where vend_id=1003;	# 92.49
select sum(DISTINCT prod_price) from products where vend_id=1003;	# 79.99

select sum(ALL prod_price) from products where vend_id=1003;	# 92.49

可以看到,第一条查询的结果比第二条结果多了,10+2.5。

那么这10+2.5去哪儿了呢?看原数据表,vend_id为1003的商品中,有两件单价为2.5的商品,两件单价为10的商品。

而在第二条查询中,使用了DISTINCT行为,过滤掉了prod_price相同的商品价格。

而在第一条查询中,使用的默认ALL行为,以及第三条查询中显式指定ALL行为,会保留所有的价格信息。

同样在MAX,MIN,AVG,COUNT中也存在默认ALL行为,只是在MAX,MIN中,结果总是唯一值,有无DISTINCT结果总是一样的,无实际意义。

二、在UNION中是否保留重复行

与聚合函数中的默认ALL行为恰好相反,在UNION中不会保留重复信息。如:

select * from products where vend_id=1001
UNION
select * from products where prod_price>10;

查看原数据表可以发现商品【ANV03】既属于vend_id=1001的查询,也属于prod_price>10的查询,但在结果中仅保留了一次。

如果我们加入ALL关键字:

可以看到此时,商品【ANV003】出现了两次。

UNION几乎与多个WHERE条件的查询完成相同的工作。但UNION ALL作为UNION的另一种形式,可以完成部分WHERE完成不了的任务。如果确实需要每个条件的匹配行全部出现(包括重复行),则必须使用UNION ALL而不是WHERE。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值