ORACLE 多表 查询作业

--查询和scott相同部门的员工的姓名ename和雇员日期hiredate
SELECT * FROM EMP
--1.首先查询出scott的部门编号 20
SELECT DEPTNO FROM EMP WHERE ENAME ='SCOTT';


SELECT E.ENAME,E.HIREDATE,E.DEPTNO
FROM EMP E
WHERE DEPTNO =(SELECT DEPTNO FROM EMP WHERE ENAME ='SCOTT');


--2.查询在部门为loc为newYork的部门工作的员工姓名ename,部门名称dname和岗位名称job
SELECT DEPTNO FROM DEPT WHERE LOC ='NEW YORK';


SELECT E.ENAME,D.DNAME,E.JOB,D.LOC FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.DEPTNO =(SELECT DEPTNO FROM DEPT WHERE LOC ='NEW YORK')


--3.查询上司是king的员工姓名(ename)和工资(sal)
SELECT EMPNO FROM EMP WHERE ENAME ='KING';


SELECT E.ENAME,E.SAL,E.MGR FROM EMP E WHERE MGR =
(SELECT EMPNO FROM EMP WHERE ENAME ='KING');


--4.查询与姓名中包含字母U的员工在相同的部门的员工的信息
SELECT DEPTNO FROM EMP WHERE ENAME LIKE '%U%'; --30;


SELECT * FROM EMP WHERE DEPTNO IN
(SELECT DEPTNO FROM EMP WHERE ENAME LIKE '%U%');




--1.查询所有雇员姓名和部门的名称(使用left join,inner join,right join)
SELECT E.ENAME,D.DNAME FROM EMP E
LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO


--2.显示每歌员工的员工姓名,部门名称,职务,工资 和工资等级 信息
(使用left join,inner join,right join)
SELECT E.ENAME,D.DNAME,E.JOB,E.SAL,S.GRADE
FROM SALGRADE S,DEPT D LEFT JOIN EMP E
ON D.DEPTNO = E.DEPTNO
WHERE E.SAL>=S.LOSAL
AND E.SAL <=S.HISAL;


--综合训练题
--1.取得每个部门最高薪水的人员的姓名
SELECT ENAME,SAL,DEPTNO FROM EMP WHERE SAL IN(
(SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 10),
(SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 20),
(SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 30),
(SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 40))
ORDER BY DEPTNO;


--第二种
SELECT E.ENAME,E.SAL,E.DEPTNO FROM EMP E,
(SELECT MAX(SAL) M_SAL,DEPTNO FROM EMP GROUP BY DEPTNO) C
WHERE E.DEPTNO = C.DEPTNO
AND E.SAL = C.M_SAL;


--第三种  相关子查询
--1.先执行主查询,获取emp表的deptno字段
--2.将deptno字段传递到子查询中]
--3.子查询将结果过  返回给主查询,由主查询根据子查询的而结果进行where字句的计算
--从而得到最终的查询的结果
--4.依次循环这个过程,直到所有的查询执行的结束
SELECT E.ENAME,E.SAL,E.DEPTNO FROM EMP E
WHERE E.SAL =(SELECT MAX(SAL)FROM EMP WHERE DEPTNO = E.DEPTNO);


--2.列出受雇日期早于直接上级的所有的员工的编号,姓名和部门名称
--第一种


SELECT E.EMPNO,E.ENAME,D.DNAME
FROM EMP E INNER JOIN EMP EM
ON E.MGR = EM.EMPNO
AND E.HIREDATE <EM.HIREDATE
JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;




--3.列出所有'CLERK'(办事员)的姓名及部门的名称,部门的人数
--1.(办事员)的姓名及部门的名称
SELECT E.ENAME,D.DNAME FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.JOB ='CLERK'


--4.列出与"scott"从事相同工作的所有员工及部门的名称
SELECT JOB FROM EMP WHERE ENAME ='SCOTT';
SELECT * FROM EMP WHERE JOB =(SELECT JOB FROM EMP WHERE ENAME ='SCOTT');


SELECT DNAME, E.* FROM DEPT D
RIGHT JOIN (SELECT * FROM EMP WHERE JOB =
(SELECT JOB FROM EMP WHERE ENAME ='SCOTT'))E
ON D.DEPTNO = E.DEPTNO
AND ENAME <>'SCOTT';


--5.查询出某个员工的上级主管,并要求求出这些主管中薪水超过3000的


SELECT E.ENAME,E.SAL,E1.ENAME,E1.SAL FROM EMP E,EMP E1
WHERE E1.EMPNO = E.MGR AND E1.SAL >3000;


--6.找出部门10中所有经理(MANAGER)和部门20中中所有办事员 (clerk)的详细资料
SELECT * FROM EMP WHERE(DEPTNO = 10 AND JOB ='MANAGER')
OR(DEPTNO = 20 AND JOB ='CLERK');
--7.找出12年前受雇员工,并按照分组,进行倒序
SELECT * FROM EMP WHERE(SYSDATE-HIREDATE)/365>12
ORDER BY HIREDATE DESC;


--8.列出从事一种工作但属于不同部门的员工的一种组合
SELECT DISTINCT E.ENAME,E.JOB FROM EMP E,EMP M
WHERE E.DEPTNO !=M.DEPTNO
AND E.JOB = M.JOB
--9.查询有奖金的所有员工的姓名 奖金以及所在部门
SELECT * FROM EMP


SELECT E.ENAME,E.COMM,D.DNAME FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND COMM IS NOT NULL
AND COMM>0;


--10.给任职日期超过25年的员工加薪10%
SELECT * FROM EMP WHERE(SYSDATE -HIREDATE)/365>25


UPDATE EMP SET SAL = SAL *1.1 WHERE (SYSDATE - HIREDATE)/365>25




SELECT * FROM EMP



猜你喜欢

转载自blog.csdn.net/xiaoxiaode_shu/article/details/80533679