두 개 이상의 테이블을 하나 이상의 조건을 걸어서 해당된 조건을 가진 값들을 하나의 ROW로 가져오는 것을 JOIN 이라고 합니다.
JOIN 은 INNER JOIN 과 OUTER JOIN 두 가지로 구분됩니다.
SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL;
TO_DAY | YESTERDAY |
2013/10/29 11:28:54 | 2013/10/28 11:28:54 |
SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL;
TO_DAY | TOMORROW |
2013/10/29 11:30:10 | 2013/10/30 11:30:10 |
이렇게 두 개의 테이블로 설명을 드리겠습니다.
INNER JOIN 이란... |
조건이 일치하는 값이 두 테이블에 모두 존재할 때 조회되는 것입니다.
SELECT * FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A INNER JOIN (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B ON A.TO_DAY = B.TO_DAY AND A.YESTERDAY <> B.TOMORROW; |
TO_DAY | YESTERDAY | TO_DAY | TOMORROW |
2013/10/29 11:32:15 | 2013/10/28 11:32:15 | 2013/10/29 11:32:15 | 2013/10/30 11:32:15 |
왼쪽 두 컬럼은 A 테이블의 것이고, 오른쪽 두 컬럼은 B 테이블의 것입니다.
A 테이블의 TO_DAY와 B 테이블의 TO_DAY의 값이 같고,
A 테이블의 YESTERDAY 와 B 테이블의 TOMORROW 값이 다른 ROW가 각각 하나씩 있으므로,
두 테이블의 ROW를 하나로 합쳐서 조회하는 것입니다.
SELECT * FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A INNER JOIN (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B ON A.YESTERDAY = B.TOMORROW; |
조회가 하나도 안되는군요.
A 테이블의 YESTERDAY 값과 B 테이블의 TOMORROW 값이 같은 넘이 없기 때문에 JOIN이 걸리지 않을 것입니다.
INNER JOIN은 아래와 같은 형태로도 가능합니다.
SELECT * FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A, (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B WHERE A.TO_DAY = B.TO_DAY AND A.YESTERDAY <> B.TOMORROW; |
TO_DAY | YESTERDAY | TO_DAY | TOMORROW |
2013/10/29 11:32:15 | 2013/10/28 11:32:15 | 2013/10/29 11:32:15 | 2013/10/30 11:32:15 |
테이블을 나열한 후, WHERE 조건절에서 조인 조건을 걸어주시면 되는 겁니다.
LEFT OUTER JOIN 이란... |
왼쪽의 테이블은 무조건 조회되며, 오른쪽 테이블에 조건이 맞는 녀석이 있으면.. 같이 보여주는 것입니다.
SELECT * FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A LEFT OUTER JOIN (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B ON A.TO_DAY = B.TO_DAY AND A.YESTERDAY <> B.TOMORROW; |
TO_DAY | YESTERDAY | TO_DAY | TOMORROW |
2013/10/29 11:32:15 | 2013/10/28 11:32:15 | 2013/10/29 11:32:15 | 2013/10/30 11:32:15 |
A 테이블과 B 테이블의 JOIN 조건이 맞는 ROW가 있으므로 합쳐서 보여주는 것입니다.
SELECT * FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A LEFT OUTER JOIN (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B ON A.YESTERDAY = B.TOMORROW; |
TO_DAY | YESTERDAY | TO_DAY | TOMORROW |
2013/10/29 11:32:15 | 2013/10/28 11:32:15 |
A 테이블의 YESTERDAY 값과 B 테이블의 TOMORROW 값이 같은 넘이 없군요...
A 테이블의 값은 무조건 보여주며, B 테이블의 JOIN 조건을 충족하는 넘이 없어서 NULL로 조회가 되었습니다.
이 경우는, 오라클일 경우, 다음과 같은 형태로 가능합니다.
SELECT * FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A, (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B WHERE A.YESTERDAY = B.TOMORROW(+) |
TO_DAY | YESTERDAY | TO_DAY | TOMORROW |
2013/10/29 11:32:15 | 2013/10/28 11:32:15 |
'IT 개발' 카테고리의 다른 글
[오라클|Oracle] 여러 개의 테이블을 하나처럼 만들기 - UNION / UNION ALL (0) | 2014.07.12 |
---|---|
Oracle to MSSQL 쿼리 변환 시 검토할 점 (1) | 2014.07.11 |
[오라클|Oracle] String 원하는 만큼 자르기 – SUBSTR (0) | 2014.07.02 |
[오라클|Oracle] 날짜타입 가지고 놀기 - TO_DATE, TO_CHAR (2) | 2014.07.02 |
[C#] Component One (C1) FlexGrid Cell에 버튼(Button) 넣기 (2) | 2014.06.24 |