oracle 学习分组查询、分组函数、练习题答案

oracle 学习笔记


–分组查询
MIN MAX AVG COUNT SUM NVL
–NVL(参数一,参数二) 函数可以使分组函数强制包含含有空值的记录
–NVL2(参数一,参数二,参数三)


SELECT nvl2(null,’男’,’女’) FROM DUAL;–女
SELECT nvl2(‘M’,’男’,’女’) FROM DUAL; –男
select * from emp;
SELECT MIN(sal) FROM emp;
SELECT MAX(sal) FROM emp;
SELECT AVG(NVL(comm,0)) FROM emp;
SELECT COUNT(DISTINCT deptno) FROM dept;
SELECT SUM(comm) FROM emp;


练习1
• 1.查询部门20的员工,每个月的工资总和及平均
工资。
SELECT SUM(NVL(sal,0)) “工资总和”,AVG(NVL(sal,0)) “平均工资”
FROM emp
WHERE deptno=20;
• 2.查询工作在CHICAGO的员工人数,最高工资及
最低工资。
SELECT COUNT(*) “员工人数”,MAX(sal) “最高工资”,MIN(sal) “最低工资”
FROM emp e,dept d
WHERE d.loc=’CHICAGO’;
• 3.查询员工表中一共有几种岗位类型。
SELECT DISTINCT job FROM emp;


GROUP BY 分组函数


SELECT deptno,ROUND(AVG(NVL(sal,0)),2)
FROM emp
GROUP BY deptno;
查询每个部门每个岗位的工资总和。
SELECT job,SUM(sal)
FROM emp
GROUP BY job;
SELECT deptno,job,SUM(sal)
FROM emp
GROUP BY deptno,job;
–如果在查询中使用了组函数,任何不在组函数中
–的列或表达式都必须包含在GROUP BY子句中 。
select deptno,count(ename) from emp –错误
select deptno,count(ename) from emp group by deptno;

练习2
1.查询每个部门的部门编号,部门名称,部门人
数,最高工资,最低工资,工资总和,平均工资。
select d.deptno,d.dname,count(*),
max(sal),min(sal),sum(sal),avg(nvl(sal,0))
from emp e left outer join dept d on e.deptno=d.deptno
group by d.deptno, d.dname;

2.查询每个部门,每个岗位的部门编号,部门名
称,岗位名称,部门人数,最高工资,最低工资
,工资总和,平均工资。
select d.deptno,d.dname,e.job,count(e.empno),
max(sal),min(sal),sum(sal),avg(nvl(sal,0))
from emp e right outer join dept d on e.deptno=d.deptno
group by d.deptno, d.dname,e.job
order by d.deptno;
3.查询每个经理所管理的人数,经理编号,经理姓名,要求包括不是经理的人员信息。
select mgr.empno,mgr.ename,count(e.empno)
from emp mgr,emp e
where mgr.empno=e.mgr(+)
–order by mgr.empno;
group by mgr.empno,mgr.ename;


使用 HAVING 子句
• 不能在 WHERE子句中限制组
• 可以通过 HAVING 子句限制组


select deptno,max(sal)
from emp
group by deptno
having max(sal)>2900;


SELECT语句执行过程:
– 1.通过FROM子句中找到需要查询的表;
– 2.通过WHERE子句进行非分组函数筛选判断;
– 3.通过GROUP BY子句完成分组操作;
– 4.通过HAVING子句完成组函数筛选判断;
– 5.通过SELECT子句选择显示的列或表达式及组函数;
– 6.通过ORDER BY子句进行排序操作。


练习3
• 1.查询部门人数大于2的部门编号,部门名称,
部门人数。
select d.deptno,d.dname,count(e.empno)
from emp e right outer join dept d on e.deptno=d.deptno
group by d.deptno, d.dname
having count(e.empno)>2
order by d.deptno;
• 2.查询部门平均工资大于2000,且人数大于2的
部门编号,部门名称,部门人数,部门平均工资
,并按照部门人数升序排序。
select d.deptno,d.dname,count(e.empno),avg(nvl(sal,0))
from emp e right outer join dept d on e.deptno=d.deptno
group by d.deptno, d.dname
having avg(nvl(sal,0))>2000
order by count(e.empno);

课后作业
• 1.查询部门平均工资在2500元以上的部门名称及平均工资。
select d.deptno,d.dname,avg(nvl(sal,0))
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno,d.dname
having avg(nvl(sal,0)) >2500;

2.查询员工岗位中不是以“SA”开头并且平均工资在2500
元以上的岗位及平均工资,并按平均工资降序排序。
select job,avg(nvl(sal,0))
from emp
group by job
having job not like ‘SA%’;
• 3.查询部门人数在2人以上的部门名称、最低工资、最高
资 工资,并对求得的工资进行四舍五入到整数位。
select d.dname,round(min(sal),0),round(max(sal),0),count(e.empno)
from emp e, dept d
where e.deptno=d.deptno
group by d.dname
having count(e.empno)>2;
• 4.查询岗位不为SALESMAN,工资和大于等于2500的岗位及
每种岗位的工资和。
select job,sum(sal)
from emp
group by job
having job not like ‘SALESMAN’ and sum(sal)>=2500;
• 5.显示经理号码和经理姓名,这个经理所管理员工的最低
工资,没有经理的KING也要显示,不包括最低工资小于
3000的,按最低工资由高到低排序。
select m.ename,min(e.sal)
from emp e left outer join emp m
on e.mgr=m.empno
group by m.ename
having min(e.sal)>=3000;
• 6.写一个查询,显示每个部门最高工资和最低工资的差额。
select deptno,max(sal),min(sal),max(sal)-min(sal)
from emp
group by deptno;

猜你喜欢

转载自blog.csdn.net/qq_34693104/article/details/81255090