sql server的Distinct与Group By的区别
Distinct
在sql server中,Distinct的作用是给查出来的数据进行去重,然后返回过滤出来的数据,进行展示。
当然,如果你Distinct的字段中,存在null的字段,Distinct也会让你去重的数据中只保留一个null数据。
比如:
通过语句:
SELECT
order_id,
SUM (
quantity * list_price * (1 - discount)
) net_value
FROM
sales.order_items
GROUP BY
order_id;
进行查询,查询结果为:
而,通过加入distinct对指定字段city去重:
SELECT DISTINCT
city
FROM
sales.customers
ORDER BY
city;
distinct对返回结果去重后,返回的数据变成:
可以从返回结果中很明显的看出,加上了distinct对指定的city去重后,结果返回的数据中再没有重复的city数据了。
Group by
在sql server中,Group by的作用与Distinct一致,都是对返回的结果进行去重,只是Group by更常用于需要使用函数对分组后的数据进行计算的时候。
当使用Group By,可以更便捷的使用Count(),Avg()此类函数对分组后的数据进行计算,但需要注意的是:如果要引用 GROUP BY 子句中未列出的列或表达式,则必须将该列用作聚合函数的输入。 否则,您将收到错误消息,因为无法保证列或表达式会为每个组返回一个值。
比如:
同样是使用这样一张表,查出来的数据为:
SELECT
customer_id,
YEAR (order_date) order_year
FROM
sales.orders
WHERE
customer_id IN (1, 2)
ORDER BY
customer_id;
得到的结果是:
现在通过Group by对它进行分组聚合:
SELECT
customer_id,
YEAR (order_date) order_year
FROM
sales.orders
WHERE
customer_id IN (1, 2)
GROUP BY
customer_id,
YEAR (order_date)
ORDER BY
customer_id;
从返回的结果中可以看出,根据 customer_id, YEAR (order_date) order_year这两个字段联合给数据进行了分组处理:
为了更了解分组后的每组的数据情况,所以我们额外添加了函数去对每组的情况进行统计:
SELECT
customer_id,
YEAR (order_date) order_year,
COUNT (order_id) order_placed
FROM
sales.orders
WHERE
customer_id IN (1, 2)
GROUP BY
customer_id,
YEAR (order_date)
ORDER BY
customer_id;
可以从图片中很明显的看出,每组的数据的一个统计结果。
Distinct与Group By的区别
官方文档想表达的意思是:Group by的作用与Distinct一致,都是对返回的结果进行去重,只是Group by更常用于需要使用函数对分组后的数据进行计算的时候。
我尝试通过Distinct、Group By分别对1000条数据使用非索引字段进行查询,查询所需时间大体一致;甚至Group By会更慢点,但相差不过一百来毫秒,确实可以说是没差别。
不过mysql和sql server不一样,我看别人的文档都说mysql的话,索引下查询Distinct会更快点,因为Group By会有隐藏查询逻辑,所以Group By比Distinct要慢,但Mysql 8.0版本对这个点进行了优化,所以 Distinct和Group By查询的速度差别不大。大概sql Server中Group By更慢的原因和MySql8.0版本前的原因一样吧。