SQL/SQLite

[SQLite] JOIN

jihuSunbae 2024. 10. 4. 00:13

 

 
 

목차


    학습 목표

    SQLite의 조인의 종류를 학습한다. 

     

    JOIN? 

    서로 다른 테이블(들)을 결합하는 방식이며, SQLite에서는 총 5가지 조인이 있다.

    - 내부 조인, 외부 조인, 교차 조인, 자연 조인, 셀프 조인

    - cf. OUTER JOIN 중 RIGHT OUTER 조인과 FULL OUTER 조인은 직접 지원하지 않는다. 

     

     

    조인의 종류: https://www.geeksforgeeks.org/python-sqlite-join-clause/

     

    내부 조인(Inner Join)

    : 두 테이블에 공통으로 존재하는 데이터 행들 선택 -> 새로운 테이블

    이너 조인 예시 (출처: https://www.devkuma.com/docs/sqlite/inner-join/)

    위의 그림에서 왼쪽 테이블의 부서 ID와 오른쪽 테이블의 ID를 기준으로 내부 조인한다고 하자. 

    결과 테이블에서는 공통으로 가지고 있는 부서 ID인 1,2,3인 행들만 남은 것을 볼 수 있다. 

    (왼쪽 테이블의 부서 ID가 4인 행은 제외가 되었다.)

     

    정의 형식

    SELECT 조회하고 싶은 컬럼들 
    FROM 테이블1
      INNER JOIN 테이블2
      ON 테이블1.컬럼명 = 테이블2.컬럼명

    - ON 절에 조인의 조건(각 테이블에서 어떤 열들을 기준으로 조인할 건지)을 작성해준다. 

     

    특징

    - 내부 조인의 경우 조인 조건이 같으면 테이블 작성 순서는 상관 X

    외부 조인(Outer Join)

    내부 조인의 경우 두 테이블이 공통으로 가진 컬럼 값을 가진 행들만 조인함. 

    이와 달리 외부 조인은 공통 컬럼값을 가지지 않는 행도 포함한다.

     

    원래는 OUTER JOIN에 LEFT/RIGHT/FULL outer join 모두 있지만, SQLite는 LEFT 외부 조인만 지원한다. 

     

    LEFT OUTER JOIN

    : 왼쪽 테이블을 기준으로 오른쪽 테이블을 결합한다. 

    LEFT 외부 조인 출처 - https://www.devkuma.com/docs/sqlite/outer-join/

     

    위의 그림은 LEFT OUTER JOIN한 결과이다(ON 왼쪽 테이블의 부서ID = 오른쪽 테이블의 ID)

    결과 테이블을 보면, 부서명이 없는 데이터 행도 남아있는 것을 확인 가능. 

     

    SQLite 문법

    SELECT 조회하고 싶은 컬럼들 
    FROM 테이블1
      LEFT OUTER JOIN 테이블2
      ON 테이블1.컬럼명 = 테이블2.컬럼명

     

    *유의점: INNER 조인과 달리 조인 시 기재하는 테이블 순서가 다르면, 조회 결과도 달라진다. 

    교차 조인(CROSS JOIN)

    두개의 테이블 사이에 가능한 조합을 모두 만들어 낸다.

    (각 테이블의 행을 카테시안 곱 해준다. )

     

    크로스 조인 결과 (출처:https://www.devkuma.com/docs/sqlite/cross-join/)

     

    테이블의 행의 개수가 각각 n, m 이면 nxm가지의 결과값이 나온다. 

     

    Q. 왜 해주는가? 

    A. 가능한 모든 데이터 조합을 보고 싶을 때 사용한다! 

     

    SQLite 문법 

    SELECT 테이블명.컬럼명, ... FROM 테이블명1   
        CROSS JOIN 테이블명2   
        ON 테이블명1.컬럼명1 = 테이블명2.컬럼명2;

     

    자체 조인(Self Join)

    앞에서 본 내/외부 조인은 서로 다른 두 테이블을 결합했다.

    이와 달리 자체 조인은 한 테이블에 본인을 셀프로 결합하는 방식이다. 

    - 이너 조인과 외부 조인 모두 자체 조인이 가능하다. 

     

    Q. 왜 똑같은 테이블을 여러 번 조인하나요?

    A. 한 테이블에서 서로 다른 행을 비교해야할 때를 생각해보자!

     

    예시1) '상사-부하 관계' 테이블

    : 각 직원 별로 보스의 이름을 붙여주고 싶음. 이때, boss_id는 ID를 참조하고 있다. 

    상사-부하 관계 테이블

     

    이때, boss_id가 ID를 참고하고 있으므로, 셀프 조인을 해줘야함다. 

     

    예시2) 같은 요일 내 상위 N개의 값을 가진 데이터를 조회하기 

     

     

     

     

    실제 SQLite 쿼리를 작성

    - 동일한 테이블을 구분 하기 위해, 테이블 이름을 다르게 지정한다. 

     

    이너조인 예시)

    SELECT 별칭1.컬럼 명, ...   
    FROM 테이블명 별칭1  INNER JOIN 테이블명 별칭2
      ON 별칭1.컬럼명 = 별칭2.컬럼명;

     

    아우터 조인 예시)

    SELECT 별칭1.컬럼 명, ...   
    FROM 테이블명 별칭1  OUTER LEFT JOIN 테이블명 별칭2
      ON 별칭1.컬럼명 = 별칭2.컬럼명;

     

     

     

    NATURAL 키워드

    조인 이름 앞에 'NATURAL'을 붙이면,

    따로 컬럼명을 지정하지 않아도 자동으로  두 테이블에서 같은 이름의 컬럼을 선택하여 조인해준다. 

     

    예시) 이너조인

    SELECT 테이블명.컬럼명, ... FROM 테이블명1
       NATURAL INNER JOIN 테이블명2;

    Reference

    https://www.devkuma.com/docs/sqlite/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A1%B0%EC%9D%B8-join/

    'SQL > SQLite' 카테고리의 다른 글

    [SQLite][문제풀이] 레스토랑 요일 별 구매 금액 Top3 영수증  (0) 2024.11.11
    [SQLite] CASE IF  (1) 2024.10.03
    [SQLite] LEAD OVER 구문  (1) 2024.10.03
    [SQLite] with 구문  (1) 2024.10.03
    [SQLite] datetime 관련 함수  (1) 2024.10.03