日期:2014-05-16  浏览次数:20386 次

Oracle学习笔记(2)

1.   分组函数

1.1基本应用

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;(正确)

1.2分组数据

使用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;

1.3过滤分组

使用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中有的列或分组函数)

2.   多表连接查询

2.1笛卡尔积

当从多个表中查询时,如果省略连接条件,连接条件无效,所有表中的所有行互相连接都是出现笛卡尔积,笛卡尔积的记录数是两个表中的记录数的乘积。

为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。

2.2连接概述

连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。

 

1)按连接条件来分类:

A等值连接

select e.empno,e.ename,d.dname from