6장 조인과 집합 : 여러 개의 테이블 연결하기

·2024년 1월 4일
0

모두의 SQL

목록 보기
5/10

조인이란

  • 조인(join)
    • 관계형 데이터베이스의 테이블 안에 있는 행들을 논리에 따라 연결할 수 있도록 하는 기법

    • 조인 기법의 종류

      조인 기법설명
      곱집합 (cartesian product)가능한 모든 행을 조인
      동등 조인 (equi join)조인 조건이 일치하는 경우 결과 출력
      비동등 조인 (nonequi join)조인 조건이 정확히 일치하지 않는 경우 결과 출력
      외부 조인 (outer join)조인 조건이 정확히 일치하지 않아도 모든 결과 출력
      자체 조인 (self join)자체 테이블에서 조인하고자 할 때 사용

동등 조인 : 똑같은 데이터끼리 연결하기

  • 동등 조인

    • 양쪽 테이블에서 조인 조건이 일치하는 행만 가져오는 가장 일반적이고 자주 쓰는 조인
    • inner join이라고도 부름

  • 예제

    SELECT *
     FROM EMPLOYEES A, DEPARTMENTS B
     WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID;

  • employees 테이블과 departments 테이블과 locations 테이블을 조인하여 각 직원이 어느 부서에 속하는지와 부서의 소재지가 어디인지 조회해 보세요

    SELECT A.EMPLOYEE_ID, A.DEPARTMENT_ID, B.DEPARTMENT_NAME, C.LOCATION_ID, C.CITY
     FROM EMPLOYEES A, DEPARTMENTS B, LOCATIONS C
     WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
     AND B.LOCATION_ID = C.LOCATION_ID;

외부 조인 : 모든 데이터를 연결하기

  • 외부 조인

    • 조건을 만족하지 않는 행도 모두 출력하기 위한 조인 기법
    • 동등 조인 조건을 만족하지 못해 누락되는 행을 출력하기 위해 사용함
    • 외부 조인은 (+) 기호를 사용
    • (+) 기호는 조인할 행이 없는, 즉 데이터 값이 부족한 테이블의 열 이름 뒤에 기술
    • (+) 기호는 외부 조인하려는 한쪽에만 기술할 수 있음, 테이블 양쪽에는 기술할 수 없음
    • (+) 기호를 붙이면 데이터 값이 부족한 테이블에 NULL 값을 갖는 행이 생성되어 데이터 값이 충분한 테이블의 행들이 NULL 행에 조인됨

  • EMPLOYEES 테이블과 DEPARTMENTS 테이블을 DEPARTMENT_ID로 외부 조인하여 DEPARTMENT_ID가 NULL 값인 KIMBERELY GRANT도 함께 출력하기

    SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.LAST_NAME, B.DEPARTMENT_ID, B.DEPARTMENT_NAME
     FROM EMPLOYEES A, DEPARTMENTS B
     WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID(+)
     ORDER BY A.EMPLOYEE_ID;

자체 조인 : 자기 자신의 데이터와 연결하기

  • employees 테이블을 자체 조인하여 직원별 담당 매니저가 누구인지 조회하기

    SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.LAST_NAME, A.MANAGER_ID,
    		B.FIRST_NAME||' '||B.LAST_NAME MANAGER_NAME
     FROM EMPLOYEES A, EMPLOYEES B
     WHERE A.MANAGER_ID = B.EMPLOYEE_ID
     ORDER BY A.EMPLOYEE_ID;

  • 조인을 사용할 때는 테이블에 별칭을 사용하길 권장

    • 테이블 이름에 별칭을 사용하면 긴 테이블 이름을 축약하여 사용할 수 있음

    • 별칭을 사용하면 SQL문을 간략하게 만들 수 있어 가독성이 높아지고 SQL문을 효율적으로 작성할 수 있음

    • 길게 사용해도 되지만 가급적 짧게 사용하는 것이 좋음

    • SQL 로직이 복잡할 때는 테이블의 별칭에 의미를 부여해서 사용하는 것도 도움이 됨


집합 연산자 : 집합으로 연결하기

  • 집합 연산자는 SELECT 문을 여러 개 연결하여 작성하며, 각 SELECT 문의 조회 결과를 하나로 합치거나 분리할 수 있음

    SELECT 열 이름1, 열 이름2, 열 이름3
     FROM 테이블 이름
     집합 연산자 (UNION, UNION ALL, INTERSET, MINUS)
     SELECT 열 이름1, 열 이름2, 열 이름3
     FROM 테이블 이름
     ORDER BY 열 이름 [ASC or DESC]

  • 집합 연산자의 종류

    종류설명집합 종류
    UNIONSELECT 문의 조회 결과의 합집합
    중복되는 행은 한 번만 출력합집합
    UNION ALLSELECT 문의 조회 결과의 합집합
    중복되는 행도 그대로 출력합집합
    INTERSETSELECT 문의 조회 결과의 교집합
    중복되는 행만 출력교집합
    MINUS첫 번째 SELECT 문의 조회 결과에서 두 번째 조회 결과를 뺌차집합

  • employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을 UNION 연산자를 이용해 합치기

    SELECT DEPARTMENT_ID
     FROM EMPLOYEES
     UNION
     SELECT DEPARTMENT_ID
     FROM DEPARTMENTS;

  • employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을 UNION ALL 연산자를 이용해 합치기

    SELECT DEPARTMENT_ID
     FROM EMPLOYEES
     UNION ALL
     SELECT DEPARTMENT_ID
     FROM DEPARTMENTS
     ORDER BY DEPARTMENT_ID;

  • employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합의 교집합을 INTERSECT 연산자를 이용해 출력하기

    SELECT DEPARTMENT_ID
     FROM EMPLOYEES
     INTERSECT
     SELECT DEPARTMENT_ID
     FROM DEPARTMENTS
     ORDER BY DEPARTMENT_ID;

  • departments 테이블의 department_id 집합에서 employees 테이블의 department_id 집합을 MINUS 연산자를 이용해 빼기

    SELECT DEPARTMENT_ID
     FROM DEPARTMENTS
     MINUS
     SELECT DEPARTMENT_ID
     FROM EMPLOYEES;

0개의 댓글