본문 바로가기

디비1

디비1 - 5월4일 월요일

문제111. 최대 월급을 받는 사원의 이름과 월급을 출력하시오.


select ename,max(sal)

from emp;


*subquery를 사용해야 한다. (왜 ? ??  ?)


문제112.JONES의 월급보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하시오.


(우선 JONES의 월급을 알아야겠지??)


select sal

from emp

where ename='JONES' ;  


select ename,sal

from emp

where sal> (select sal 

                from emp

               where ename='JONES') ;


빨간색은 메인쿼리, 파란색은 서브쿼리 라고 한다.이렇게 한꺼번에 쿼리를 써서 한방에 구하자는 것.오라클이 서브쿼리를 먼저 시행한데, 존스의 월급을 리턴하고 그리고 이제 메인쿼리를 돌린다.


문제113. SCOTT과 같은 월급을 받는 사원들의 이름과 월급을 출력하시오.


select ename,sal

from emp

where sal =  (select sal

                   from emp

                 where ENAME = 'SCOTT' )


이렇게 하면 스캇도 같이 나오거든 그래서


문제114. 위의 결과에서 scott은 제외하고 출력하시오.   


select ename,sal

from emp

where sal =  (select sal

                   from emp

                 where ENAME = 'SCOTT' )

and ename != 'SCOTT' ; 


이때 != 이거는 서브쿼리가 아니라 메인쿼리다.


문제115. ALLEN의 같은 부서번호에서 근무하는 사원들의 이름과 부서번호를 출력하시오. 


select ename,deptno

from emp

where deptno = (select deptno

                    from emp

                    where ename = 'ALLEN');

(ALLEN을 제외하고 나와라~ 하면)

and ename != 'ALLEN' ;


문제116.ALLEN 보다 늦게 입사한 사원들의 이름과 입사일을 출력하시오.


select ename,hiredate

from emp

where hiredate < (select hiredate

                      from emp

                      where ename = 'ALLEN') ;


문제 117. DALLAS에 있는 부서번호에서 근무하는 사원들의 이름과 월급을 출력하시오.


select ename,sal

from emp

where deptno = (select deptno

                    from dept (emp도 되고~! 난 emp했었으)

                   where LOC = 'DALLAS')


문제 118.직업이 SALESMAN인 사원들의 최대월급보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하시오.


select ename,sal

from emp

where sal > (select max(sal)

                from emp

               where  JOB ='SALESMAN' ) ;

                 group by sal 어 그룹 by 안해도되나..?


문제 119.최대월급을 받는 사원의 이름과 월급을 출력하시오


select ename,sal

from emp

where sal = (select max(sal)

                 from emp) ;


이렇게 서브쿼리를 쓰지 않으면 안 풀리는 문제..! 

(왜..지...?)


문제120.KING에게 보고하는 사원들의 이름과 월급을 출력하시오(KING의 직속부하 사원들)


select ename,sal

from emp

where mgr = select empno

               from emp

                where ename = 'KING' );


문제 121.직업이 SALESMAN인 사원들과 같은 월급을 받는 사원들의 이름과 월급을 출력하시오.


select ename,sal 

from emp

where sal in (select sal

                from emp

               where job= 'SALESMAN') ; 


(직업이 salesman 이 한개면 상관없는데 여러개 일수도 있으니까~~ ) 


*subquery의 종류 3가지

1. single row subquery

서브쿼리에서 메인쿼리로 하나의 값이 리턴되는 경우


연산자 : > , < , >= , <= , != , ^= , <>


2. multiple row subquery


서브쿼리에서 메인쿼리로 여러개의 값이 리턴되는 경우.


연산자 : in, not in , >all , <all , >any , <any



3. multiple column subquery

서브쿼리에서 메인쿼리로 여러개의 컬럼값이 리턴되는 경우


문제 122.직업이 SALESMAN인 사원들과 월급이 같지 않은 사원들의 이름과 월급을 출력하시오.


select ename,sal

from emp

where sal not in (select sal

                    from emp

                    where job = 'SLAESMAN') ; 


문제 123. 관리자인 사원들의 이름을 출력하시오.

자기밑에 있는 직속부하가 한명이라도 있는 사원들을 출력하시오 !


select ename

from emp

where empno in (select mgr

                     from emp) ;


문제 124.관리자가 아닌 사원들의 이름을 출력하시오.(이 문제 뭔 의미지..)



select ename

from emp

where empno not in (select mgr

                     from emp) ;



이렇게 하면 not row 라고 나오는데.... 왜 그렇냐면 

      !=all
      != (7566 and 7839 and ... and null ) 
null을 만나는데...  


이거 뭐하는기고


(* true and true => true 
   true and false => false
   true or true => true 
   true or false => true 
   true or null(null은 true 또는 false인데 케이스 나눠서 true or 이랑 해보면) => true 
   true and null(이것도 케이스 나누어서 두개 하면 true,false 두개 나와서) =>null




select ename

from emp

where empno not in (select mgr

                     from emp

                    where mgr is not null) ; 


********not in을 쓸 때는 꼭 널 처리를 해줘야된다!!!@@  반드시!!!

근데 낫인 뿐만 아니라 .. 그냥 다 그런거 아니가


문제 125.직업이 SALESMAN인 사원들 중에서 가장 많은 월급을 받는 사원보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하시오


select ename,sal

from emp

where sal > (select max(sal)

               from emp

               where job = 'SALESMAN')


select ename,sal

from emp

where sal >all  (select sal

               from emp

               where job = 'SALESMAN')

       >all (1000,2000,3000)


>all 은 가장 큰값보다 크다.


all쓰고 안쓰고 차이가 있다.순서가 틀리다. 데이터는 같은데 순서가 틀리다.


문제 126. 직업이 SALESMAN인 사원들 중에서 가장 작은 월급을 받는 사원보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하시오.


select ename,sal

from emp

where sal > any ( select sal        (min 쓰던지)

                     from emp

                     where job= 'SLAESMAN' ) 


all,any 성능은 안좋아서 잘안쓰는데 알고는 있어야 된다~~~


문제 127.      20번 부서번호인 사원들 중에서 가장 늦게 입사한 사원의 이름과 입사일과 부서번호를 출력하시오.


multiple column subquery  (여러개의 컬럼값이 리턴될 수 있다. 그전에는 월급만 리턴했는데, 이걸 쓰면 부서번호와 월급을 같이 리턴할 수 있다.)


select ename,hiredate,deptno

from emp

where hiredate < any  (select hiredate

                           from emp

                            where deptno = 20) ; 

'디비1' 카테고리의 다른 글

디비 - 5월18일 월요일  (0) 2015.05.19
디비 - 5월11일 월요일  (0) 2015.05.11
디비1 - 4월27일  (0) 2015.04.27
@@@@@@@@중간고사 끝@@@@@@@@@@@@@@@  (0) 2015.04.27
문제공유 풀이  (0) 2015.04.19