728x90
MySQL JOIN에서 ON 과 WHERE의 차이점
what is the difference between “ON” and “WHERE” in a JOIN statement?
- SQL의 JOIN에서 ON과 WHERE의 차이점은 JOIN하는 범위가 다르다
- 아래 test1, test2 테이블을 참조.
- 예제1
SELECT
*
FROM test1 AS a
LEFT JOIN test2 AS b
ON (a.aa = b.aa)
WHERE b.cc = 7;
- 위의 경우는 a와 b 테이블의 OUTER JOIN을 수행한 후에 b.cc = 7인 데이터들을 추출
- 따라서 위의 의 결과는 b.cc = 7인 데이터만 존재
- 예제2
- 예제1 결과 :
SELECT
*
FROM test1 AS a
LEFT JOIN test2 AS b
ON (a.aa = b.aa AND b.cc = 7);
- 위의 경우는 (a 테이블)과 (b 테이블 중 b.cc = 7인 경우)를 OUTER JOIN 한 결과가 나온다.
- 따라서 위의 결과는 b.cc = 7이 아닌 데이터도 존재
- 예제2 결과 :
- 한마디로 ON과 WHERE의 경우는 JOIN을 할 대상(범위)이 달라진다는 것이다.오라클이나 MSSQL과 같은 경우는 EXCEPT 혹은 MINUS 등을 사용하면 되겠지만,
- MySQL은 버전에 따라 지원하는 경우도 있고 아닌 경우도 있다.
- 이 점을 이용해서 LEFT OUTER JOIN으로 차집합을 구현할 수 있다.
- test1 테이블의 데이터 중 test2 테이블에 있는 데이터를 제외하고 가져오고 싶은 경우.
SELECT
*
FROM test1 AS a
LEFT JOIN test2 AS b
ON (a.aa = b.aa)
WHERE b.aa IS NULL;
- 위의 경우 JOIN하는 column을 기준으로 1, 2는 test2 테이블에도 있으니 제외하고, 3, 6만을 가져오고 싶은 경우이다.
- 결과 :
- WHERE절 이전까지 실행했을 경우
SELECT
*
FROM test1 AS a
LEFT JOIN test2 AS b
ON (a.aa = b.aa);
- 여기에서 test2 테이블에 존재하지 않아서 test2 테이블의 column이 null인 부분만을 가지고 오게 된다.
- WHERE절을 달아주면!! 차집합이 된다는 것이다.
- 결과 :
참고 : https://blog.leocat.kr/notes/2017/07/28/sql-join-on-vs-where
728x90
'프로그래밍 > Database' 카테고리의 다른 글
[MySQL/MariaDB] 반올림, 자릿수 버리기(ROUND,TRUNCATE) (0) | 2020.04.05 |
---|---|
[MySQL/MariaDB] 최대값 최소값 구하기(MAX, MIN) (0) | 2020.04.05 |
MySQL REPLACE 사용법(콤마제거, 치환하기) (0) | 2020.04.05 |
[Database] 개체, 개체 타입과 속성 (0) | 2020.03.22 |
[Database] 모델링과 개체-관계 모델 및 다이어그램 (0) | 2020.03.22 |