日期:2014-05-16 浏览次数:20386 次
AVG --平均值
COUNT--返回不为空的记录总数
MAX--最大值
MIN--最小值
SUM--求和
select count(*) 员工数,sum(sal) 工资和,max(sal) 最高工资,min(sal) 最低工资,sum(comm)/count(*) 平均奖金,avg(comm) 平均奖金错 from emp
分组函数,会把null值的行排除在外(即分组函数会忽略空值null),因为comm中有空值,所以avg(comm)统计出来数据不对。
解决办法:
可以使用nvl来对包含空值列进行处理
select avg(nvl(comm,0)) 平均奖金 from emp;
COUNT(DISTINCT expr) 返回 expr非空且不重复的记录总数。
select count(distinct deptno) from emp;
不能在 WHERE 子句中使用组函数(注意)。
select * from emp where avg(sal)>2000(错误)
可以在 HAVING 子句中使用组函数。
select deptno from emp group by deptnohaving deptno=20;(正确)
使用group by 子句来进行分组数据,格式:
格式select 列1,统计函数1,统计函数n from 表名 where ... group by 列1,列2
注意:使用分组统计时,显示的列,必须是group by中的列名或者是分组统计结果,group by中有的列可以不显示。
select deptno, avg(sal) from emp group bydeptno; (正确)
select ename,deptno,avg(sal) from emp group by deptno;(错误,ename没有出现在group by子句中)
select deptno, avg(sal) from emp group bydeptno, job;(正确,只是没有显示job列)
groupby子句的增强:
rollup--函数应用。
group by null,不按任何条件下分组。
select deptno,job,sum(sal) from emp groupby rollup(deptno,job);(先按deptno分组再按job分组)
启用报表显示格式:breakon 列名 skip 1;
关闭报表格式:breakon null;
使用having子句可以过滤分组后的记录。格式:
select * from 表名 where ... group by 列名 having 分组限制条件(gorup by中的列名,分组统计函数)
对分组统计的结果进行排序。最后用使用order by语句.
在Order by中可以使用别名(因为是最后一步).//在where中不能使用别名(只能使用真实列名,因为他是第一步)
select deptno from emp group by deptnohaving deptno=20;(having中的条件只能是group by中有的列或分组函数)
当从多个表中查询时,如果省略连接条件,连接条件无效,所有表中的所有行互相连接都是出现笛卡尔积,笛卡尔积的记录数是两个表中的记录数的乘积。
为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。
连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
1)按连接条件来分类:
A等值连接
select e.empno,e.ename,d.dname from