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