oracle 10g学习之分组函数
一、
(1)分组查询语句的顺序
select ...
from ...
where ...
group by ...
having ...
order by ...
注意:
where-->group by分组-->执行组函数-->having筛选->order by
如果select/having语句后面出现了组函数 那么select/having后面没有被组函数修饰的列,就必须出现在group by 后面。
组函数出现的位置 : select后面 having后面 order by后面
SELECT列表中未出现在组函数中的所有列都必须包含在GROUP BY子句中。oracle规定where子句不可以使用分组函数,这时必须使用having子句方可完成功能。
where筛选行
having筛选分组
不能在GROUP BY子句中使用列别名。
(2)avg:求平均值
count:计算记录总数
Max:求最大值
Min:求最小值
sum:求和
STDDEV:标准差
VARIANCE:方差
例:查询所有员工的平均工资
select avg(salary)
from s_emp;
例:查询每个部门的平均工资
select avg(salary)
from s_emp
group by dept_id;
例:查询部门名称及其部门的平均工资
select dept_id,name,avg(salary)
from s_emp,s_dept
where s_emp.dept_id = s_dept.id
group by dept_id,name
order by dept_id;
例:查询平均工资大于1400的部门id,并显示出部门的名字
select dept_id,name,avg(salary)
from s_emp, s_dept
where s_emp.dept_id = s_dept.id
group by dept_id,name
having avg(salary)>1400
例:查询title中不包含vp字符串的每个职位的平均薪水 ,并对平均薪水进行降序排列,并且每个职位的总薪水大于5000
select title,avg(salary),sum(salary)
from s_emp
where lower(title) not like '%vp%'
group bu title
having sum(salary)>5000
order by avg(salary) desc;
例:查询员工表中最大工资数,并显示出这个人的名字
法一:
select last_name,salary
from s_emp
where salary = (
select max(salary)
from s_emp
);
法二:
select s1.last_name,max(s2.salary)
from s_emp s1,s_emp s2
group by s1.last_name
having s1.salary=max(s2.salary);
二、子查询
子查询:一条sql语句嵌套一个或多个sql语句
例:查询工资比41号部门平均工资高的员工信息
select last_name,salary
from s_emp
where salary>(
select avg(salary)
from s_emp
where dept_id = 41;)
例:查询工资比Ngao所在部门平均工资高的员工信息
select last_name.salary
from s_emp
where salary>(
select avg(salary)
from s_emp
where dept_id =(
select dept_id
from s_emp
where last_name='Ngao')
);
例:查看部门平均工资大于32号部门平均工资的部门id
select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary)>(
select avg(salary)
from s_emp
where dept_id=32
)
三、运行时可变参
执行sql语句的时候再传入参数
参数名字随便起,但要以&开头
set verify on 开启校验
set verify off 关闭校验
例: select id,last_name,salary,dept_id
from s_emp
where dept_id=&dept_id;
开启校验后,会显示:
输入 dept_id 的值: 10
原值 3: where dept_id = &dept_id
新值 3: where dept_id = 10
关闭校验后,则只显示:
输入 dept_id 的值: 10
注意:输入可变参数是字符串的时候
select id,last_name,salary
from s_emp
where last_name='&last_name'; 输入Ngao
select id,last_name,salary
from s_emp
where last_name=&last_name; 输入'Ngao'
同时设置多个可变参数:
select &col1,&col2,salary
from s_emp
where &condition;
accept:定义一个变量,让用户输入值
accept sal prompt 'sal:'
在sql语句中使用这个变量
select id,last_name,salary
from s_emp
where salary>&sal;
清除变量
undefine sal;