본문 바로가기

디비1

디비 - 5월11일 월요일

 ★ 서브쿼리의 종류 3가지

  1. single row subquery

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

  2. multiple row subquery

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

  3. multiple column subquery

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


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


select ename,hiredate,deptno 

from emp

whrer hiredate = (select max(hiredate)

                    from emp

                    where deptno =20; )


문제 128. 30번 부서번호인 사원들과 월급도 같고 커미션도 같은 사원들의 이름과 월급과 커미션과 부서번호를 출력하시오.


select ename,sal,comm,deptno

from emp

where sal in (select sal 

                from emp

                where depono = 30 )

 and 

           comm in ( select comm

                         from emp

                         where deptno= 30); 


여러 개의 컬럼값이 리턴된다고 해서 ! 멀티플 컬럼 서브쿼리 


문제 129.직업이 SALESMAN 인 사원들과 월급이 같고 커미션도 같은 사원들의 이름과 우러급과 커미션과 직업을 출력하시오.


non pairwise 방식


select ename,sal,comm,deptno

from emp

where sal in (select sal 

                from emp

                where job = 'SALESMAN' )

 and 

           comm in ( select comm

                         from emp

                         where job = 'SALESMAN'); 



pairwise 방식  (쌍을 이루다)


select ename,sal,comm,job

from emp

where (sal, comm) in ( select sal,comm  

                            from emp

                           where job = 'SALESMAN') ;  


insert into emp(empno,ename,sal,comm,job)

values(1235,'JACK',1250,1400,'HR');

예네는 논페어와이즈랑 페어와이즈랑 결과같이 같은데



insert into emp(empno,ename,sal,comm,job)

values(1235,'JANE',1250,300,'HR');

                            

이렇게 했을떄는 달라진다.


문제 130.위의 data를 입력하고 129번에 사용한 pariwise 방식과 nonpairwise방식 2가지 출력결과를 확인하시오.


왜 non pairwise 방식이 data가 더 많이 출력이 되냐 ? ?

(1250,         400)   1

(1600    ,    300)

(1500    ,       0)

(1250    ,      500)  2


pair wise방식의 경우, 위의 4가지 경우만 만족해야 결과가 출력한다.


non pairwise 는 sal이나 comm이나 하나만 만족하면 나오거든.

그래서 16가지가 나오는데, 중복이 있을 수가 있다...

왜냐하면.. 1 번에서 1250,400 쌍이 있는데 2번에서 1250,이 400,300,0,500 걸면서

중복이 생길 수가 있기 때문이다.



*오라클은 pari wise방식, non pari wise 방식 둘다 지원하는데 mssql,mysal(보통 mysql은 게임회사에서 많이 지원)은 non pari wise 방식만 지원 한다.



*집합연산자의 종류 4가지


1.union all    합집합 연산자

2.union        합집합 연산자

3.intersect    교집합 연산자

4.minus       차집합 연산자


*집합연산자로 할 수 있는 작업?

여러개의 집합을 연결하는 작업


문제 131. 아래처럼 부서번호,부서번호별 토탈월급을 출력하시오.


select deptno,sum(sal)

from emp

group by deptno;



근데 이렇게 나오는데.. 


어 저거 뭐지? 아까 insert value 하는 과정에 있어서 데이터 삑사리 놔서..

그래서 어 그러면 deptno 를 delete 해야되는데 교수님은 hiredate를 지우네??

물어보니까, deptno,hiredate 다 아까 안넣었다고 , hiredate 해도된다고


문제 132.아래와 같이 결과를 출력하시오.

select sum(sal) 토탈

from emp

...


난 이렇게 했는데 교수님은


select '토탈',sum(sal)

from emp;


토탈     12315


근데 

deptno           sum(sal)

12                   23123

20                  123123

30                 151123

토탈                1231251515


이렇게 나오게 할려면 어떻게 해야도나!!


select deptno,sum(sal)

from emp

group by deptno

  union all

select '토탈' ,sum(sal)

from emp;




그러니까 에러가 뜨지???? 위 아래 형식이 같아야 된다는 거!!!


*집합 연사자를 사용할 때 주의사항


1.집합 연산자 위아래 커리의 컬럼의 갯수가 같아야 한다.


2.집합 연산자 위 아래 쿼리의 컬럼의 data type이 같아야 한다.


deptno 는 숫자인데, 토탈은 문자야 그러니까 에러가 나 같게 해줘야지~

그러니까 같게 해줘야 되는데 문자를 숫자로 할 수 없으니까 숫자를 문자로 변환해주는 함수.



select to_char(deptno),sum(sal)

from emp

group by deptno

  union all

select '토탈' ,sum(sal)

from emp;


문제 134.직업, 직업별 토탈월급을 출력하는데 맨 아래쪽에 전체 토탈월급을 출력하시오.


select job,sum(sal)

from emp

group by job

union all

select '토탈' , sum(sal)

from emp;



select job,sum(sal)

from emp

group by job

union all

select null , sum(sal)

from emp;

요렇게 하면 근데 이렇게 되 





근데 토탈월급이 나오고 안나오고 뭐가 더 괜찮냐고 하면 나오는게 좋다

왜냐하면 reporting 할때는 뭐가 뭔지를 알아야되기 때문.


문제135. 직업,직업별 인원수를 출력하고 맨 아래쪽에 전체 인원수를 출력하시오.


select job,count(*)

from emp

group by job

union all

select to_char(null) as job  , count (*)

from emp ;

정확하게는 ㅣ렇게 to_char , job을 집어넣어야 한다.


select job,count(*)

from emp

group by job

union all

select null,count(*)


union all 을 이렇ㄱ ㅔ2번 치게해서 성능이 좋은게 없다.가급적이면 한번만 select


select job,count(*)

from emp

group by rollup(job) ;


롤업이라는 함수를 이용하는 것!

(-> 롤업을 안써주면 직업별 인원수가 나오는데, 이거 써주는 순간 그것들의 전체토탈 합이 나오는거)


과제: 토요일 밤까지 제출해야하는 과제 

아래의 결과를 rollup으로 해서 출력하시오


deptno    sum(sal)

10             123213

20             123213

30           123123

토탈          123123123123123


오늘 마지막 문제: 입사한 년도(4자리) , 입사한 년도별 토탈월급을 출력하는데

맨 아래쪽에 전체토탈월급도 출력하시오


select to_char(hiredate,'RRRR') , sum(sal)

from emp

group by to_char(hiredate,'RRRR')

union all

select '토탈' , sum(sal)

from emp;








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

디비 - 6월1일월요일  (0) 2015.06.01
디비 - 5월18일 월요일  (0) 2015.05.19
디비1 - 5월4일 월요일  (0) 2015.05.04
디비1 - 4월27일  (0) 2015.04.27
@@@@@@@@중간고사 끝@@@@@@@@@@@@@@@  (0) 2015.04.27