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
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
반응형