Oracle 기본정리 - sub query2(where절에 select 넣어보기)
Oracle 기본정리 - sub query2(where절에 select 넣어보기)
-scott 계정의 테이블 사용
--평균급여보다 많이 받는 사원의 사원번호, 이름, 급여를 출력
select empno, ename, sal
from emp
where sal > (select avg(sal) from emp);
--clark 같은 부서에서 근무하는 사원의 이름과 부서번호를 출력
방법1
select e2.ename, e2.deptno
from emp e1, emp e2
where e1.ename = 'CLARK'
AND e1.deptno = e2.deptno;
방법2
select ename, deptno
from emp
where deptno = (select deptno from emp where ename='CLARK');
--clark과 동일한 직급을 가진 사원을 출력
select ename
from emp
where job = (select job from emp where ename='CLARK');
--clark의 급여와 동일하거나 더 많이 받는 사원명과 급여 출력
select ename, sal
from emp
where sal < (select sal from emp where ename='CLARK');
--dallas에서 근무하는 사원의 이름, 부서 번호 출력
select ename, deptno
from emp e
where e.deptno = (select deptno from dept where loc = 'DALLAS');
--salse 부서에서 근무하는 모든 사원의 이름과 급여 출력
select ename, sal
from emp
where deptno = (select deptno from dept where dname = 'SALES');
--직속상관이 king인 사원의 이름과 급여 출력
select ename, sal
from emp
where mgr = (select empno from emp where ename = 'KING');
--sal 3천보다 같거나 큰 사람의 고용번호, 급여, 이름 출력
select empno,sal,ename
from emp
where empno in( select empno
from emp
where sal>=3000);
--부서별로 가장 급여를 많이 받는 사원의정보(사원번호,사원이름,급여,부서번호) 출력
select empno, ename, sal,deptno
from emp
where sal in(select max(sal) from emp group by deptno)
order by sal desc;
--직급이 manager인 사람의 속한 부서의 부서번호와 부서명과 지역 출력
select e.empno, d.dname, d.loc
from emp e inner join dept d
on e.deptno = d.deptno
where job in(select job
from emp
where job='MANAGER');
--부하직원이 있는 사원의 이름과 급여 입사일을 출력
select ename, sal, hiredate
from emp
where empno in(select mgr
from emp);
--부하직원이 없는 사원의 사원번호 이름 급여 입사일 직책을 출력
select * from emp;
select empno, ename, hiredate, job
from emp
where empno not in(select mgr
from emp
where mgr is not null);
--연봉이 3000이상 받는 사원이 소속된 부서와 동일한 부서에서 근무하는 사원의 이름, 급여, 부서를 출력
select e.ename, e.sal, d.dname
from emp e inner join dept d
on e.deptno = d.deptno
where e.deptno in(select deptno
from emp
where sal >= 3000);
--부서별로 가장 급여를 많이 받는 사원의 사원번호, 이름, 급여, 부서번호를 출력
select empno, ename, sal,deptno
from emp e1
where sal in(select max(sal)
from emp e2
where e1.deptno = e2.deptno
group by deptno)
order by sal desc;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | --테이블만들어서 확인 create table tt ( empno number(3), ename varchar2(10), sal number(3), deptno number(3) ); insert into tt values(1,'aaa',100,10); insert into tt values(2,'aaa',120,10); insert into tt values(3,'ddd',130,10); insert into tt values(4,'ddd',120,10); insert into tt values(5,'ddd',120,20); insert into tt values(6,'ddd',130,20); insert into tt values(7,'rrr',140,10); --잘못된경우 select empno, ename, sal,deptno from tt a where sal in(select max(sal) from tt b group by deptno); select sal,deptno from tt a where sal=130 or sal=140; select max(sal) from tt group by deptno; --방법1 select empno, ename, sal,deptno from tt a where sal in(select max(sal) from tt b where a.deptno = b.deptno group by deptno) order by sal desc; --방법2 select empno, ename, sal,deptno from tt a where (deptno,sal) in(select deptno,max(sal) from tt b where a.deptno = b.deptno group by deptno) order by sal desc; --각 부서별로 평균급여보다 많이 받는 사원의 부서코드, 사원번호 이름 급여 입사일을 출력 select e1.empno, e1.ename, e1.sal ,e1.deptno, e1.hiredate from emp e1 where sal > (select avg(sal) from emp e2 where e1.deptno = e2.deptno group by e2.deptno) order by sal desc; --평균 급여보다 많이 받는 사원의 부서코드 사원번호 이름 급여 입사일을 출력 select empno, ename, sal, hiredate from emp where sal > (select avg(sal) from emp); --부서별로 가장 급여를 많이 받는 사원의 사원번호 이름 급여 부서번호 출력 select empno, ename, sal ,deptno, hiredate from emp e1 where sal in(select max(sal) from emp e2 where e1.deptno = e2.deptno group by deptno) order by sal desc; --영업 사원들 보다 급여를 많이 받는 사원들의 이름과 급여와 직급(담당업무)를 출력하되 영업사원은 출력하지 않는다. --방법1 select ename,sal,job from emp where sal > (select max(sal) from emp where job='SALESMAN') order by sal desc; --방법2 select ename,sal,job from emp where sal > ALL(select sal from emp where job='SALESMAN') order by sal desc; -- 영업사원들 보다 급여를 많이 받는 사원들의 이름과 급여를 출력하되 영업사원들은 제외하고 출력하시오 select ename,sal,job from emp where sal > (select max(sal) from emp where job='SALESMAN'); -- 직급이salesman인 사원이 받는 급여들의 최대급여보다 많이 받는 사원들의 이름과 급여를 출력하되 부서가 20번인 사원은 제외한다. select ename, sal from emp where sal >(select max(sal) from emp where upper(job)='SALESMAN') and deptno <> 20; --11. 직급이 salesman인 사원이 받는 급여들의 최소급여보다 많이받는 사원들의 이름과급여를 출력하되 부서가 20인 사원은 제외한다. --방법1 select ename, sal from emp where sal >(select min(sal) from emp where upper(job)='SALESMAN') and deptno <> 20 order by sal asc; --방법2 select ename, sal from emp where sal > any(select sal from emp where upper(job)='SALESMAN') and deptno <> 20 order by sal asc; | cs |
'프로그래밍 정리 > Oracle' 카테고리의 다른 글
Oracle 기본정리 - 외래키, 제약조건 (0) | 2019.12.04 |
---|---|
Oracle 기본정리 - recyclebin (0) | 2019.12.04 |
Oracle 기본정리 - sub query1(where절에 select 넣어보기) (0) | 2019.12.04 |
Oracle 기본정리 - Join 응용편(cross, equi, left, right inner join) (0) | 2019.11.29 |
Oracle 기본정리 - Join 기본편(cross, equi, left, right join) (0) | 2019.11.29 |