oracle复习及作业2

 一、多表查询
 SELECT 列名,列名...
 FROM 表名 表的别名,表名 表的别名....
 WHERE 条件
 ORDER BY 排序字段。。。
 
 1、笛卡尔积:是多张表记录的乘积。
 SELECT *
 FROM emp,dept
 WHERE ename='SMITH';
 
 SELECT * FROM emp;
 SELECT * FROM dept;
 
 SELECT ename,emp.deptno,dname
 FROM emp,dept;
 
 2、等值连接,两张表中存在含义相同,值相等的列的
  SELECT *
 FROM emp,dept
 WHERE emp.deptno=dept.deptno;
 
 
 SELECT a.deptno,ename,dname
 FROM emp a,dept b
 WHERE A.deptno=b.deptno
 ORDER BY A.deptno;
 
 3、不等值连接
 SELECT * FROM salgrade;
 
 SELECT *
 FROM emp A,salgrade b
 --WHERE a.sal >=b.losal and a.sal<=b.hisal;
 WHERE sal between losal and hisal;
 
 ---查询员工的姓名,员工的部门名称,员工的工资等级
 SELECT ename,dname,grade
 FROM emp,dept,salgrade
 WHERE emp.deptno=dept.deptno AND sal BETWEEN losal AND hisal;
 
 4、自身连接:
 SELECT * FROM emp;
 
 SELECT *
 FROM emp A,emp b
 WHERE a.ename='SMITH' and a.mgr = b.empno;
 
  SELECT *
 FROM emp A,emp b
 WHERE A.mgr = b.empno;
 
  ---查询员工的姓名,员工的部门名称,员工的工资等级,员工对应的领导姓名,领导的部门名称,领导的工资等级
  SELECT e.ename 员工姓名,d.dname 员工的部门名称,s.grade 员工的工资等级,m.ename 领导的姓名,md.dname 领导的部门名称,ms.grade 领导的工资等级
  FROM emp e,dept d,salgrade s,emp m,dept md,salgrade ms
  WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal AND e.mgr=m.empno AND m.deptno=md.deptno
        and m.sal between ms.losal and ms.hisal;

5、外连接:
SELECT *
FROM emp,dept
WHERE emp.deptno(+)=dept.deptno;

SELECT *
FROM emp,dept
WHERE dept.deptno=emp.deptno(+);

6、SQL1999:
(01)CROSS JOIN:交叉连接,笛卡尔积
语法:table1 CROSS JOIN table2

SELECT *
FROM emp CROSS JOIN dept;
=
SELECT *
FROM emp,dept;

(02)NATURAL JOIN:自然连接
语法:table1 NATURAL JOIN table2

SELECT *
FROM emp NATURAL JOIN dept;

(03)JOIN...USING(公共列名)
语法:table1 JOIN table2 USING(公共列)

SELECT *
FROM emp JOIN dept USING(deptno);

(4)JOIN...ON 连接条件
语法:table1 join table2 on 连接条件;

SELECT *
FROM emp JOIN dept ON emp.deptno=dept.deptno;

(05)LEFT JOIN...ON 连接条件
语法:table1 LEFT JOIN table2 ON 连接条件

SELECT *
FROM dept left JOIN emp ON emp.deptno=dept.deptno;

(06)RIGHT JOIN...ON 连接条件
语法:table1 RIGHT JOIN table2 ON 连接条件

SELECT *
FROM emp RIGHT JOIN dept ON emp.deptno=dept.deptno;

(07) FULL JOIN...ON 连接条件
语法:table1 full JOIN table2 ON 连接条件

SELECT *
FROM emp e FULL JOIN emp m ON e.mgr = m.empno
ORDER BY e.empno;

二、分组查询
1、分组函数:又称为统计函数,聚合函数
sum():求和
avg():求平均值
MAX():求最大值
MIN():求最小值
count():求个数
   *:统计的表的记录数
   列名:统计该列不为null的个数
   
注意:统计时,不对Null值进行处理

SELECT sum(sal),avg(sal),MAX(sal),MIN(sal),count(empno)
FROM emp;

SELECT
FROM
WHERE
GROUP BY 分组字段,分组字段。。。
HAVING 组过滤条件
ORDER BY


---按照职务不同来分组统计工资总和,人数
SELECT job,sum(sal),count(empno)
FROM emp
GROUP BY job;

---查询emp表中不同的职务
SELECT DISTINCT JOB
FROM emp;

SELECT JOB
FROM emp
GROUP BY JOB;

---查询不同的领导工号的个数
SELECT count(distinct mgr)
FROM emp;

---统计各个部门不同职务的员工薪水的总和,平均工资
SELECT deptno,job,sum(sal),avg(sal)
FROM emp
GROUP BY deptno,JOB
ORDER BY deptno;


---统计各个部门不同职务的员工薪水的总和,平均工资,部门名称,职务
SELECT dname,JOB,sum(sal),avg(sal)
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname,JOB
ORDER BY dname;

---统计各个部门不同职务的员工薪水的总和,平均工资,部门编号,部门名称,部门位置,职务
SELECT dept.deptno,dname,loc,JOB,sum(sal),avg(sal)
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dept.deptno,dname,loc,JOB
ORDER BY dname;

---统计不同工资等级的员工人数,工资总和,工资平均值
SELECT grade,sum(sal),round(avg(sal),2),count(empno)
FROM emp,salgrade
WHERE sal BETWEEN losal AND hisal
GROUP BY grade;

---统计不同工资等级的员工人数,工资总和,工资平均值,要求员工的 人数要大于2
SELECT grade,sum(sal),round(avg(sal),2),count(empno)
FROM emp,salgrade
WHERE sal BETWEEN losal AND hisal
GROUP BY grade
HAVING count(empno)>2;

---查询各个部门的平均工资大于2000的部门编号和平均工资
SELECT deptno,avg(sal)
FROM emp
GROUP BY deptno
HAVING avg(sal)>2000;

where与having的区别:
WHERE是在分组前进行过滤的,where的后面不能直接使用分组函数做比较
HAVING是在分组后进行过滤的。

3、分组函数的嵌套
---查询部门平均工资最高的平均工资
SELECT MAX(avg(sal))
FROM emp
GROUP BY deptno;

注意:当select后面的分组函数嵌套使用时,SELECT后面不能有任意列名,只能存在嵌套分组函数

第六章课后作业:
1.查询部门平均工资在2500元以上的部门名称及平均工资。
SELECT dname,avg(sal)
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname
HAVING avg(sal)>2500;
2.查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序。
SELECT JOB,avg(sal)
FROM emp
WHERE upper(JOB) NOT LIKE 'SA%'
GROUP BY JOB
HAVING avg(sal)>2500
ORDER BY 2 desc;
3.查询部门人数在2人以上的部门名称、最低工资、最高工资,并对求得的工资进行四舍五入到整数位。
SELECT dname,round(MIN(sal)),round(MAX(sal))
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname
HAVING count(empno)>2;
4.查询岗位不为SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和。
SELECT JOB,sum(sal)
FROM emp
WHERE upper(JOB)!='SALESMAN'
GROUP BY JOB
HAVING sum(sal)>=2500;
5.显示经理号码和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序。
SELECT m.empno,m.ename,min(e.sal)
FROM emp e,emp m
WHERE e.mgr=m.empno(+)
GROUP BY m.empno,m.ename
HAVING MIN(e.sal)>=3000
ORDER BY min(e.sal) desc;
6.写一个查询,显示每个部门最高工资和最低工资的差额
SELECT deptno,MAX(sal)-MIN(sal)
FROM emp
GROUP BY deptno;

4.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点,薪资等级
   select ename,dname,loc ,grade
   FROM emp JOIN dept  ON emp.deptno =dept.deptno
        JOIN salgrade ON sal BETWEEN losal AND hisal
   WHERE dept.loc='CHICAGO';
   
三、子查询
子查询一般用()括起来
子查询出现的位置:select,FROM,WHERE,HAVING
嵌套子查询:一个查询语句中嵌套了另一个查询语句,子查询的语句可以直接运行

单列子查询:子查询的返回结果是单行单列的,经常用在where,HAVING
多行子查询:子查询的返回结果是单列多行的,经常用在where
多列子查询:子查询的返回结果是多行多列的,经常用在from,where


1、单列子查询
---查询与smith相同职务的其它员工信息
SELECT JOB FROM emp WHERE lower(ename)='smith';

SELECT *
FROM emp
WHERE job=(SELECT JOB FROM emp WHERE lower(ename)='smith') and lower(ename)!='smith';

------查询部门平均工资最高的平均工资和部门名称
SELECT MAX(avg(sal))
FROM emp
GROUP BY deptno;

SELECT dname,round(avg(sal),2)
FROM emp JOIN dept ON emp.deptno=dept.deptno
GROUP BY dname
HAVING avg(sal)=(SELECT MAX(avg(sal))
                  FROM emp
                  GROUP BY deptno);
                  
2、多行子查询:
集合运算:in
---查询与30部门职务相同的其它部门的员工信息
SELECT distinct JOB FROM emp WHERE deptno=30;

SELECT *
FROM emp
WHERE job in(SELECT distinct JOB FROM emp WHERE deptno=30) and deptno!=30;

ANY:
=ANY:相当于in
SELECT *
FROM emp
WHERE job=any(SELECT distinct JOB FROM emp WHERE deptno=30) and deptno!=30;

>ANY:比子查询返回结果的最小值要大
---查询比10部门的最低工资要高的其它部门员工信息
SELECT *
FROM emp
WHERE sal>ANY(SELECT sal
              FROM emp
              WHERE deptno=10) and deptno!=10;

<ANY:比子查询返回结果的最大值要小
---查询比20部门的最高工资要低的其它部门的员工信息
SELECT *
FROM emp
WHERE sal<ANY(SELECT sal
              FROM emp
              WHERE deptno=20) and deptno!=20;
              
ALL:
=ALL:不存在现象
>ALL:比子查询的返回结果的最大值要大
---查询比20部门所有人薪水都高的员工信息
SELECT *
FROM emp
WHERE sal>all(SELECT sal FROM emp WHERE deptno=20);

<ALL:比子查询的返回结果的最小值要小
---查询比10部门所有人薪水都低的员工信息
SELECT *
FROM emp
WHERE sal<all(SELECT sal FROM emp WHERE deptno=10);

3、多列子查询:
---查询与SCOTT用户工资和职务都匹配的其它员工的信息
SELECT *
FROM emp
WHERE sal=(SELECT sal FROM emp WHERE upper(ename)='SCOTT')
      AND JOB=(SELECT JOB FROM emp WHERE upper(ename)='SCOTT')
      and upper(ename)!='SCOTT';
      
SELECT *
FROM emp
WHERE (sal,job) in(SELECT sal,JOB FROM emp WHERE upper(ename)='SCOTT') and upper(ename)!='SCOTT';

---查询部门的名称,部门人数,部门最高工资,部门的最低工资,部门最低工资的员工姓名
SELECT deptno,count(empno),max(sal),min(sal)
FROM emp
GROUP BY deptno;

SELECT dname,t.c,t.ma,t.mi,ename
FROM dept,emp,(SELECT deptno,count(empno) c,max(sal) ma,min(sal) mi
                FROM emp
                GROUP BY deptno) t
WHERE dept.deptno=emp.deptno and emp.deptno=t.deptno and sal=t.mi;

1.查询比自己职位平均工资高的员工姓名、职位,部门名称,职位平均工资
SELECT JOB,avg(sal)
FROM emp
GROUP BY JOB;

SELECT ename,emp.JOB,dname,sal,t.a
FROM emp,dept,(SELECT JOB,avg(sal) a
                FROM emp
                GROUP BY JOB) t
WHERE emp.deptno=dept.deptno and emp.job=t.job and sal>t.a;

2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位,不包括SCOOT和BLAKE本人。
SELECT ename,job
FROM emp
WHERE (JOB,mgr) IN (SELECT JOB,mgr FROM emp WHERE upper(ename) IN('SCOTT','BLAKE')) AND upper(ename) NOT IN('SCOTT','BLAKE');

3.查询不是经理的员工姓名
SELECT ename
FROM emp
WHERE empno not in(SELECT distinct mgr FROM emp where mgr is not null);

四、分页查询
1、rownum:伪列:从1开始递增
---查询emp表中的前5行记录
SELECT *
FROM emp
WHERE rownum<=5;

rownum在做比较运算时,只能使用<,<=,不能使用>,>=

----查询emp表中5~10条记录
SELECT rownum r,emp.* FROM emp;

SELECT rownum,t.*
FROM (SELECT ROWNUM r,emp.* FROM emp) t
WHERE t.r between 5 and 10;

---查询emp表中的最后5条记录
SELECT rownum,t.*
FROM (SELECT ROWNUM r,emp.* FROM emp) t
WHERE t.r>(select count(empno) from emp)-5;

---每页显示3条记录,查询第3页的员工信息
SELECT rownum,t.*
FROM (SELECT ROWNUM r,emp.* FROM emp) t
WHERE t.r>(3-1)*3 and t.r<=3*3;

---每页显示3条记录,查询第3页和第5页的员工信息
SELECT rownum,t.*
FROM (SELECT ROWNUM r,emp.* FROM emp) t
WHERE t.r>(3-1)*3 and t.r<=3*3 or t.r>(5-1)*3 and t.r<=5*3;

2、TOPN
---查询工资最高的员工信息
SELECT * FROM EMP ORDER BY sal desc;

SELECT *
FROM (SELECT * FROM EMP ORDER BY sal DESC) t
WHERE rownum<=1;

---查询工资最高的前5位的员工信息
SELECT *
FROM (SELECT * FROM EMP ORDER BY sal DESC) t
WHERE rownum<=5;

作业:

--第五章
--练习一
---1.写一个查询,显示所有员工姓名,部门编号,部门名称。
select a.ename,a.deptno,b.dname
from emp a,dept b
where a.deptno=b.deptno
---2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
select e.ename,d.loc,e.comm
from emp e,dept d
where e.deptno=d.deptno and nvl(comm,0)>0 and loc='CHICAGO'
---3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
select e.ename,d.loc
from emp e,dept d
where e.deptno=d.deptno and e.ename like '%A%'
--练习2
---1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序
select e.empno,e.ename,e.sal,s.grade,d.loc
from emp e,dept d,salgrade s
where e.deptno=d.deptno
and e.sal between s.losal and s.hisal
order by s.grade
--练习3
---1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
select a.ename,a.empno,b.ename,b.empno
from emp a,emp b,dept d
where a.mgr=b.empno and a.deptno=d.deptno
and d.loc in('NEW YORK','CHICAGO')
---2.第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。
select a.ename,a.empno,b.ename,b.empno
from emp a left JOIN emp b ON a.mgr=b.empno,dept d
where a.deptno=d.deptno
and d.loc in('NEW YORK','CHICAGO')
---3.查询所有员工编号,姓名,部门名称,包括没有部门的员工也要显示出来。
select empno,ename,dname
from dept right JOIN emp ON emp.deptno=dept.deptno

--练习4
---使用SQL-99写法,完成如下练习
---1.创建一个员工表和部门表的交叉连接。
select *
from emp CROSS JOIN dept;
---2.使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
select ename,dname,hiredate
from emp NATURAL JOIN dept
where hiredate>'1-5月-1980';
---3.使用USING子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点
select ename,dname,loc
from emp JOIN dept USING(deptno)
where loc='CHICAGO';
---4.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点,薪资等级
select ename,dname,loc,grade
from emp JOIN dept ON emp.deptno=dept.deptno,
emp join salgrade on sal between losal and hisal
where loc='CHICAGO'
---5.使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select a.ename,b.ename Manager
from emp a left JOIN emp b ON a.mgr=b.empno
---6.使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select a.ename Manager,b.ename
from emp b right JOIN emp a ON a.mgr=b.empno
--第六章
--练习1
---1.查询部门20的员工,每个月的工资总和及平均工资。
select to_char(hiredate,'mm') "month",sum(sal),avg(sal)
from emp
where deptno=20
group by to_char(hiredate,'mm');
---2.查询工作在CHICAGO的员工人数,最高工资及最低工资。
select count(empno),max(sal),min(sal)
from emp,dept
where loc='CHICAGO' and emp.deptno=dept.deptno
---3.查询员工表中一共有几种岗位类型。
select count(distinct job)
from emp
--练习2
---1.查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。
select emp.deptno,dept.dname,count(empno),max(sal),min(sal),sum(sal),avg(sal)
from emp,dept
where emp.deptno=dept.deptno
group by emp.deptno,dname
---2.查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资。
select emp.deptno,dept.dname,job,count(empno),max(sal),min(sal),sum(sal),avg(sal)
from emp,dept
where emp.deptno=dept.deptno
group by emp.deptno,dname,job
order by emp.deptno
---3.查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。
select m.empno,m.ename,count(e.empno)
from emp e,emp m
where e.mgr=m.empno(+)
group by m.empno,m.ename
--练习3
---1.查询部门人数大于2的部门编号,部门名称,部门人数。
select dept.deptno,dname,count(empno)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dname
having count(empno)>2
---2.查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排序。
select dept.deptno,dname,count(empno),avg(sal)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dname
having avg(sal)>=2 and avg(sal)>2000
order by count(empno)

--第七章
--练习1
---1.查询入职日期最早的员工姓名,入职日期
select ename,hiredate
from emp
where hiredate=(select min(hiredate) from emp)
---2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称
select ename,sal,dname
from emp,dept
where sal>(select sal from emp where ename='SMITH')
and loc='CHICAGO' and emp.deptno=dept.deptno
---3.查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期
select ename,hiredate
from emp
where hiredate<(select min(hiredate) from emp where deptno=20)
---4.查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数
select dept.deptno,dname,count(empno)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dname
having count(empno)>(select avg(count(empno)) from emp group by deptno)
--练习2
---1.查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
select ename,hiredate
from emp
where hiredate>any(select hiredate from emp where deptno=10)
and deptno<>10
---2.查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
select ename,hiredate
from emp
where hiredate>all(select hiredate from emp where deptno=10)
---3.查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工
select ename,job
from emp
where job=any(select distinct(job) from emp where deptno=10)
and deptno<>10
--练习3
---1.查询职位及经理和10部门任意一个员工职位及经理相同的员工姓名,职位,不包括10部门员工
select ename,emp.job
from emp,(select job,mgr from emp where deptno=10) t
where emp.mgr=t.mgr and emp.job=t.job and deptno<>10
---2.查询职位及经理和10部门任意一个员工职位或经理相同的员工姓名,职位,不包括10部门员工
select ename,emp.job
from emp,(select job,mgr from emp where deptno=10) t
where (emp.mgr=t.mgr or emp.job=t.job) and deptno<>10
--练习4
---1.查询比自己职位平均工资高的员工姓名、职位,部门名称,职位平均工资
select ename,emp.job,dname,sal,avgsal
from emp,dept,(select job, avg(sal) avgsal from emp group by job) t
where emp.deptno=dept.deptno and emp.job=t.job and sal>avgsal
---2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位,不包括SCOOT和BLAKE本人。
select ename,t.job
from emp,(select  job,mgr from emp
          where ename in('SCOTT','BLAKE')) t
where emp.ename not in('SCOTT','BLAKE') and emp.mgr=t.mgr
---3.查询不是经理的员工姓名。
select ename
from emp
where empno not in(select distinct mgr from emp where mgr is not null)
--练习5
---1.查询入职日期最早的前5名员工姓名,入职日期。
select ename,emp.hiredate
from emp,(select rownum r, hiredate from emp order by hiredate) t
where r<=5 and emp.hiredate=t.hiredate
---2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
select ename,hiredate
from (select ename, hiredate from emp,dept where emp.deptno=dept.deptno and loc='CHICAGO' order by hiredate) t
where rownum<=2

--练习6
---1.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称。
select rownum,t.r,ename,hiredate,deptno
from(select rownum r,emp.* from emp) t
where t.r>(1-1)*5 and t.r<=1*5 or t.r>(2-1)*5 and t.r<=2*5 or t.r>(3-1)*5 and t.r<=3*5;
--练习7
---1.按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称、工资。
select rownum ,ename,hiredate,deptno,sal
from(select emp.* from emp order by sal desc) t
where rownum>(1-1)*5 and rownum<=1*5 or rownum>(2-1)*5 and rownum<=2*5 or rownum>(3-1)*5 and rownum<=3*5;
--课后作业
---1.查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
select empno,ename,sal,job
from emp
where sal>(select sal from emp where empno=7782) and job=(select job from emp where empno=7369)
---2.查询工资最高的员工姓名和工资。
select ename,sal
from emp
where sal=(select max(sal) from emp)
---3.查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
select dept.deptno,dname,min(sal)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dname
having min(sal)>(select min(sal) from emp where deptno=10)

---4.查询员工工资为其部门最低工资的员工的编号和姓名及工资。
select empno,ename,sal
from emp
where (deptno,sal) in(select deptno, min(sal) from emp group by deptno)
---5.显示经理是KING的员工姓名,工资。
select ename,sal
from emp
where mgr=(select empno from emp where ename='KING')
---6.显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
select ename,sal,hiredate
from emp
where hiredate>(select hiredate from emp where ename='SMITH')
---7.使用子查询的方式查询哪些职员在NEW YORK工作。
select *
from emp
where deptno=(select deptno from dept where loc='NEW YORK')
---8.写一个查询显示和员工SMITH工作在同一个部门的员工姓名,雇用日期,查询结果中排除SMITH。
select ename,hiredate
from emp
where deptno=(select deptno from emp where ename='SMITH')
and ename<>'SMITH'
---9.写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。
select empno,ename
from emp
where sal>(select avg(sal) from emp)
---10.写一个查询显示其上级领导是King的员工姓名、工资。
select ename,sal
from emp
where mgr=(select empno from emp where initcap(ename)='King')
---11.显示所有工作在RESEARCH部门的员工姓名,职位。
select ename,job
from emp
where deptno=(select deptno from dept where dname='RESEARCH')
---12.查询每个部门的部门编号、平均工资,要求部门的平均工资高于部门20的平均工资。
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>(select avg(sal) from emp where deptno=20)
---13.查询大于自己部门平均工资的员工姓名,工资,所在部门平均工资,高于部门平均工资的额度。
select ename,sal,t.a,sal-t.a,t.deptno
from emp,(select deptno,avg(sal) a from emp group by deptno) t
where sal >t.a and emp.deptno=t.deptno
---14.    列出至少有一个雇员的所有部门
select deptno
from emp
group by deptno
having count(empno)>0
---15.    列出薪金比"SMITH"多的所有雇员
select *
from emp
where sal>(select sal from emp where ename='SMITH')
---16.    列出入职日期早于其直接上级的所有雇员
select *
from emp e,emp m
where e.hiredate<m.hiredate
and e.mgr=m.empno
---17.    找员工姓名和直接上级的名字
select e.ename,m.ename
from emp e,emp m
where e.mgr=m.empno
---18.    显示部门名称和人数
select dname ,count (empno)
from dept,emp
where dept.deptno=emp.deptno(+)
group by dname
---19.    显示每个部门的最高工资的员工
select *
from emp
where (deptno,sal) in(select deptno, max(sal)
from emp
group by deptno)
---20.    显示出和员工号7369部门相同的员工姓名,工资
select ename,sal
from emp
where deptno=(select deptno from emp where empno=7369)
---21.    显示出和姓名中包含"W"的员工相同部门的员工姓名
select ename
from emp
where deptno in(select deptno from emp where ename like '%W%')
---22.    显示出工资大于平均工资的员工姓名,工资
select ename,sal
from emp
where sal>(select avg(sal) from emp )
---23.    显示出工资大于本部门平均工资的员工姓名,工资
select ename,sal
from emp,(select deptno,avg(sal) a from emp group by deptno) t
where sal >t.a and emp.deptno=t.deptno
---24.    显示每位经理管理员工的最低工资,及最低工资者的姓名
select ename,sal
from emp,(select mgr, min(sal) m from emp group by mgr) t
where sal =t.m and t.mgr=emp.mgr

select ename,sal
from emp
where (sal,mgr) in (select min(sal),mgr from emp group by mgr)
---25.    显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间
select ename,hiredate
from emp
where hiredate>(select hiredate from emp where sal=(select max(sal) from emp ))
---26.    显示出平均工资最高的的部门平均工资及部门名称
select dname,avg(sal)
from emp,dept
where emp.deptno=dept.deptno
group by dname
having avg(sal)=(select max(avg(sal))
                 from emp
                 group by deptno)

猜你喜欢

转载自www.cnblogs.com/CYYWing/p/9296396.html
今日推荐