ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JOIN - Left Outer Join
    데이터베이스/SQL 2022. 5. 30. 10:56

     

    프로그래머스의 JOIN 문제를 풀면서 학습한 Left Outer Join에 정리하고자 합니다.

     

    SQL JOIN 시각화

    Outer Join에는 Left Outer Join, Right Outer Join, Full Outer Join이 있습니다.

     

    이 글에서는 Left Outer Join(사용법은 Right Outer Join도 같습니다)과 아래의 프로그래머스 문제에 어떻게 적용했는지 정리해보고자 합니다.

     

    여러 테이블을 기준으로 진행이 가능하나 간단하게 설명하고자 두 개의 테이블을 연결시킨다고 가정하겠습니다.

    편의상 기준이 되는 테이블을 A, 다른 테이블을 B라고 하겠습니다.

     

    Join

    • 테이블 간의 결합을 의미
    • 두개 이상의 테이블 필요
    • 테이블 간에는 FK로 연결되어 있어야 해당 Key를 활용하여 Join 가능 

     

    Inner Join

    • 조건에 부합하는 행들만 결합하는 것

     

    Outer Join

    • 조건에 부합하지 않는 행까지도 포함시켜 결합하는 것
    • 종류 : Left Outer Join, Right Outer Join, Full Outer Join

     

    Left Outer Join (Outer을 줄여서 Left Join이라고도 많이 쓴다.)

    위의  SQL JOIN 시각화 이미지에서는 가장 상단의 왼쪽에 있는 Left Join 이미지와 같습니다.

     

    행을 기준으로 볼 때 FK로 연결되어 있는 데이터의 유무에 따라 값이 달라집니다.

    • FK로 연결     : A 테이블의 데이터 + B 테이블의 데이터
    • FK로 연결 X : A 테이블의 데이터 + NULL

     

    아래의 문제를 보면서 설명드리는 것이 빠를 것 같아서 바로 문제를 분석하고 풀이해보겠습니다.

     

     

    < 프로그래머스 없어진 기록 찾기 >

    < 문제 설명 >

    ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

     

    ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

    ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

     

    < 문제 >

    천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

     

    < 문제 분석 >

    입양을 간 기록은 있는데 보호소에 들어온 기록이 유실되었다고 한다.

     

    1. ANIMAL_OUTS 테이블을 기준으로 FK로 연결된 ANIMAL_INS 테이블의 데이터를 가져와서 결합한다.
    2. FK로 연결되지 않은 데이터의 경우에는 ANIMAL_INS 테이블의 컬럼 값들이 NULL 값일 것이다.
    3. 그렇기에 ANIMAL_INS 테이블에만 있는 컬럼명을 확인해서 해당 컬럼 값이 NULL인 것을 찾으면 된다.
    4. 문제의 조건대로 ANIMAL_ID를 기준으로 ORDER BY 하면 된다.

    결론적으로 Outer Join을 사용한 이유는 FK인 ANIMAL_ID를 기준으로 데이터를 결합하여 연결되어 있지 않은 데이터를 찾아야 하기 때문이다.

     

    # SELECT 출력할 컬럼명(양쪽 테이블에서 중복되는 컬럼명일 경우 찾고자 하는 테이블의 컬럼명 명시)
    # FROM 기준이 되는 테이블명 LEFT JOIN 결합할 테이블명 (테이블명 뒤의 O와 I는 AS O, AS I의 축약 의미)
    # ON 기준이 되는 테이블명.컬럼명=결합할 테이블명.컬럼명 (FK로 연결되어 있는 컬럼을 적으며 결합하는 기준 의미하며 WHERE절과 같은 역할을 한다.)
    
    SELECT O.ANIMAL_ID, O.NAME
    FROM ANIMAL_OUTS O LEFT JOIN ANIMAL_INS I
    ON O.ANIMAL_ID=I.ANIMAL_ID;

    이렇게만 작성하면 1, 2번의 과정을 지난 결합된 데이터가 출력된다.

     

    그 후 3번의 ANIMAL_INS 테이블에만 있는 컬럼명은 INTAKE_CONDITION인 것을 알 수 있습니다.

    그러므로 WHERE 절을 통해 값이 NULL인지 확인하고 ORDER BY 하면 된다.

    # WHERE 절 : 출력하는 기준을 의미한다.
    
    SELECT O.ANIMAL_ID, O.NAME
    FROM ANIMAL_OUTS O LEFT JOIN ANIMAL_INS I
    ON O.ANIMAL_ID=I.ANIMAL_ID
    WHERE INTAKE_CONDITION IS NULL
    ORDER BY ANIMAL_ID;

    프로그래머스 SQL 없어진 기록 찾기

     

    SQL의 JOIN에 대해 막연한 두려움이 있었는데 이고잉 님과 정미나 님의 영상을 보면서 개념과 사용방법을 알 수 있었고 다른 문제들도 풀어보면서 현업에서 자주 쓸 JOIN과 친해질 계기가 된 것 같아 기쁩니다.

     

     

     

    < 참고 자료 >

    SQL Joins Visualizer

    https://sql-joins.leopard.in.ua/

     

    이고잉(생활코딩)님의 SQL LEFT JOIN 영상

    https://youtu.be/pJqBR2TNe24

     

    정미나 님의 INNER JOIN 영상

    https://youtu.be/4nMeYav0ZKE

    댓글

Designed by Tistory.