Oracle命令(五)--多行函数


--求员工表的最高工资,最低工资,平均工资,所有工资

select max(sal) 最高工资, min(sal) 最低工资, avg(sal) 平均工资, sum(sal) 所有工资 from emp;


--求平均奖金

select avg(comm) 方式1, sum(comm)/count(empno) 方式2, sum(comm)/count(comm) 方式3 from emp;

因为 奖金一栏中含有空值,组函数会滤空,所以方式2的结果会区别1,3。

==>如果想要滤空修正

select count(empno) AA , count(nvl(comm, 0)) BB from emp;


分组数据(GROUP BY)

GROUP BY 子语句语法

select ...
from tab
where colum > 10
order by ...
GROUP by ...

--求出 EMPLOYEES 表中各个部门的平均工资

select deptno, avg(sal)
from emp
group by deptno

--求不同部门的不同工种的平均工资

select deptno, job, avg(sal)
from emp
group by deptno, job
order by 1

[注:]select 后面跟的选项需要在 group by 后面的选项中有体现

--查询平均工资大于 2000 的部门

select deptno, avg(sal)
from emp
group by deptno
having avg(sal) > 2000

--求十号部门的平均工资

先分组再过滤

select deptno, avg(sal)
from emp
group by deptno
having deptno = 10

先过滤,再分组(首选)

select deptno, avg(sal)
from emp
having deptno = 10
group by deptno

多表查询

等值连接

示例:
查询员工信息,员工号,姓名,月薪,部门名称等

select e.empno, e.ename, e.sal, d.dname
from emp e, dept d
where e.deptno = d.deptno

不等值连接

示例:
查询员工信息,员工号,姓名,月薪,薪水级别

select e.empno, e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal >= s.losal and e.sal <= s.hisal

或者

select e.empno, e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal

外连接

eg:按部门统计员工人数:部门号 部门名称 各部门人数

select d.deptno,d.dname, count(e.empno)
from dept d, emp e
where d.deptno = e.deptno
group by d.deptno , d.dname


运行结果并没有部门编号为 40 的部门没有被显示出现
此时需要使用到外连接

select d.deptno,d.dname, count(e.empno)
from dept d, emp e
where d.deptno = e.deptno(+)
group by d.deptno , d.dname    

这是左外连接:(+)写在等号右侧。
作用是在连接条件不成立的情况下,也能把等号左边的数据给显示出来

select deptno, avg(sal)
from emp
having deptno = 10
group by deptno
原文地址:https://www.cnblogs.com/wanghao-boke/p/13167941.html