목차
학습 목표
SQLite의 조인의 종류를 학습한다.
JOIN?
서로 다른 테이블(들)을 결합하는 방식이며, SQLite에서는 총 5가지 조인이 있다.
- 내부 조인, 외부 조인, 교차 조인, 자연 조인, 셀프 조인
- cf. OUTER JOIN 중 RIGHT OUTER 조인과 FULL OUTER 조인은 직접 지원하지 않는다.
내부 조인(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 OUTER JOIN한 결과이다(ON 왼쪽 테이블의 부서ID = 오른쪽 테이블의 ID)
결과 테이블을 보면, 부서명이 없는 데이터 행도 남아있는 것을 확인 가능.
SQLite 문법
SELECT 조회하고 싶은 컬럼들
FROM 테이블1
LEFT OUTER JOIN 테이블2
ON 테이블1.컬럼명 = 테이블2.컬럼명
*유의점: INNER 조인과 달리 조인 시 기재하는 테이블 순서가 다르면, 조회 결과도 달라진다.
교차 조인(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 |