DB

[DB] JOIN ON 과 WHERE 의 차이

에드박 2023. 3. 27. 10:34

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 의 조건은 데이터 필터링을 위한 조건이다.