최원종의 개발 블로그

샘플 데이터 활용 문제 - 17 _ 1(인라인 필터 추가 설명) 본문

MySQL

샘플 데이터 활용 문제 - 17 _ 1(인라인 필터 추가 설명)

chl6698 2026. 4. 5. 23:47

인라인 필터 설명 (사전 필터)

OUTER JOIN(LEFT JOIN, RIGHT JOIN)에서는 결과가 완전히 달라짐.
INNER JOIN에서는 어디에 쓰든 결과가 같지만, 
LEFT JOIN 같은 외부 조인에서는 위치에 따라 데이터 개수가 달라짐.

  • ON 절에 쓰면: 조건에 안 맞아도 왼쪽 테이블(e) 데이터는 살아있고, 오른쪽 테이블 값만 NULL로 나옴.
  • WHERE 절에 쓰면: 조건에 안 맞으면 왼쪽 데이터까지 통째로 날아가 버림. (사실상 INNER JOIN처럼 동작하게 됨)

데이터

-- user 테이블
| id | nickname  |
|----|-----------|
|  1 | 철수      |
|  2 | 영희      |
|  3 | 민준      |


-- post 테이블
| id | title          |
|----|----------------|
|  1 | 자바 공부 후기  |
|  2 | 오늘 점심 맛집  |
|  3 | 운동 루틴 공유  |


-- like_log 테이블
| id | post_id | user_id |
|----|---------|---------|
|  1 |    1    |    1    |
|  2 |    1    |    2    |
|  3 |    2    |    1    |


-- post_id=3 (운동 루틴 공유) 는 좋아요 없음

 

 


1 - INNER JOIN (사후 필터 = WHERE)

SELECT 
	  p.id, 
    p.title,
    l.id AS like_id,
    l.user_id
FROM post p
INNER JOIN like_log l ON p.id = l.post_id
WHERE l.user_id = 1; 


-- post 테이블
| id | title          |
|----|----------------|
|  1 | 자바 공부 후기  |
|  2 | 오늘 점심 맛집  |
|  3 | 운동 루틴 공유  |


-- like_log 테이블
| id | post_id | user_id |
|----|---------|---------|
|  1 |    1    |    1    |
|  2 |    1    |    2    |
|  3 |    2    |    1    |

-- post_id=3 (운동 루틴 공유) 는 좋아요 없음


p.id | title          | like_id | user_id
-----|----------------|---------|--------
  1  | 자바 공부 후기  |    1    |    1      
  1  | 자바 공부 후기  |    2    |    2      
  2  | 오늘 점심 맛집  |    3    |    1 

-- WHERE l.user_id = 1;  
-- (like_log 테이블에 user_id = 1 만 필터링) 
 
 결과 (임의값)
 
  p.id | title         | like_id | user_id
  -----|----------------|---------|--------
    1  | 자바 공부 후기  |    1    |    1
    2  | 오늘 점심 맛집  |    3    |    1
    
-- 1. 운동 루틴 공유: INNER JOIN 에서 이미 제외 (like_log 에 없음)
-- 2. WHERE 조건에서 like_log 테이블에user_id 가 1 만 필터 
-- 총 2행

 


2 - INNER JOIN (인라인 필터 = ON)

SELECT 
	  p.id, 
    p.title,
    l.id AS like_id,
    l.user_id
FROM post p
INNER JOIN like_log l ON p.id = l.post_id AND l.user_id = 1;
-- JOIN 할 때부터 user_id = 1 만 필터 


-- post 테이블
| id | title          |
|----|----------------|
|  1 | 자바 공부 후기  |
|  2 | 오늘 점심 맛집  |
|  3 | 운동 루틴 공유  |   <-- INNER JOIN으로 탈락 


-- like_log 테이블
| id | post_id | user_id |
|----|---------|---------|
|  1 |    1    |    1    |
|  3 |    2    |    1    |

-- like_log 테이블
| id | post_id | user_id |
|----|---------|---------|
|  1 |    1    |    1    |
|  3 |    2    |    1    |




결과:
  p.id | title          | like_id | user_id
  -----|----------------|---------|--------
    1  | 자바 공부 후기  |    1    |    1
    2  | 오늘 점심 맛집  |    3    |    1

-- INNER JOIN 에서는 WHERE(사후필터) 와 ON (사전필터) 결과가 완전히 동일
-- 총 2행

 


3 - LEFT JOIN (인라인 필터 = ON)

SELECT 
	  p.id, 
    p.title,
    l.id AS like_id,
    l.user_id
FROM post p
LEFT JOIN like_log l ON p.id = l.post_id AND l.user_id = 1;


-- post 테이블
| id | title          |
|----|----------------|
|  1 | 자바 공부 후기  |
|  2 | 오늘 점심 맛집  |
|  3 | 운동 루틴 공유  |         <-- LEFT JOIN 데이터 보존 




-- like_log 테이블 (  l.user_id = 1; ) 
| id | post_id | user_id |
|----|---------|---------|
|  1 |    1    |    1    |
|  3 |    2    |    1    |



결과:
 p.id | title         | like_id | user_id
-----|----------------|---------|--------
  1  | 자바 공부 후기  |    1    |    1      ← user_id = 1 좋아요 있음
  2  | 오늘 점심 맛집  |    3    |    1      ← user_id = 1 좋아요 있음
  3  | 운동 루틴 공유  |  NULL   |  NULL     ← 좋아요 없지만 왼쪽(post) 행 살아있음

4 - LEFT JOIN (사후 필터 = WHERE)

  • 실무에서 자주 하는 실수 LEFT JOIN 에 WHERE 사용 사례
SELECT 
	  p.id, 
    p.title,
    l.id AS like_id,
    l.user_id
FROM post p
LEFT JOIN like_log l ON p.id = l.post_id;
WHERE l.user_id = 1;  -- JOIN 끝난 후 user_id=1 만 걸러냄


| id | title          |
|----|----------------|
|  1 | 자바 공부 후기  |
|  2 | 오늘 점심 맛집  |
|  3 | 운동 루틴 공유  |


-- like_log 테이블
| id | post_id | user_id |
|----|---------|---------|
|  1 |    1    |    1    |
|  2 |    1    |    2    |
|  3 |    2    |    1    |


-- 1차 LEFT JOIN 결과 
p.id | title          | like_id | user_id
-----|----------------|---------|--------
  1  | 자바 공부 후기  |    1    |    1      ← user_id = 1 좋아요 있음
  1  | 자바 공부 후기  |    2    |    2      ← user_id = 2 좋아요 있음
  2  | 오늘 점심 맛집  |    3    |    1      ← user_id = 1 좋아요 있음
  3  | 운동 루틴 공유  |  NULL   |  NULL     ← 좋아요 없지만 왼쪽(post) 행 살아있음


-- 2차 WHERE 필터링 결과 (like_log 테이블에 user_id = 1 만 필터링) 
  p.id | title          | like_id | user_id
  -----|----------------|---------|--------
    1  | 자바 공부 후기  |    1    |    1
    2  | 오늘 점심 맛집  |    3    |    1

-- 즉 LEFT JOIN 에 WHERE 을 사용하게 되면 결국  INNER JOIN에 결과와 동일 하다.

 


기준 기본값 정리

1. INNER JOIN ➔ WHERE (사후 필터 사용)

2. OUTER JOIN ➔ ON (사전 필터 사용)

아우터 조인에서는 '인라인 필터(ON 절)'를 쓰는 것이 기본값이어야 한다.
WHERE에 쓰는 순간 아우터 조인의 정체성(매칭 안 된 데이터 살리기)이 사라지기 때문
즉 INNER JOIN처럼 동작하게 된다.

 

'MySQL' 카테고리의 다른 글

GROUP BY 와 HAVING 절 - 19  (0) 2026.04.06
MySQL 주요 함수 - 18  (0) 2026.04.05
샘플 데이터 활용 문제 - 17  (1) 2026.04.04
별칭과 트랜잭션 - 16  (0) 2026.04.04
MySQL JOIN - 15  (0) 2026.04.04