Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 상수
- Java데이터 타입
- for문
- Java
- this예약어
- 자바 멀티스레딩
- IntelliJ IDEA
- JAVA기초
- break문
- 시스템 환경 변수 편집
- 인텔리제이 기초 설정
- java변수
- 인텔리제이 한글 깨짐 해결법
- JAVA객체지향
- While
- 생성자
- continue문
- 접근제어지시자
- 컴파일
- function
- 집합관계
- 반복문
- multi-threading
- 메서드 오버로딩
- 형 변환
- Thread
- 연관관계
- 메서드
- OPP개념
- 포함관계
Archives
- Today
- Total
최원종의 개발 블로그
샘플 데이터 활용 문제 - 17 _ 1(인라인 필터 추가 설명) 본문
인라인 필터 설명 (사전 필터)
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 |