[Chapter 2] 08 여러 테이블을 하나의 테이블처럼 사용하는 조인

희진·2024년 4월 3일
post-thumbnail

08-1 조인

집합 연산자와 조인의 차이점

  • 조인(JOIN)은 두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력할 때 사용하는 방식
  • 집합 연산자를 사용한 결과 = 두 개 이상 SELECT문의 결과 값을 세로로 연결한 것
  • 조인을 사용한 결과 = 두 개 이상의 테이블 데이터를 가로로 연결한 것

여러 테이블을 사용할 때의 FROM절

SELECT *
FROM EMP, DEPT
ORDER BY EMPNO;

FROM

조인 조건이 없을 때의 문제점

조인을 통한 출력은 결과로 나올 수 있는 모든 행을 조합하기 때문에, 정확히 맞아떨어지지 않는 데이터도 함께 출력

  • 열 이름을 비교하는 조건식으로 조인하기
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY EMPNO;

테이블의 별칭 설정

FROM 테이블 이름1 별칭1, 테이블 이름2 별칭2, ...
  • 테이블 이름을 별칭으로 표현하기
SELECT *
FROM EMP E , DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;

08-2 조인 종류

등가 조인(EQUI JOIN)

  • 테이블을 연결한 후에 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식
  • 내부 조인(INNER JOIN) 또는 단순 조인(SIMPLE JOIN)으로 부르기도 함
  1. 두 테이블에 부서 번호가 똑같은 열 이름으로 포함되어 있을 때 (에러)
SELECT EMPNO, ENAME, DEPTNO, DNAME, LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

1행에 오류: ORA-00918: 열의 정의가 애매합니다

  1. 열 이름에 각각의 테이블 이름도 함께 명시할 때
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY D.DEPTNO, E.EMPNO;

EQUI JOIN

  1. WHERE절에 조건식 추가하여 출력 범위 설정하기
SELECT E.EMPNO, E.ENAME, E.SAL, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND SAL >= 3000;

EQUI JOIN

  1. 조인 테이블 개수와 조건식 개수의 관계
    조건식 개수 = 조인 테이블 개수 - 1

비등가 조인(NON-EQUI JOIN)

등가 조인 외의 방식

  • 급여 범위를 지정하는 조건식으로 조인하기
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

NON-EQUI JOIN

자체 조인(SELF JOIN)

  • 같은 테이블을 두 번 사용하여 자체 조인하기
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
       E2.EMPNO AS MCR_EMPNO,
       E2.ENAME AS MCR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;

SELF JOIN

외부 조인(OUTER JOIN)

조인 조건 데이터 중 어느 한쪽이 NULL임에도 결과를 출력할 때 포함시켜야 하는 경우

  • 왼쪽 외부 조인(LEFT OUTER JOIN) : WHERE TABLE1.COL1 = TABLE2.COL1(+)
  • 오른쪽 외부 조인(RIGHT OUTER JOIN) : WHERE TABLE1.COL1(+) = TABLE2.COL1
  1. 왼쪽 외부 조인 사용하기
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO(+)
ORDER BY E1.EMPNO;
  1. 오른쪽 외부 조인 사용하기
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR(+) = E2.EMPNO
ORDER BY E1.EMPNO;
LEFT OUTER JOIN RIGHT OUTER JOIN

08-3 SQL-99 표준 문법으로 배우는 조인

NATURAL JOIN

  • 조인 대상이 되는 두 테이블에 이름과 자료형이 같은 열을 찾은 후 그 열을 기준으로 등가 조인
  • 조인 기준 열로 명시된 열은 SELECT절에서 테이블 이름을 붙이지 않고 작성
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM
       DEPTNO, D.DNAME, D.LOC
FROM EMP E NATURAL JOIN DEPT D
ORDER BY DEPTNO, E.EMPNO;

NATURAL JOIN

JOIN ~ USING

  • USING 키워드에 조인 기준으로 사용할 열 명시
  • 조인 기준 열로 명시된 열은 SELECT절에서 테이블 이름을 붙이지 않고 작성
FROM TABLE1 JOIN TABLE2 USING (조인에 사용한 기준 열)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
       DEPTNO, D.DNAME, D.LOC
FROM EMP E JOIN DEPT D USING (DEPTNO)
WHERE SAL >= 3000
ORDER BY DEPTNO, E.EMPNO;

JOIN ~ USING

JOIN ~ ON

  • 기존 WHERE절에 있는 조인 조건식을 ON 키워드 옆에 작성
  • 조인 기준 조건식은 ON에 명시하고 그 밖의 출력행을 걸러 내기 위해 WHERE 조건식을 따로 사용
FROM TABLE1 JOIN TABLE2 ON (조인 조건식)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
       E.DEPTNO,
       D.DNAME, D.LOC
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
WHERE SAL <= 3000
ORDER BY E.DEPTNO, EMPNO;

JOIN ~ ON

OUTER JOIN

  1. 왼쪽 외부 조인(LEFT OUTER JOIN)
  • 기존 : WHERE TABLE1.COL1 = TABLE2.COL1(+)
  • SQL-99 : FROM TABLE1 LEFT OUTER JOIN TABLE2 ON (조인 조건식)
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1 LEFT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;

LEFT OUTER JOIN

  1. 오른쪽 외부 조인(RIGHT OUTER JOIN)
  • 기존 : WHERE TABLE1.COL1(+) = TABLE2.COL1
  • SQL-99 : FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON (조인 조건식)
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1 RIGHT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;

RIGHT OUTER JOIN

  1. 전체 외부 조인(FULL OUTER JOIN)
  • 기존 : 기본 문법은 없음 (UNION 집합 연산자를 활용)
  • SQL-99 : FROM TABLE1 FULL OUTER JOIN TABLE2 ON (조인 조건식)
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1 FULL OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;

FULL OUTER JOIN

SQL-99 조인 방식에서 세 개 이상의 테이블을 조인할 때

  • 기존 조인 방식은 FROM절에 조인 테이블을 명시하고 조인 관련 조건식을 WHERE절에 명시하기 때문에 테이블 수가 두 개를 넘더라도 다음과 같이 작성하면 아무 문제가 없음
FROM TABLE1, TABLE2, TABLE3
WHERE TABLE1.COL = TABLE2.COL
AND TABLE2.COL = TABLE3.COL
  • FROM절에 조인 관련 내용을 작성해야 하는 SQL-99 방식에서는 테이블의 개수가 두 개를 넘어갈 때, FROM절에 두 개 테이블을 키워드로 조인한 바로 옆에 SQL-99 방식의 조인 내용을 추가로 작성하여 세 개 이상의 테이블을 조인할 수 있음
FROM TABLE1 JOIN TABLE2 ON (조건식)
            JOIN TABLE3 ON (조건식)
profile
열심히 살겠습니다

0개의 댓글