Oracle——分组查询与子查询

在本阶段的学习中学习了数据库中分组函数的使用,子查询以及高级子查询,以下为练习题目:

第6章分组查询与子查询
–(1)查询部门20的员工,每个月的工资总和及平均工资 。
SELECT SUM(sal) 工资总和,AVG(sal) FROM emp 平均工资
GROUP BY deptno
HAVING deptno=20

–(2)查询工作在 CHICAGO的员工人数、最高工资及最低工资 。
SELECT COUNT(empno) 员工人数,MAX(sal) 最高工资,MIN(sal) 最低工资 FROM emp e
JOIN dept d
ON e.deptno=d.deptno
GROUP BY d.loc
HAVING d.loc=’CHICAGO’

–(3)查询员工表中一共有几种岗位类型 。
SELECT COUNT(job) 岗位类型总数 FROM
(SELECT job FROM emp
GROUP BY job)

SELECT COUNT(DISTINCT job) 岗位类型总数 FROM emp

–(4)查询每个部门的部门编号、部门名称、部门人数、最高工资、最低工资、工资总和、平
–均工资。(映射的内容要在分组中)
SELECT d.deptno 部门编号,d.dname 部门名称,COUNT(e.empno) 部门人数,
MAX(e.sal) 最高工资,MIN(e.sal) 最低工资,SUM(e.sal),AVG(e.sal) 平均工资
FROM emp e JOIN dept d ON e.deptno=d.deptno
GROUP BY d.deptno,d.dname

–(5)查询每个部门 、每个岗位的部门编号、部门名称、岗位名称、部门人数、最高工资、最
–低工资、工资总和、平均工资。
SELECT d.deptno 部门编号,d.dname 部门名称,e.job 岗位名称,
COUNT(e.ename) 部门人数,MAX(sal) 最高工资,MIN(sal) 最低工资,
SUM(sal) 工资总和,AVG(sal) 平均工资
FROM emp e JOIN dept d ON e.deptno=d.deptno
GROUP BY d.deptno,d.dname,e.job

–(6)查询每个经理所管理的人数、经理编号、经理姓名,要求包括没有经理的人员信息 。
SELECT m.empno 经理编号,m.ename 经理姓名,e.ename 管理的员工, COUNT(e.empno) 管理人数
FROM emp e LEFT JOIN emp m ON e.mgr=m.empno
GROUP BY e.mgr,e.ename,m.empno,m.ename

–(7)查询部门人数大于 2的部门编号、部门名称、部门人数。
SELECT d.deptno 部门编号,d.dname 部门名称,COUNT(e.empno) 部门人数
FROM emp e JOIN dept d ON e.deptno=d.deptno
GROUP BY d.deptno,d.dname
HAVING COUNT(e.empno)>2

–(8)查询部门平均工资大于 2000,且人数大于2的部门编号、部门名称、部门人数、部门
–平均工资,并按照部门人数升序排序 。
SELECT d.deptno 部门编号,d.dname 部门名称,
COUNT(e.empno) 部门人数,AVG(sal) 平均工资
FROM emp e JOIN dept d ON e.deptno=d.deptno
GROUP BY d.deptno,d.dname
HAVING COUNT(e.empno)>2 AND AVG(sal)>2000

–(9)查询部门平均工资在 2500元以上的部门名称及平均工资 。
SELECT d.dname 部门名称,AVG(sal) 平均工资
FROM emp e JOIN dept d ON e.deptno=d.deptno
GROUP BY d.deptno,d.dname
HAVING AVG(sal)>2500

–(10)查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工
–资,并按平均工资降序排序 。
SELECT job 岗位,AVG(sal) 平均工资
FROM emp
GROUP BY job
HAVING substr(job,1,2) NOT IN ‘SA’ AND AVG(sal)>2500
ORDER BY AVG(sal) DESC

–(11)查询部门人数在 2人以上的部门名称、最低工资、最高工资,并对求得的工资进行
–四舍五入到整数位 。
SELECT d.dname 部门名称,round(MIN(e.sal),0) 最低工资,round(MAX(e.sal),0) 最高工资
FROM emp e JOIN dept d ON e.deptno=d.deptno
GROUP BY d.dname
HAVING COUNT(e.empno)>2

–(12)查询岗位不为 SALESMAN,工资和大于等于 2500的岗位及每种岗位的工资和 。
SELECT job 岗位,SUM(sal) 工资和
FROM emp
GROUP BY job
HAVING job NOT IN ‘SALESMAN’ AND SUM(sal)>2500

–(13)显示经理号码和经理姓名 ,这个经理所管理员工的最低工资 ,没有经理的 KING
–也要显示,不包括最低工资小于 3000的,按最低工资由高到低排序 。
SELECT m.empno,m.ename,MIN(e.sal)
FROM emp m LEFT JOIN emp e ON e.mgr=m.empno
GROUP BY e.mgr,m.empno,m.ename
HAVING MIN(e.sal)>=3000
ORDER BY MIN(e.sal) DESC

–(14)写一个查询,显示每个部门最高工资和最低工资的差额 。
SELECT MAX(sal)-MIN(sal) 工资差额
FROM emp
GROUP BY deptno

–(15)查询入职日期最早的 员工姓名 、入职日期。
SELECT ename 员工姓名,hiredate 入职日期
FROM emp
WHERE ROWNUM <2
ORDER BY hiredate

–(16)查询工资比 SMITH工资高并且工作地点在CHICAGO的 员工姓名、工资、部门
–名称。
SELECT e.ename 员工姓名,e.sal 工资,d.dname 部门名称
FROM emp e JOIN dept d ON e.deptno=d.deptno
WHERE e.sal >(SELECT sal FROM emp WHERE ename=’SMITH’) AND d.loc =’CHICAGO’

–(17)查询入职日期比 20部门入职日期最早的员工还要早的员工姓名、入职日期。
SELECT ename,hiredate
FROM emp
WHERE hiredate <(SELECT MIN(hiredate) FROM emp WHERE deptno =20)

–(18)查询部门人数大于所有部门平均人数的的部门编号 、部门名称、部门人数。
SELECT d.deptno 部门编号,d.dname 部门名称,COUNT(e.empno) 部门人数
FROM emp e JOIN dept d ON e.deptno=d.deptno
GROUP BY d.deptno,d.dname
HAVING COUNT(e.empno)> (SELECT AVG(COUNT(empno))
FROM emp
GROUP BY deptno)

–(19)查询入职日期比 10部门任意一个员工晚的 员工姓名、入职日期,不包括10部门
–员工。
SELECT ename,hiredate
FROM emp
WHERE hiredate>ANY
(SELECT hiredate FROM emp WHERE deptno=10)
AND deptno <>10

–(20)查询入职日期比 10部门所有员工晚的 员工姓名 、入职日期,不包括10部门员工。
SELECT ename,hiredate
FROM emp
WHERE hiredate>ALL
(SELECT hiredate FROM emp WHERE deptno=10)
AND deptno <>10

–(21)查询职位和10部门任意一个员工职位相同的 员工姓名、职位,不包括10部门
–员工。
SELECT ename,job
FROM emp
WHERE job =ANY
(SELECT job FROM emp WHERE deptno=10)
AND deptno<>10

–(22)查询职位及经理和 10部门任意一个员工职位及经理相同的 员工姓名、职位,不包
–括10部门员工。
SELECT ename,job
FROM emp
WHERE (job,mgr) IN
(SELECT job,mgr
FROM emp WHERE deptno=10)
AND deptno<>10

–(24)查询比自己职位平均工资高的 员工姓名 、职位、部门名称、职位平均工资
SELECT b.ename 员工姓名,b.job 职位,b.dname 部门名称,a.avg_sal 职位平均工资 FROM
(SELECT job,AVG(sal) avg_sal
FROM emp
GROUP BY job) a JOIN
(SELECT e.ename,e.job,d.dname,e.sal
FROM emp e JOIN dept d
ON e.deptno=d.deptno) b
ON a.job=b.job
WHERE avg_sal

猜你喜欢

转载自blog.csdn.net/wu_lie_xin/article/details/81569325