目录
6、order by 子句中可使用 select 子句中未使用的列和聚合函数
常见的5个聚合函数:count()、sum()、avg()、max()、min(),聚合函数,就是将多行汇总为1行,输入多行,输出一行。
- select count(*) # 计算全部数据的行数
-
- # 计算null之外的数据的行数
- select count(purchase_price) # 计算某一列的非空行数
count函数的结果根据参数的不同而不同,count(*)会得到包含null的数据行数,count(<列名>)会得到null之外的数据行数。
sum函数即使包含null,也可以算出合计值。
聚合函数会在计算前将null排除在外。但count(*)例外,并不会排除null。
avg函数计算前也会先剔除null值。
sum和avg只能对数值类型的列使用,而max和min几乎适用于所有数据类型的列。
- select count(distinct product_type)
- from product
注意,这时候distinct必须写在括号中,因为在计算行数之前要删除product_type列中的重复数据;在所有的聚合函数中都可以使用distinct函数,删除重复数据。
group by 子句中指定的列称为聚合键或者分组列。
当聚合键中包含null时,也会将null作为一组特定的数据进行分组,且在结果中会以“不确定”行(空行)的形式展现出来。
常见错误1:在select子句中书写了多余的列,也就是把聚合键之外的列名书写在了select子句中
- select
- product_name
- ,purchase_price
- ,count(*)
- from product
- group by purchase_price
这样写会报错,“product_name必须包含在group by 子句之中,或者必须在聚合函数内使用”
常见错误2:在group by 子句中写了列的别名,这是执行顺序的问题。
group by 子句结果的显示是无序的。
常见错误3:在where 子句中使用聚合函数
只有select 子句和having 子句(以及order by子句)中能使用count等聚合函数。
在where 子句中不能使用聚合函数,要想对聚合结果进行限制,要是有group by 和having。
- select
- product_type
- ,count(*)
- from product
- group by product_type
- having count(*) = 2
having子句中能够使用的3种要素:常数;聚合函数;group by 子句中指定的列名(即聚合键)
错误写法
- select
- product_type
- ,count(*)
- from product
- group by product_type
- having product_name = '圆珠笔’
product_name 必须包含在group by 子句中,或者必须在聚合函数中使用。
- select
- product_type
- ,count(*)
- from product
- group by product_type
- having product_type = '衣服'
-
- select
- product_type
- ,count(*)
- from product
- where product_type = '衣服'
- group by product_type
聚合键所对应的条件写在having和where子句中返回的结果是一样的,但是笔者认为,聚合键所对应的条件还是应该书写在where子句之中,原因有二:
1.where子句和having子句的作用不同,having子句用来指定“组”的条件的,where子句用来指定“行”所对应的条件,这样,select语句可以分清两者各自的功能,理解起来也更容易。
2.DBMS的内部实现,where执行速度快拍了张图,以后补充,
不论何种情况,order by 子句都要写在select语句的末尾,因为对数据进行排序的操作必须在结果即将返回时执行。order by 子句中书写的列名称为排序键。
默认时 asc 升序 ;desc 是降序
之前说过不能对 NULL 使用比较运算符,也就是说不能对 NULL 和数字进行排序,也不能与字符串和日期比较大小,因此,使用含有 NULL 的列作为排序键时,NULL 会在结果的开头或末尾汇总显示。
group by 里不能使用 select 里的别名,但是在 order by 里是允许使用的,因为,SQL 语句在DBMS 内部的执行顺序被掩盖起来了。(我理解是 select 语句执行顺序在 order by 之前)。
1.order by 子句中可以使用存在于表中,但不在 select 子句中的列
- select
- product_name
- ,sale_price
- ,purchase_price
- from Product
- order by product_id
- # product_id 存在于 Product 表中
2.order by 子句中也可以使用聚合函数
order by 3 desc,1
不推荐使用,1.代码阅读起来比较难;2.该排序功能将来会被删除,可能会导致原本正常执行的 SQL 语句突然出错。
——————————————————————————————————————————
点击链接 查看 SQL 专栏更多文章:https://blog.csdn.net/weixin_46249441/category_11913899.html?spm=1001.2014.3001.5482