MySQL(DB)

[바미] Join 시 on과 where의 차이

Bami 2022. 12. 22. 13:22
728x90
반응형

요약

  • on : join 전에 조건을 필터링
  • where : join 후에 조건을 필터링

INNER JOIN 에서의 ON vs WHERE

INNER JOIN + ON 조건절 + ON 조건절

SELECT *
FROM a
INNER JOIN b
ON a.key = b.key
AND a.key2 = b.key2

EQUI JOIN + WHERE 조건절

SELECT *
FROM a AS a , b AS b
WHERE a.key = b.key
AND a.key2 = b.key2

INNER JOIN + ON 조건절 + WHERE 조건절

SELECT *
FROM a
INNER JOIN b
ON a.key = b.key
WHERE a.key2 = b.key2
  • 위 세 쿼리는 모두 같은 결과, 같은 퍼포먼스가 나오게 됨.
    즉, inner join 에서의 on 조건과 where 조건은 같으므로 inner join 하면 둘다 차이 없음.
  • outer join 시 on으로 해야 원하는 결과를 얻을 수 있음.(outer table에 null값 포함하여 행들이 다 살아있는 상태)

그래도 EQUI JOIN 보단 INNER JOIN 을 써야 하는 이유

  • 가독성
  • OUTER JOIN 으로 수정이 용이

OUTER JOIN 에서의 ON vs WHERE

 OUTER JOIN

출처: javarevisited.blogspot.com

OUTER JOIN 에서의 ON vs WHERE

테스트 코드

-- 샘플 테이블 생성
create table table1 (
  col1 INT,
  col2 VARCHAR(10)
);
create table table2 (
  col1 INT,
  col2 VARCHAR(10)
);
commit;
 
-- 샘플 데이터 입력
insert into table1 (col1, col2) values (1, '하나');
insert into table1 (col1, col2) values (2, '둘');
insert into table1 (col1, col2) values (3, '셋');
 
insert into table2 (col1, col2) values (1, '일');
insert into table2 (col1, col2) values (2, '이');
commit;

결과 

  • table1
col1 co2
1 하나
2
3
  • table2
col1 col2
1
2

OUTER JOIN 에서의 ON

SELECT t1.col1, t1.col2, t2.col1, t2.col2
FROM   table1 t1
LEFT OUTER JOIN table2 t2
ON t1.col1 = t2.col1
AND t2.col2 = '일';

결과

t1.col1 t1.col2 t2.col1 t2.col2
1 하나 1
2 null null
3 null null
  •  table1의 전체 row와 table2에서 col2 칼럼 값이 '일'인 로우만 뽑은 row 들을 OUTER JOIN.(on 명령어로 join 전에 조건을 걸어줌.)
  • t1 값들이 살아있음.
  • on 조건은 join 을 하기 전에 필터링 되는 기준.

OUTER JOIN 에서의 WHERE 명령어 (위 쿼리에서 ON 조건을 WHERE 에 그대로 추가)

select t1.col1, t1.col2, t2.col1, t2.col2
from  table1 t1
LEFT OUTER JOIN table2 t2
ON t1.col1 = t2.col1
where t2.col2 = '일';
t1.col1 t1.col2 t2.col1 t2.col2
1 하나 1
  • table1의 전체 row와 table2 전체 row 를 OUTER JOIN 한 후, col2 칼럼 값이 '일'인 로우만 뽑음.
  • join 및 모든 조건이 끝나고 where로 추가 조건을 걸어준 느낌으로 받아들이면 됨.
  • WHERE 조건은 JOIN을 한 이후에 필터링하는 기준.

Reference

728x90
반응형