JOIN 시 ON 에 조건을 넣는것과 WHERE에 조건을 넣는것에 어떤 차이가 있는지 정리한다.
예제 테이블 & 데이터
create table MEMBER(
MEMBER_ID int primary key auto_increment,
NAME varchar(20),
FAVORITE_COLOR varchar(50)
);
create table ORDERS (
ORDER_ID int primary key auto_increment,
ORDER_COLOR varchar(50),
ORDER_DATE timestamp,
MEMBER_ID int,
FOREIGN KEY (MEMBER_ID) REFERENCES MEMBER (MEMBER_ID)
);
insert into MEMBER(NAME, FAVORITE_COLOR) VALUES('찰리', 'GREEN');
insert into MEMBER(NAME, FAVORITE_COLOR) VALUES('할리', 'RED');
insert into MEMBER(NAME, FAVORITE_COLOR) VALUES('콜리', 'BLUE');
insert into MEMBER(NAME, FAVORITE_COLOR) VALUES('갈리', 'YELLOW');
insert into MEMBER(NAME, FAVORITE_COLOR) VALUES('메리', 'GREEN');
insert into MEMBER(NAME, FAVORITE_COLOR) VALUES('홀리', 'ORANGE');
insert into ORDERS(ORDER_COLOR ,ORDER_DATE, MEMBER_ID) VALUES('GREEN', now(), 1);
insert into ORDERS(ORDER_COLOR ,ORDER_DATE, MEMBER_ID) VALUES('RED', now(), 1);
insert into ORDERS(ORDER_COLOR ,ORDER_DATE, MEMBER_ID) VALUES('BLUE', now(), 1);
insert into ORDERS(ORDER_COLOR ,ORDER_DATE, MEMBER_ID) VALUES('PURPLE', now(), 2);
insert into ORDERS(ORDER_COLOR ,ORDER_DATE, MEMBER_ID) VALUES('GRAY', now(), 2);
insert into ORDERS(ORDER_COLOR ,ORDER_DATE, MEMBER_ID) VALUES('BLACK', now(), 3);
아래 조회 쿼리 2개의 결과는 어떻게 나올까?
-- 1번 쿼리
select *
from ORDERS AS o
LEFT JOIN MEMBER AS m ON o.MEMBER_ID = m.MEMBER_ID AND o.ORDER_COLOR = 'GRAY';
---
-- 2번 쿼리
select *
from ORDERS AS o
LEFT JOIN MEMBER AS m ON o.MEMBER_ID = m.MEMBER_ID
WHERE o.ORDER_COLOR = 'GRAY';
두 쿼리의 차이는 o.ORDER_COLOR = 'GRAY' 라는 조건을 JOIN의 ON 절에서 했는가? WHERE 절에서 했는가? 이다
- LEFT JOIN MEMBER AS m ON o.MEMBER_ID = m.MEMBER_ID AND o.ORDER_COLOR = 'GRAY';
- LEFT JOIN MEMBER AS m ON o.MEMBER_ID = m.MEMBER_ID
WHERE o.ORDER_COLOR = 'GRAY';
1번 쿼리의 JOIN의 조건을 해석해보면 다음과 같다
- LEFT JOIN 으로 왼쪽 테이블(ORDERS)의 행은 모두 가져온다
- o.MEMBER_ID 와 m.MEMBER_ID 가 같고(AND) o.ORDER_COLOR 가 'GRAY'인 행에만 MEMBER 데이터를 결합한다.
즉 ON 절의 조건 데이터 결합을 위한 조건이다
2번 쿼리를 해석해보면 다음과 같다.
- LEFT JOIN 으로 왼쪽 테이블(ORDERS)의 행은 모두 가져온다
- o.MEMBER_ID 와 m.MEMBER_ID 가 같은 행은 MEMBER 데이터를 결합한다.
- 결합한 데이터 중 o.ORDER_COLOR='GRAY' 인 행만 필터링 한다.
즉 WHERE 의 조건은 데이터 필터링을 위한 조건이다.
'DB' 카테고리의 다른 글
JOIN 정리 (INNER JOIN, LEFT JOIN, RIGHT JOIN) (0) | 2023.03.27 |
---|---|
[DB] 데이터베이스 정규화 (0) | 2022.01.13 |
[MySQL] Replication 적용기 - 1 (4) | 2021.10.22 |
[MariaDB] Docker Container에 올렸던 DB서버 로컬로 빼내기 (0) | 2021.09.11 |
댓글