sql语法基础,sql分组查询

本文深入解析SQL分组查询(groupby)的正确使用方法,包括常见错误示例及修正策略,强调了where语句与groupby的正确配合使用,以及聚合函数、别名和排序在groupby语句中的应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01分组查询–group by
格式:
SELECT 列名1,列名2,。。。
FROM 表名
GROUP BY 列名1,列名2.。。。
例一,按照商品种类统计一下行数

SELECT product_type,COUNT(*)
FROM   PRODUCT
GROUP BY product_type

在这里插入图片描述
例二按照商品编号统计,商品种类以及行数

SELECT product_type,COUNT(*)
FROM PRODUCT
GROUP BY product_id

在这里插入图片描述
错误原因是没有弄清group by执行路线:
sql先按照group by进行分组,然后执行select语句
可以理解成select语句是group by的子句
这就要求select中的内容在group by语句中都要有

改正

SELECT product_id,product_type,COUNT(*)
FROM PRODUCT
GROUP BY product_id,product_type

在这里插入图片描述
02where语句和group by并用
格式:
SELECT 列名1,列名2,列名3.。。。
FROM 表名
WHERE
GROUP BY 列名1,列名2,列名3
思考where能和group by 交换位置吗?
例三查询衣服的相关信息,并且按照进价进行分组

SELECT purchase_price,COUNT(*)
FROM PRODUCT
GROUP BY purchase_price
WHERE product_type = '衣服'

执行
在这里插入图片描述
想想看错误原因是什么呢?
分组查询出来的数据,是根据查询结果进行分组的。
也就是说对于限定查询结果的where,一定要在group by的前面。
也可以从执行路线角度理解
前面提到group by执行路线
sql先按照group by的条件进行分组,然后执行select语句。
即**from→where→group by →select。
故where一定要group by前面。

改正例三

'SELECT purchase_price,COUNT(*)
FROM PRODUCT
WHERE product_type = '衣服'
GROUP BY purchase_price

在这里插入图片描述

03与group by 相关常见错误
错误一:

SELECT purchase_price,sale_price,COUNT(*)
FROM PRODUCT
WHERE product_type = '衣服'
GROUP BY purchase_price
--在select语句中包含多余的列

在select语句中只能存在以下三种元素
常数,聚合函数,group by子句指定的列(聚合键)
在这里插入图片描述
按照执行路线
GROUP BY→select
可以发现聚合键和商品名并不是一一对应的(表中还存在多对这样的情况)

错误二

SELECT purchase_price AS PP,COUNT(*)
FROM PRODUCT
WHERE product_type = '衣服'
GROUP BY PP
--在group by语句中使用别名

错误原因:
按照执行路线
GROUP BY→select,即使命制了别名,group by还不知道呢

错误三

SELECT purchase_price ,COUNT(*)
FROM PRODUCT
WHERE product_type = '衣服'
GROUP BY ourchase_price.desc
--对分组进行排序

事实上分组的结果是按照随机顺序进行排序的,按照执行路线,如果想进行对结果排序,应该是对select进行附加条件

错误四


SELECT purchase_price ,COUNT(*)
FROM PRODUCT
WHERE COUNT(*)
GROUP BY ourchase_price
--不能对where使用聚合函数

事实上只有select和having语句能使用聚合函数
至于错误原因后面再讲

04聚合键中包含null
例四对进价进行分组查询,并统计行数

SELECT purchase_price ,COUNT(*)
FROM PRODUCT
GROUP BY purchase_price

执行

在聚合键中null会被认为是不确定,进而空出来或者显示null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值