본문 바로가기

나 취준생/SQL

SQL - 테이블 조인

320x100

1. 여러 테이블의 데이터를 조인해서 출력하기 1(EQUI JOIN)


** 조인을 이용하면 두개 이상의 테이블들의 컬럼들을 하나의 결과로 모아서 볼 수 있다.


지금까지는 한 테이블 안에 있는 컬럼들만 선택해서 출력했었는데,

두 테이블에 있는 각각의 컬럼들을 출력할 수도 있을까?


예제 : emp 테이블에 있는 ename 이라는 컬럼과, dept 테이블에 있는 loc 이라는 컬럼을 출력하기


select  ename,  loc

   from  emp,  dept

   order by ename;



오! 결과가 나온다.

그런데 자세히 보면, 한 이름 당 모든 부서가 출력되는 걸 확인할 수 있다.

14 명의 사원이 있는 emp 테이블과 4개의 부서의 정보가 있는 dept 테이블이 모여

14 * 4 = 56 건의 결과가 출력되었다.


모든 경우의 수를 확인해보고 싶은 경우도 있겠지만, 대부분의 경우는 emp 사원의 정보와 일치하는

부서의 정보를 dept 테이블에서 찾아 동시에 출력하고 싶을 것이다.


emp 테이블과 dept 테이블의 접점은 부서번호 (deptno) 라는 컬럼이다.


위를 활용해 조인 조건을 주는 것이 중요하다.


select  ename,  loc

    from  emp,  dept  

    where  emp.deptno = dept.deptno;


where 절에 조인 조건을 주는데, 이 때 deptno는 양쪽 테이블에 존재하기 때문에

어느쪽의 컬럼인지 정확히 명시해줘야 컴퓨터가 이해할 수 있다.

테이블명.컬럼명으로 명시해주자


예제 : 월급이 2000 이상인 사원들의 이름과 월급과 부서위치를 출력하기


select  e.ename, e.sal, d.loc

  from  emp  e,  dept   d

  where   e.deptno = d.deptno  and   e.empno  in  ( 7788, 7902, 7369 );


다음과 같이 from 절에서 테이블 명을 e. d와 같이 명시할 수 있다.

이렇게 하면 select 절과 where 절 등에 좀 더 간단하게 작성할 수 있다.

대신 from 절이 가장 먼저 실행되기 때문에 다른 절에서 테이블 명을 그대로 사용하면 인식이 안되니

꼭 선언한 테이블 명으로 따라서 작성하자


2. 여러 테이블의 데이터를 조인해서 출력하기 2( NON EQUI JOIN )


** 조인하려는 두개의 테이블 사이에 공통된 컬럼이 없었을때 사용하는 조인 문법


                


emp 테이블의 월급(sal)을 통해 등급을 매길 수 있는 salgrade 테이블이다.

euqi 조인과 다른 점은 이번에는 공통되는 컬럼이 없다는 점이다.

대신 sal 이라는 컬럼을 losal과 hisal을 참조하여 그 사이에 있다면 grade를 반환하도록 하자


예제 : 


select   e.ename,  e.sal,  s.grade 

   from   emp  e,  salgrade  s

   where   e.sal  between  s.losal  and  s.hisal;



3. 여러 테이블의 데이터를 조인해서 출력하기 3( OUTER JOIN )


** 조인하려는 두 테이블의 공통된 컬럼의 데이터가 서로 똑같이 일치 하지 않을 때 조인하기 위해서 사용하는 조인 방법


위 말이 잘 이해가 되지 않을 수 있다.


부서 테이블을 보자.


10번 부터 40번까지 있는 것을 확인할 수 있다.


그렇다면 사원들의 부서 번호, 부서 위치를 확인하자


 select   e.ename,  d.loc, e.deptno 

   from   emp  e,  dept   d

   where  e.deptno = d.deptno ; 


부서 번호 40번의 위치 정보가 나오지 않았다.

사원들 중 부서 번호가 40번인 사원은 없기 때문이다.

하지만 40번의 위치 정보도 출력하고 싶다면 OUTER JOIN을 사용해야 한다.

즉, 두 테이블의 컬럼의 내용은 같으나, 한 쪽 테이블의 정보가 다른쪽 테이블의 정보보다 부족하여 전체가 보이지 않을 때 쓰는 조인이랄까


그렇다면 40번까지 나오도록 수정하자.


select   e.ename,  d.loc, e.deptno

   from   emp  e,  dept   d

   where  e.deptno(+) =d.deptno ; 


다음과 같이 한 행이 추가로 나오게 되었다.

OUTER JOIN 을 사용하는 방법은 (+)만 추가해주면 되는데 이 때 (+)는 앞 쪽에 고정이 아니라,

꼭 정보가 부족한 테이블 앞에 붙여야한다.


4. 여러 테이블의 데이터를 조인해서 출력하기 4 ( SELF JOIN )


** 자기 자신의 테이블과 조인하는 조인 문법


근데 왜 자신 테이블이랑 조인을 해야하나?


자신 테이블의 정보가 다시 조건이 되어 정보를 찾을 수 있는 경우가 있기 때문


예제 : 사원의 이름, 사원 번호, 관리자 번호를 출력하기

select  empno, ename, mgr

    from  emp;


위와 같이 사원 번호, 관리자 번호가 있는 사원 테이블은

어떤 사람이 어떤 사람의 관리자인지 알 수 있다.

따라서


예제 : 사원의 이름과 그 사원의 관리자의 이름을 출력하기


select   사원.ename,  관리자.ename

   from   emp  사원,  emp  관리자 

   where   사원.mgr  = 관리자.empno; 


이렇게 하면 할 수 있다.

이 때 포인트는 from 절에 같은 테이블을 두 번 선언하고, 구별을 위해 꼭 별칭을 지어주는 것이다.

그리고 다른 조인과 동일하게 다른 테이블처럼 생각하고 조인을 실행하면 된다.

반응형

'나 취준생 > SQL' 카테고리의 다른 글

SQL - 테이블 간 집합 연산자  (0) 2020.11.08
SQL - 테이블 조인 2  (0) 2020.11.07
SQL - 데이터 분석 함수 2  (0) 2020.11.05
SQL - 컬럼을 ROW로 출력하기  (0) 2020.11.05
SQL - listagg, lag, lead  (0) 2020.11.05