分组查询
聚合函数sum求和,avg平均值,count统计函数,max最大值,min最小值

表结构

下面测试下没有奖金的员工是否参与数值计算,下图四张图片中可以看出空值是不参与计算的




分组group by,分组注意:select后面只能出现分组的列,后面可以有聚合函数

----练习
--1统计每年入职的人数:年份,人数
select to_char(hiredate,'YYYY') 年,count(empno)
from emp
group by to_char(hiredate,'YYYY');
--练习
--1.统计每年入职的人数:年份,人数
select to_char(hiredate,'YYYY') 年,count(empno)
from emp
group by to_char(hiredate,'YYYY');
--2. 按照职务job对人数进行统计
select job,count(empno) from emp group by job;
--3. 统计每个部门的平均工资,按平均工资降序排列
select deptno,avg(sal) 平均工资
from emp
group by deptno
order by 平均工资 DESC;
--4. 获取同一个上司下的人数
select mgr,count(deptno)
from emp
group by mgr;
--获取同一部门下,同一个上司下的人数
SELECT DEPTNO,MGR,count(empno)
from emp
group by deptno,mgr;
要注意函数的使用方法,特别注意

--显示非销售人员工作名称及从事同一工作雇员的月工资总和
--
select job,sum(sal)
from emp
where job != 'salesman'
group by job
having sum(sal) >= 5000
order by sum(sal);
多表查询、内连接查询
从两张表中查询记录

例题
--例题
select empno,ename,e.deptno,loc
from emp e,dept d
where e.deptno = d.deptno
and loc = 'CHICAGO'

上午练习题
--练习
--1.统计每年每月入职的人数:年份,月份,人数
select to_char(hiredate,'yyyy') 年份,to_char(hiredate,'mm') 月份,count(ename) 姓名 from emp
group by to_char(hiredate,'yyyy'),to_char(hiredate,'mm');
--2. 按照部门编号及职务编号对人数进行统计
select deptno,job,count(ename) from emp group by deptno,job;
--3. 统计平均薪资大于5000的部门
select deptno,avg(sal) from emp group by deptno having avg(sal)>5000;
--4. 获取同一部门下,同一个上司下的人数
select deptno,mgr,count(ename) from emp group by deptno,mgr;
--5. 列出至少有三个员工的所有部门。
select deptno,count(ename) from emp group by deptno having count(ename)>3;
--6. 查看员工职务变更历史记录:员工编号,姓名,起始日期,终止日期,职务名称,部门名称
select empno 员工编号,ename 姓名,hiredate 起始日期,job 职务名称,dname 部门名称 from emp e,dept d
where e.deptno=d.deptno;
--7. 要求查询雇员的编号,姓名,部门编号,部门名称及部门位置(emp,dept),要求部门位置位于"CHICAGO"
select empno,ename,e.deptno,dname,loc from emp e,dept d
where e.deptno = d.deptno
and loc = 'CHICAGO'
--8. 统计各个部门的员工数(不包含空的部门),列出部门名称,人数
select count(empno) 人数,dname 部门名称 from emp e,dept d
where e.deptno = d.deptno
group by dname
having count(empno)>1;
--9. 显示非销售人员工作名称及从事同一工作雇员的月工资总和,并且要满足从事同一工作的雇员的月工资合计大于5000,输出结果按月工资的合计升序排列
select sum(sal),job from emp
where job != 'SALESMAN'
group by job having sum(sal)>5000
order by sum(sal);
--10.输出每个部门的名字和平均工资
select dname,avg(sal)from emp e,dept d
where d.deptno=e.deptno
group by dname;
网友评论