sql语法基础,sql分组查询

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

sql语法基础,sql分组查询_第1张图片
错误原因是没有弄清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

sql语法基础,sql分组查询_第2张图片
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 = '衣服'

执行
sql语法基础,sql分组查询_第3张图片
想想看错误原因是什么呢?
分组查询出来的数据,是根据查询结果进行分组的。
也就是说对于限定查询结果的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子句指定的列(聚合键)
sql语法基础,sql分组查询_第4张图片
按照执行路线
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

你可能感兴趣的:(sql查询,分组查询)