sql server的Distinct与Group By的区别

文章讲述了SQLServer中Distinct和GroupBy两个关键字的作用,它们都用于数据去重,但GroupBy更常用于配合聚合函数处理分组后的数据。在查询性能上,两者在SQLServer中的表现大致相同,但在MySQL中,Distinct在索引下可能有更好性能。

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版本前的原因一样吧。

参考文献

sql server中Group By 官方说明文档
sql server中Distinct 官方说明文档

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值