[SQL] 표준 조인(STANDARD JOIN)

멋쟁이펭귄맨·2021년 8월 19일
0

이 게시글은 패스트캠퍼스의 '데이터베이스와 SQLD 합격패스 Online' 강의를 요약한 내용입니다.


표준 조인의 형태


일반 집합 연산자설명
INNER JOINJOIN 조건에서 동일한 값이 있는 행만 반환
NATURAL JOIN두 테이블 간의 동일한 이름을 갖는 모든 컬럼에 대해 EQUI(=) JOIN 수행
USING 조건절같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해서만 선택적으로 EQUI JOIN 가능
ON 조건절컬럼 명이 다르더라도 JOIN 조건을 사용할 수 있음
CROSS JOIN일반 집합 연산자의 PRODUCT 개념으로, JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 말함
OUTER JOINJOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용할 수 있음


예시


INNER JOIN


--INNER JOIN 예시 

SELECT A.EMP_NO
     , A.EMP_NM
     , A.ADDR
     , B.DEPT_CD
     , B.DEPT_NM
  FROM TB_EMP A, TB_DEPT B 
  WHERE A.DEPT_CD = B.DEPT_CD 
    AND A.ADDR LIKE '%수원%'
ORDER BY A.EMP_NO
; 

NATURAL JOIN

SELECT A.EMP_NO
     , A.EMP_NM
     , A.ADDR     
     , DEPT_CD
     , B.DEPT_NM
FROM TB_EMP A NATURAL JOIN TB_DEPT B 
  WHERE A.ADDR LIKE '%수원%'
  ;

NATURAL JOIN을 할 때, JOIN 컬럼에 앨리어스를 지정하면 안된다.

-- 앨리어스를 지정하는 경우, SQL이 실행되지 않는다. 
 SELECT A.EMP_NO
      , A.EMP_NM
      , A.ADDR     
      , B.DEPT_NM
      , **B.DEPT_CD**
  FROM TB_EMP A NATURAL JOIN TB_DEPT B 
 WHERE A.ADDR LIKE '%수원%'
  ;

USING절

1) USING 절은 FROM 구문과 함께 사용한다.
2) USING 절에 두 테이블이 공통적으로 가지고 있는 컬럼명을 기재한다.
3) USNING 절에 들어가는 조인 컬럼에는 앨리어스를 쓸 수 없다.

 SELECT A.EMP_NO
      , A.EMP_NM
      , A.ADDR     
      , B.DEPT_NM
      , DEPT_CD
   FROM TB_EMP A JOIN TB_DEPT B USING (DEPT_CD)
  WHERE A.ADDR LIKE '%수원%'
  ;

-- 앨리어스를 지정하는 경우, SQL이 실행되지 않는다. 
 SELECT A.EMP_NO
      , A.EMP_NM
      , A.ADDR     
      , B.DEPT_NM
      , DEPT_CD
   FROM TB_EMP A JOIN TB_DEPT B USING (**B.DEPT_CD**)
  WHERE A.ADDR LIKE '%수원%'
  ;

ON절

1) ON 절은 FROM 구문과 함께 사용한다.
2) ON 절 내에 조인 컬럼에 앨리어스를 사용해야 한다.
3) 앨리어스를 정확히 기재하지 않으면 에러가 발생한다.

 SELECT A.EMP_NO
      , A.EMP_NM
      , A.ADDR     
      , B.DEPT_CD
      , B.DEPT_NM
   FROM TB_EMP A JOIN TB_DEPT B ON (A.DEPT_CD = B.DEPT_CD)
  WHERE A.ADDR LIKE '%수원%'
;

-- 앨리어스를 지정하지 않는 경우, SQL이 실행되지 않는다. 
 SELECT A.EMP_NO
        , A.EMP_NM
        , A.ADDR     
        , **DEPT_CD**
        , B.DEPT_NM
     FROM TB_EMP A JOIN TB_DEPT B ON (A.DEPT_CD = B.DEPT_CD)
    WHERE A.ADDR LIKE '%수원%'
  ;

3개의 테이블 조인

1) 3개의 테이블을 조인하는데 조인 조건은 2개가 필요하다.
2) N개의 테이블을 조인하는데 조인 조건은 N-1개가 필요하다.

SELECT
       A.EMP_NO
     , A.EMP_NM
     , A.ADDR
     , B.DEPT_CD
     , B.DEPT_NM
     , C.CERTI_CD
  FROM TB_EMP A
     , TB_DEPT B
     , TB_EMP_CERTI C
 WHERE A.DEPT_CD = B.DEPT_CD
   AND A.ADDR LIKE '%수원%'
   AND A.EMP_NO = C.EMP_NO
ORDER BY A.EMP_NO;

3개의 테이블 조인(ANSI 방식)

SELECT A.EMP_NO
     , A.EMP_NM
     , A.ADDR     
     , B.DEPT_NM
     , B.DEPT_CD
     , C.CERTI_CD
  FROM TB_EMP A JOIN TB_DEPT B 
   ON (A.DEPT_CD = B.DEPT_CD)
  JOIN TB_EMP_CERTI C 
   ON (A.EMP_NO = C.EMP_NO)
  WHERE A.ADDR LIKE '%수원%';

아우터 조인 - LEFT OUTER 조인

1) LEFT (A = TB_EMP)는 다 나오고, RIGHT(B = TB_DEPT)는 매칭되는 것만 나오게 됨

SELECT A.EMP_NO
     , A.EMP_NM
     , B.DEPT_CD
     , B.DEPT_NM
  FROM TB_EMP A, TB_DEPT B 
 WHERE A.DEPT_CD IN ( '000000', '100001')
   AND A.DEPT_CD = B.DEPT_CD(+)
;

아우터 조인 - LEFT OUTER 조인(ANSI 조인 방법)

SELECT A.EMP_NO
     , A.EMP_NM
     , B.DEPT_CD
     , B.DEPT_NM
  FROM TB_EMP A 
LEFT OUTER JOIN TB_DEPT B 
 ON (A.DEPT_CD = B.DEPT_CD)
WHERE A.DEPT_CD IN ( '000000', '100001')
;

아우터 조인 - RIGHT OUTER 조인

1) LEFT (A = TB_EMP)는 매칭되는 것만 나오고, RIGHT(B = TB_DEPT)는 다 나옴

SELECT A.EMP_NO
     , A.EMP_NM
     , B.DEPT_CD
     , B.DEPT_NM
  FROM TB_EMP A
  , TB_DEPT B
WHERE B.DEPT_CD IN ('100014', '100015', '100001')
  AND A.DEPT_CD(+) = B.DEPT_CD ;

아우터 조인 - RIGTH OUTER 조인(ANSI 조인 방법)

  SELECT
      A.EMP_NO
    , A.EMP_NM
    , B.DEPT_CD
    , B.DEPT_NM
 FROM TB_EMP A
 FULL OUTER JOIN TB_DEPT B ON (A.DEPT_CD = B.DEPT_CD)
WHERE 1 = 1
  AND (   A.EMP_NO IS NULL
       OR B.DEPT_CD IS NULL
      )
ORDER BY B.DEPT_CD DESC, A.EMP_NO DESC
;

FULL 아우터 조인

1) EMP_NO가 NULL 이거나, DEPT_CD가 NULL 인 것에 대한 조건을 주었다.
2) EQUI 조인에 실패한 것들만 추출
3) JOIN 조건에서 동일한 값이 없는 행도 반환

  SELECT
      A.EMP_NO
    , A.EMP_NM
    , B.DEPT_CD
    , B.DEPT_NM
 FROM TB_EMP A
 FULL OUTER JOIN TB_DEPT B ON (A.DEPT_CD = B.DEPT_CD)
WHERE 1 = 1
  AND (   A.EMP_NO IS NULL
       OR B.DEPT_CD IS NULL
      )
ORDER BY B.DEPT_CD DESC, A.EMP_NO DESC
;

profile
안녕하세요

0개의 댓글

관련 채용 정보