보통 데이터 베이스는 공간을 절약하기 위해 하나의 테이블에 모든 정보를 저장하지 않는다.
다시 말하자면, RDB의 방식으로 저장하기 때문에 중복되는 정보는 한 번만 기록되며 여러 테이블에 데이터가 저장되어 있다.
그렇다면 오늘 들어온 주문들의 고객 아이디가 궁금하다면, 주문 내역 테이블만 있어서도 안되고 고객 정보 테이블만 있어서도 안된다.
주문 내역 테이블과 고객 정보 테이블을 연결하여야 원하는 정보를 얻을 수 있다.
이때 SQL에서 사용하는 것이 JOIN이다.
1. INNER JOIN
INNER JOIN은 두 테이블의 교집합만 연결하여 출력한다.
A라는 테이블과 B라는 테이블이 있다면, A와 B의 두 테이블에 존재하는 데이터를 출력해준다.
위에서 들었던 예시를 가져와 코드를 작성하면 다음과 같다.
SELECT *
FROM users as u
INNER JOIN orders as o ON u.id = o.userid
INNER JOIN ~
WHERE o.date = '210802'
INNER JOIN의 경우 FROM 뒤의 users 테이블과 INNER JOIN 뒤의 orders 테이블의 위치가 바뀌어도 상관없다.
위의 코드의 의미는 users 테이블의 id 컬럼과 orders 테이블의 userid 칼럼을 key 값으로 두 테이블에 데이터가 모두 존재하는 경우 합쳐라 이다.
INNER JOIN은 여러 개를 사용할 수 있으며 앞의 INNER JOIN절 뒤에 써주면 된다.
2. OUTER JOIN
A 테이블과 B 테이블이 있다고 하자.
A 테이블을 기준으로 B테이블을 OUTER JOIN하는 경우, B테이블에 A테이블의 데이터가 존재하지 않는다면 그 값은 null로 표시하여 A 테이블에 맞추어 데이터를 모두 출력한다.
OUTER JOIN은 LEFT JOIN과 RIGHT JOIN이 있으나 보통 LEFT JOIN을 사용한다.
SELECT *
FROM table_A as a
LEFT JOIN table_B as b ON a.x = b.x
(참고 자료 - https://www.inflearn.com/users/@datarian 의 [백문이불여일타] 데이터 분석을 위한 고급, 중급, 기초 SQL)
'섭섭의 공부 > SQL' 카테고리의 다른 글
[MySQL] DML(Data Manipulation Language), INSERT, UPDATE, DELETE (0) | 2021.08.18 |
---|---|
[MySQL] UNION, UNION ALL 데이터 위 아래 병합 (0) | 2021.08.02 |
[MySQL]CASE 조건으로 라벨링하기 (0) | 2021.08.02 |
[MySQL] GROUP BY, HAVING 그룹 별 통계 내기 (0) | 2021.08.02 |
[MySQL] COUNT, SUM, AVG, MIN, MAX 집계함수 (0) | 2021.08.02 |