loading

Outer JOIN(외부조인)

2014. 5. 12. 00:10
728x90
반응형

ㅇ OUTER JOIN(외부조인)


내부조인의 경우 두 테이블에 해당하는 내용이 모두 있을 때만 결과를 나타낸다. 


STUDENT 테이블은 20개의 행, PROFESSOR 테이블은 16개의 행으로 이루어져 있고

학생들의 지도교수 넘버(profno)가 다음과 같을 때

학생들의 지도교수 명단은 INNER JOIN으로 확인할 수 있다.


SQL> select count(*) from student;


  COUNT(*)
----------
        20


SQL> select count(*) from professor;

  COUNT(*)
----------
        16


SQL> select name, profno from student;

NAME           PROFNO
---------- ----------
서진수           1001
서재수           2001
이미경           3002
김재수           4001
박동호           4003
김신영           1002
신은경           2002
오나라           4003
구유미           4007
임세현           4001
일지매           1002
김진욱           2001
안광훈           4002
김문호           4003
노정호           4007
이윤나
안은수
인영민
김주현
허우

20 개의 행이 선택되었습니다.




SQL>   select s.name "student name", p.name "professor name"

  2    from student s, professor P

  3    where s.profno = p.profno;    -- EQUI JOIN


student na professor

---------- ----------

서진수     조인형

김신영     박승곤

일지매     박승곤

김진욱     양선희

서재수     양선희

신은경     김영조

이미경     나한열

김재수     심슨

임세현     심슨

안광훈     최슬기

박동호     박원범

오나라     박원범

김문호     박원범

노정호     허은

구유미     허은


15 개의 행이 선택되었습니다




지도교수가 배정되지 않은 학생들까지도 포함되도록 하려면

Outer Join을 이용한다. 


< Oracle Left Outer Join >

SQL> select s.name "student name", p.name "professor name"

  from student s, professor p

  where s.profno = p.profno(+);


student name professor name 

------------ -------------- 

서진수       조인형        

일지매       박승곤        

김신영       박승곤        

김진욱       양선희        

서재수       양선희        

신은경       김영조        

이미경       나한열        

임세현       심슨          

김재수       심슨          

안광훈       최슬기        

김문호       박원범        

오나라       박원범        

박동호       박원범        

노정호       허은          

구유미       허은          

허우                       

김주현                     

인영민                     

안은수                     

이윤나                     


20 rows selected.




위 Oracle Outer Join에 대한 ANSI SQL Outer Join 

SQL> select s.name "student name", p.name "professor name"

from student s LEFT OUTER JOIN professor P

ON s.profno=p.profno;








위 SQL과 달리, 아직 학생들을 배정받지 못한 교수들까지 포함시키기 위해서는 Left Outer Join을 한다. 


SQL> select s.name "student name", p.name "professor name"

  from student s, professor p

  where s.profno(+) = p.profno;


student name professor name 

------------ -------------- 

서진수       조인형        

김신영       박승곤        

일지매       박승곤        

            송도권        

김진욱       양선희        

서재수       양선희        

신은경       김영조        

            주승재        

            김도형        

이미경       나한열        

            김현정        

김재수       심슨          

임세현       심슨          

안광훈       최슬기        

박동호       박원범        

오나라       박원범        

김문호       박원범        

            차범철        

            바비          

            전민          

노정호       허은          

구유미       허은          


22 rows selected.



위와 동일한 ANSI SQL Right Outer Join은 다음과 같다. 


select s.name "student name", p.name "professor name"

from student s RIGHT OUTER JOIN professor P

ON s.profno = p.profno;




학생과 교수 모두의 명단을 출력하려면 Full Outer Join을 한다. 

이건 ANSI SQL이 더 간단하다. 


SQL> select s.name "student name", p.name "professor name"

from student s FULL OUTER JOIN professor P

ON s.profno = p.profno;


student name professor name 

------------ -------------- 

서진수       조인형        

서재수       양선희        

이미경       나한열        

김재수       심슨          

박동호       박원범        

김신영       박승곤        

신은경       김영조        

오나라       박원범        

구유미       허은          

임세현       심슨          

일지매       박승곤        

김진욱       양선희        

안광훈       최슬기        

김문호       박원범        

노정호       허은          

이윤나                     

안은수                     

인영민                     

김주현                     

허우                       

             김도형        

             전민          

             주승재        

             바비          

             김현정        

             송도권        

             차범철        


27 rows selected.




오라클에서는 Left Join과 Right Join을 실시한 후 두 결과를 UNION으로 묶어줘야 한다. 


SQL> select s.name "student name", p.name "professor name"

  from student s, professor p

  where s.profno = p.profno(+) 

  UNION

  select s.name "student name", p.name "professor name"

  from student s, professor p

  where s.profno(+) = p.profno;






728x90

또루아빠 SQL(오라클,mysql) , , ,