[ON vs WHERE]
ON : JOIN 을 하기 전 필터링을 한다 (=ON 조건으로 필터링이 된 레코들간 JOIN이 이뤄진다)
WHERE : JOIN 을 한 후 필터링을 한다 (=JOIN을 한 결과에서 WHERE 조건절로 필터링이 이뤄진다)
[INNER JOIN 에서의 ON vs WHERE]
1. INNER JOIN + ON 조건절 + ON 조건절
1
2
3
4
5
|
SELECT *
FROM a
INNER JOIN b
ON a.key = b.key
AND a.key2 = b.key2
|
cs |
2. EQUI JOIN + WHERE 조건절
1
2
3
4
|
SELECT *
FROM a AS a , b AS b
WHERE a.key = b.key
AND a.key2 = b.key2
|
cs |
3. INNER JOIN + ON 조건절 + WHERE 조건절
1
2
3
4
5
|
SELECT *
FROM a
INNER JOIN b
ON a.key = b.key
WHERE a.key2 = b.key2
|
cs |
위 세 쿼리는 모두 같은 결과, 같은 퍼포먼스가 나온다.
즉, inner join 에서의 on 조건과 where 조건은 같다.
https://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause
[그래도 EQUI JOIN 보단 INNER JOIN 을 써야 하는 이유]
1. 가독성
2. OUTER JOIN 으로 수정이 용이
[OUTER JOIN 에서의 ON vs WHERE]
1. OUTER JOIN 정리 (출처)
2. OUTER JOIN 에서의 ON vs WHERE
1) OUTER JOIN test 를 위한 샘플 준비.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
-- 샘플 테이블 생성
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;
|
cs |
2) 데이터 확인
table1 :
col1 | col2 |
1 | 하나 |
2 | 둘 |
3 | 셋 |
table2 :
col1 | col2 |
1 | 일 |
2 | 이 |
3) OUTER JOIN 에서의 ON
1
2
3
4
5
|
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 = '일';
|
cs |
위 쿼리의 결과 :
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 을 하기 전에 필터링 되는 기준
4) OUTER JOIN 에서의 WHERE (위 쿼리의 ON 조건을 WHERE 에 그대로 추가)
1
2
3
4
5
|
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 = '일';
|
cs |
위 쿼리의 결과
t1.col1 | t1.col2 | t2.col1 | t2.col2 |
1 | 하나 | 1 | 일 |
>> table1의 전체 row와
table2 전체 row 를 OUTER JOIN 한 후,
col2 칼럼 값이 '일'인 로우만 뽑는다.
>> WHERE 조건은 JOIN을 한 이후에 필터링하는 기준
'DB > MYSQL' 카테고리의 다른 글
[Mysql] 우분투 설치, 유저 생성 및 권한 부여 (4) | 2020.01.18 |
---|---|
[MySQL] 인덱스(INDEX) 관련 정리 (0) | 2020.01.11 |
SYSDATE vs NOW (SYSDATE 와 NOW 의 차이) (0) | 2019.11.02 |
Mysql hierarchy sql 계층구조 쿼리 : 설계 및 쿼리작성(Multi selectbox) (0) | 2019.08.21 |
[Mysql] 시간 계산 : DATE_ADD, DATE_SUB (0) | 2019.08.21 |