聚合函数的定义和作用
聚合函数烈性:
看例题
select count(*) from emp;
select max(sal) from emp;
select min(sal) from emp;
select avg(sal) from emp;
select sum(sal) from emp;
select sum(sal + nvl(comm,0)) from emp where deptno = 20
-- nvl(comm,0) 值为空的时候显示0 ,否则显示本身,它可以在任何函数中使用
group by 意为 “根据(by)” 一定的规则进行分组(group)。其作用是通过一定的规则将一个数据集划分为若干个小的区域,然后针对若干小区域进行统计汇总
语法:
select *| 列名
from 表名
where 条件表达式
group by 分组条件 (having 过滤条件)
order by 排序列 asc|desc
eg1:求出每个部门雇员的数量,先分组再统计
select deptno,count(empno) from emp group by deptno;
eg2:求出每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
注意:
找错误:
select deptno,count(empno) from emp;
这个会报错:ORA-00937:不是单组分组函数
原因如下:
统计 平均工资 2000 以上的部门
SELECT deptno, AVG(sal) FROM emp WHERE AVG(sal) > 2000
GROUP BY deptno;
-- **使用 having 统计平均工资 2000 以上的部门**
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;
-- 求出每个部门雇员的数量,先分组在统计
select deptno,count(empno) from emp group by deptno
-- 求每个部门的平均工资
select deptno,avg(sal) from emp group by deptno
-- 显示部门名称,各部门员工数,平均工资
select d.dname,count(e.empno),avg(e.sal)
from emp e, dept d
where e.deptno = d.deptno
group by e.deptno
分组函数只能出现在 select 语句的列里,或者 having、order by子句中,如果在 select 语句中同时包含有 group by、having、order by 子句,那么必须是 group by、再having 再 order by
比如下面的句子:
select avg(sal), max(sal), deptno
from emp
group by deptno
having avg(sal) < 6000
order by avg(sal);
eg:获取同一个部门下,同一个上司下的人数
select deptno, mgr, count(*) from emp group by deptno, mgr;
-- 1 查询入职最早的员工日期
select min(hiredate) from emp;
-- 2 求每个部门员工数量
select count(empno),deptno from emp group by deptno;
-- 3 统计各个部门的员工数及平均工资
select d.dname,count(e.empno),avg(e.sal) from emp e,dept d
where e.deptno = d.deptno
group by d.deptno = d.dname
-- 4 显示非销售人员工作名称雇员的月工资综合,并且要满足从事同一工作的雇员的月工资合计大于 5000,输出结果按月合计升序排列
select job,sum(sal) sal_num
from emp
where job <> 'SALESMAN'
group by job
having sum(sal)>5000
order by sal_num;
-- 5 统计每年入职的人数、鱼粉、人数
select to_char(hiredate,'yyyy') 年份,count(empno) 人数 from emp group by to_char(hiredate,'yyyy');
-- 6 统计每年入职的人数:年份,人数(仅返回入职不少于2人的年份的数据)
select to_char(hiredate,'yyyy') 年份,count(empno) 人数
from emp
group by to_char(hiredate,'yyyy')
having count(empno)>=2
给一个场景,查询工资比 SCOTT 高的人员信息
select * from emp where sal>(select sal from emp where ename = 'SCOTT')
一般要将子查询放在括号内,将子查询放在比较条件的右侧
SELECT *|列名 FROM 表名1 别名1,表名2 别名2,。。。
(
SELECT *|列名
FROM 表名
WHERE 条件表达式
GROUP BY 分组条件
ORDER BY 排序列 ASC|DESC
)别名,…
WHERE 列 运算符
(
SELECT *|列名
FROM 表名
WHERE 条件表达式
GROUP BY 分组条件
ORDER BY 排序列 ASC|DESC
)
GROUP BY 分组条件
ORDER BY 排序列 ASC|DESC
-- 查询工资比7654高,同时与7788从事相同工作的全部雇员信息
SELECT *
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE empno = 7654)
AND job = (SELECT job FROM emp WHERE empno=7788)
-- 要求查询工资最低的雇员姓名,工作,工资
select ename,job,sal from emp where sal = (select min(sal) from emp);
-- 查询部门名称,部门员工数,部门平均工资,部门的最低收入雇员的姓名
-- 分析:程序关联的两张表 emp dept
-- 1.如果要求各个部门的员工数及平均工资,一定要分组统计,对emp按deptno 分组。
SELECT deptno, COUNT(*), AVG(sal) FROM emp GROUP BY deptno;
-- 2.如果想查部门名称,则要与dept表关联,用子查询。
SELECT d.dname, em.c, em.a
from dept d,
(SELECT deptno, COUNT(*) c, AVG(sal) a FROM emp GROUP BY deptno) em
WHERE d.deptno = em. deptno;
-- 查询最低收入的雇员姓名
select min(sal) from emp group by deptno
-- 合并后
SELECT d.dname, em.c, em.a, e.ename
from dept d,
(SELECT deptno, COUNT(*) c, AVG(sal) a, MIN(sal) m
FROM emp
GROUP BY deptno) em,
emp e
WHERE d.deptno = em. deptno
and em.m = e.sal;
-- in 操作符:指定一个查询范围的集合
-- 求出各部门最低收入的员工信息
select * from emp where sal in
(select min(sal) from emp group by deptno)
-- 查询工资UI 10 号部门中的任意一人相等即可
select * from emp where sal in (select sal from emp where deptno =10)
-- any 操作符:任意一个
-- = any:与 in 操作符的功能完全一样
-- >ANY: 大于任意一个,即比最小值都要大
--
-- 查询工资小于 10号部门中的任意一个人即可
select * from emp where sal<any(seect sal from emp where deptno = 10);
-- all 操作符:去阿奴
-- >all:大于全部,比最大值还大
--
-- 查询工资小于全部 10 好部门的员工信息
select * from emp where sal < all (select sal from emp where deptno = 10);
--
##### 分页查询
```sql
-- 查询工资最高的前五名员工
-- 方法 1
select rownum e.* from emp e where rownum <= 5 order by sal desc
-- 方法 2 使用子查询
select *
from (select rownum rn,e.* from employees e order by salary desc)
where rn <= 5;
-- 查询工资最高的6 - 12 条员工
-- 方法 1
SELECT *
FROM (SELECT rownum row_top, tt.*
FROM (SELECT e.* FROM emp e ORDER BY sal DESC) tt)
WHERE row_top BETWEEN 6 AND 12;
-- 方法 2
SELECT *
FROM (SELECT rownum row_top, tt.*
FROM (SELECT e.* FROM emp e ORDER BY sal DESC) tt)
WHERE row_top <= 12
AND row_top >= 6;
-- 方法 3
SELECT *
FROM (SELECT rownum rn, tt.*
FROM (SELECT * FROM emp ORDER BY sal DESC) tt
WHERE rownum <= 12)
WHERE rn >= 6;
-- 查询所有是部门经理的员工
-- exists 方法 (效率更高)
SELECT *
FROM employees e
WHERE EXISTS
(SELECT 'X' FROM departments d WHERE e.employee_id = d.manager_id);
-- in 方法
SELECT *
FROM employees e
WHERE employee_id in (SELECT manager_id from departments);
-- 查询不是部门经理的员工
SELECT *
FROM employees e
WHERE NOT EXISTS
(SELECT 'X' FROM departments d WHERE e.employee_id = d.manager_id);
Oracle 数据库查询专题 (select * from emmmm 80 T)
SELECT进阶语法