天天看点

函数的理解 group by order by理解

函数的分类

单行函数 对每一行记录都有作用 对每一行记录都能返回一个结果

例子lower(ename) 对每一个记录的ename字段都返回一个结果

多行函数

对一组记录返回一个结果

聚合函数就是多行函数

例子lower(ename)

select max(sal)from emp

常用的聚合函数

avg 取平均值

sum 取所有值之和

count(ename) 值的个数 不包含 ename=null的值

count(distinct ename)统计不重复的值

count(*)选中的行数

max() 最高值 适用于数值型 字符型和日期型的列

min()最低值

用聚合函数作用于某一字段时,会忽略所有的null行

group by 用于对查询的结果分组统计

要想把一个表中的记录分成若干组,就需要用group by

select name,sum(age) from student group by name 就是根据名字来分组的

重要的注意点::

select name,age from student group by name会报错 因为一个名字可能对应多个人 意思就是说会有多个age 这个时候 一个名字对应一行数据

但是age也只能对应一行 可实际上age可以有多个就有问题了 除非age放在聚合函数

having语句的使用

having子句不能出现字段的别名,只能使用字段最原始的名字,where和havingi样都不允许出现字段别名,只允许出现原始的字段名字

having是用来对分组后的数据进行进一步的过滤 所以使用having时通常先用group by 进行分组

比如 select deptno from emp group by deptno having deptno>10

having 里面的数据必须时select排序中有的 排序中没有的 应该放在where放在前面条件中就筛洗了

总结 having子句出现的字段必须是分组后整个组的总体信息

select deptno, avg(sal) as “平均工资”

from emp

group by deptno

having count(*) > 3 这种情况下 count没有出现在select却也可以出现在having 后面

having ename like ‘%A%’这种就不可以 因为ename没有出现在select中

order by

select *from emp order by deptno 按照deptno升序排序

select *from emp order by deptno desc按照deptno降序排序

select *from emp order by deptno,sal desc 按照deptno升序排序,如果deptno相等 就按照 sal降序排序

不允许再where 子句中使用分组函数实例

比如:

select deptno, avg(sal) “平均工资”, count(*) “部门人数”, sum(sal) “部门工资总和”

where avg(sal) > 2000 –error 因为where是对原始的数据过滤 不能使用聚合函数 因为还没有分组

having sum(sal) > 5000 就是会报错的,因为where有聚合函数

select语句的基本结构

select select_list

from table_list

join 如果有聚合函数 需要对聚合函数取别名

on

where 不能跟聚合函数

group by

having 后面不能跟别名

order by

where 子句是用来筛选由from子句指定的表的行

group by 是用来将where子句输出的行分组

select中只能写group by里面的列或者是表的整体信息,比如count avg之类的函数 前提是有group by

having 是用来筛选分组汇总的行

order by是用来控制最后显示的效果

在内连接里面 where要放在最后

继续阅读