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。