카테고리 없음

SQL - JOIN

JIN_Coder 2023. 1. 26. 19:50

JOIN이란

두 테이블의 공통된 정보(key 값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것

 

SELECT * FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.key = TABLE2.key

 

# 기본문
SELECT * FROM orders o INNER JOIN users u ON o.user_id = u.user_id 
# 오더 테이블과 유저 테이블 조인

쿼리가 실행되는 순서

FROM => JOIN => ON => SELECT

1. FROM에서 기준이 되는 테이블을 가져옴

2. JOIN으로 다른 테이블을 붙임

3. 붙일 때 ON으로 공통된 key가 되는 데이터들을 붙임

4. 공통된 key로 붙여진 값들을 가져옴

 

# WHERE
SELECT * FROM orders o 
INNER JOIN users u ON o.user_id = u.user_id 
WHERE u.email LIKE "%naver.com" 
# 오더 테이블과 유저 테이블 조인 후 이메일이 네이버인 값만 조회

# ORDER BY
SELECT u.name, p.`point` FROM point_users p 
INNER JOIN users u ON p.user_id = u.user_id 
ORDER BY p.point DESC
# 포인트 테이블과 유저 테이블 조인 후 포인트 내림차순 정렬

# GROUP BY
SELECT c.course_id, c2.title, COUNT(*) AS cnt FROM checkins c 
INNER JOIN courses c2 ON c.course_id = c2.course_id 
GROUP BY c.course_id 
# 다짐 테이블과 과목 테이블 조인 후 과목별 다짐 갯수 카운트

# 복합
SELECT u.name, COUNT(u.name) FROM enrolleds e 
INNER JOIN users u ON e.user_id = u.user_id  
WHERE e.is_registered  = 0 
GROUP BY u.name 
ORDER BY COUNT(u.name) DESC
# 등록 테이블과 유저 테이블 조인 후 시작을 안한 사람들을 이름별 카운트를 내림차순 조회

# 다중 조인
SELECT c.title, c2.week , COUNT (*)  FROM courses c 
INNER JOIN checkins c2 ON c.course_id = c2.course_id 
INNER JOIN orders o ON c2.user_id = o.user_id 
WHERE o.created_at >= "2020-08-01" 
GROUP BY c.title, c2.week 
ORDER BY c.title, c2.week
# 과목 테이블과 다짐 테이블, 오더 테이블 조인 후 20.08.01이후 생긴 데이터들을 과목, 주차별로 카운트 후 내림차순으로 조회

쿼리가 실행되는 순서

FROM => JOIN => WHERE => GROUP BY => ORDER BY => SELECT

1. 기준이 되는 테이블 가져옴

2. ON으로 공통된 key값만 가진 값만 JOIN으로 가져와서 붙임

3. WHERE로 조건을 걸어 조건에 부합하는 값만 가져옴

4. GROUP BY로 같은 값만 뭉쳐줌

5. ORDER BY로 정렬

6. 해당 값들을 SELECT로 가져옴

 

 

JOIN 종류

- INNER JOIN

기본적인 조인 모습

공통 key 값을 모두 가지고 있는 데이터만 조회

- LEFT JOIN

기준이 되는 테이블에 JOIN 된 테이블의 공통된 key 값이 없어도 데이터를 가져옴

key값이 없어도 NULL 값으로 가져옴