기초적인 것이지만 쿼리 공부하다 헷갈리는 점이 있어 정리해보았습니다.
-. 대상 테이블
mysql> select * from test_a; +------+------+ | num1 | num2 | +------+------+ | 10 | 20 | | 11 | 21 | | 12 | 31 | +------+------+ 3 rows in set (0.00 sec)
mysql> select * from test_b; +------+------+ | num1 | num2 | +------+------+ | 10 | 20 | | 1 | 2 | | 3 | 4 | +------+------+ 3 rows in set (0.00 sec)
-. where 절에 조건 주었을 때
mysql> select * -> from test_a LEFT JOIN test_b -> on (test_a.num1=test_b.num1) -> where test_b.num2=20; +------+------+------+------+ | num1 | num2 | num1 | num2 | +------+------+------+------+ | 10 | 20 | 10 | 20 | +------+------+------+------+ 1 row in set (0.00 sec)
-. on 절에 조건 주었을 때
mysql> select * -> from test_a LEFT JOIN test_b -> on (test_a.num1=test_b.num1 AND test_b.num2=20); +------+------+------+------+ | num1 | num2 | num1 | num2 | +------+------+------+------+ | 10 | 20 | 10 | 20 | | 11 | 21 | NULL | NULL | | 12 | 31 | NULL | NULL | +------+------+------+------+ 3 rows in set (0.00 sec)
=> 동일하게 num1 컬럼에 대해 LEFT JOIN을 걸고 test_b.num2=20 이라는 같은 조건이지만
where절에 위치하냐 ON절에 위치하느냐에 따라 결과값이 달라짐
where절에 위치할 경우 : num1 컬럼에 대한 outer join 결과값에 대해 num2=20 을 추출
on절에 위치할 경우 : JOIN 조건이 num1 컬럼 뿐만 아니라 num2=20 까지 포함되게 됨
=> SELECT 문 처리 순서 상 FROM 절, WHERE절 차이가 있어 추출 데이터가 달라지기 때문
-. SELECT 문 처리 순서
- 문법 순서 - SELECT - 1 FROM - 2 WHERE - 3 GROUP BY - 4 HAVING - 5 ORDER BY - 6
- 실행 순서 - FROM - 1 WHERE - 2 GROUP BY - 3 HAVING - 4 SELECT - 5 ORDER BY - 6