ON: JOIN을 하기 전 필터링을 한다.
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO
AND E.MGR = 7777) ;
-- 위의 쿼리와 아래의 쿼리는 동일한 결과를 가짐
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO)
WHERE E.MGR = 7777 ;
WHERE: JOIN을 한 후 필터링을 한다.
INNER JOIN에서의 ON 조건과 WHERE 조건은 같다.
INNER JOIN ON vs WHERE clause
아래 세 쿼리는 모두 같은 결과, 같은 퍼포먼스가 나옴
SELECT *
FROM a INNER JOIN b ON a.key = b.key AND a.key2 = b.key2
SELECT *
FROM a, b
WHERE a.key = b.key AND a.key2 = b.key2
SELECT *
FROM a INNER JOIN b ON a.key = b.key
WHERE a.key2 = b.key2
※ , 보다는 INNER JOIN을 써야 하는 이유
1. 가독성
2. OUTER JOIN으로 수정할 때 편함
※ JOIN & CROSS JOIN & , JOIN (콤마 연산자; 콤마 조인)
- JOIN, CROSS JOIN, COMMA JOIN 타입은 INNER JOIN과 같다.
- 하지만 , 연산자는 다른 조인 타입과 다른 우선순위를 가지고 있어 문법 에러가 발생할 확률이 높아 사용하지 않는 것을 추천(다른 타입의 불가능한 문법 에러가 발생할 수 있음)
table1:
col1 | col2 |
---|---|
1 | one |
2 | two |
3 | three |
table2:
col1 | col2 |
---|---|
1 | first |
2 | second |
SELECT t1.col1, t1.col2, t2.col1, t2.col2
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.col1 = t2.col1
AND t1.col2 = 'first';
t1.col1 | t1.col2 | t2.col1 | t2.col2 |
---|---|---|---|
1 | one | 1 | first |
2 | two | null | null |
3 | three | null | null |
→ table1의 전체 row와 table2의 col2 컬럼 값이 'first'인 row만 뽑은 row들을 OUTER JOIN
→ ON 조건은 JOIN을 하기 전 필터링!
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 = 'first';
t1.col1 | t1.col2 | t2.col1 | t2.col2 |
---|---|---|---|
1 | one | 1 | first |
→ table1의 전체 row와 table2의 전체 row를 OUTER JOIN한 후 table2의 col2 컬럼 값이 'first'인 row만 뽑는다.
→ WHERE 조건은 JOIN을 한 이후 필터링!