sql server的Distinct与Group By的区别

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 官方说明文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值