SQL - 조인

AIR·2024년 1월 16일

조인

-- 조인: 2개 이상의 테이블 데이터를 가로로 연결
-- 집합 연산자: SELECT문의 결과 값을 세로로 연결

-- FROM절에 여러 테이블 선언: 모든 경우의 수
SELECT *
FROM EMP,
     DEPT
ORDER BY EMPNO;

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

-- 테이블의 별칭 설정
SELECT *
FROM EMP E,
     DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;

조인 종류

-- 조인 종류
-- 등가 조인(내부 조인): 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정
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;

-- 비등가 조인: 등가 조인 방식 외
SELECT *
FROM EMP E,
     SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

-- 자체 조인: 하나의 테이블을 여러 개의 테이블처럼 활용하여 조인
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;

-- 외부 조인(아우터 조인): 두 테이블 간 조인 수행에서 조인 기준 열의 어느 한쪽이 NULL이어도 강제 출력
-- 왼쪽 외부 조인
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;

-- 오른쪽 외부 조인
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;

SQL-99 표준 문법을 사용한 조인

-- SQL-99 표준 문법을 사용한 조인

-- NATURAL JOIN: 등가 조인 대신 사용, 이름과 자료형이 같은 열을 찾은 후 등가 조인
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;

-- JOIN ~ 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 ~ ON: 가장 범용성 있고, 기존 조인 방식과 큰 차이가 없다.
SELECT E.EMPNO,
       E.ENAME,
       E.JOB,
       E.MGR,
       E.HIREDATE,
       E.SAL,
       E.COMM,
       D.DEPTNO,
       D.DNAME,
       D.LOC
FROM EMP E
         JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
WHERE SAL <= 3000
ORDER BY DEPTNO, E.EMPNO;

-- OUTER JOIN: 외부 조인에 사용
-- 왼쪽 외부 조인
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.EMPNO = E2.EMPNO)
ORDER BY E1.EMPNO;

-- 오른쪽 외부 조인
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, MGR_EMPNO;

-- 전체 외부 조인
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;

-- 3개 이상의 테이블 조회
-- 기존 조인
-- FROM TABLE1, TABLE2, TABLE3
-- WHERE TABLE1.COL = TABLE2.COL
-- AND TABLE2.COL = TABLE3.COL

-- SQL-99 방식
-- FROM TABLE1 JOIN TABLE2 ON (조건식)
-- JOIN TABLE3 ON (조건식)
profile
백엔드

0개의 댓글