Oracle DataBase
SELECT - JOIN
- ANSI 표준
- USING EXPR
- PK와 FK 사이의 COLUMN들을 기준으로 JOIN할 때 사용한다.
- ON EXPR
- 서로 다른 이름의 COLUMN을 기준으로 JOIN할 때 사용한다.
- LEFT / RIGHT / FULL
- JOIN 명령어를 기준으로 LEFT는 왼쪽 테이블, RIGHT는 오른쪽 테이블
- NATURAL JOIN
- 자식의 일반 COLUMN 중 부모의 기본키와 같은 이름의 COLUMN을 잡아서 JOIN을 하는 JOIN
- 외래키가 반드시 부모의 기본키와 이름이 같아야 원하는 결과값을 얻을 수 있음
- SELF JOIN
- 자기 자신을 2개 만들어서 JOIN 하는 것
- 재귀적인 외래키가 있을 때 이를 이용하여 재귀적인 JOIN을 걸 수 있다.
- USING EXPR
- Oracle JOIN
- INNER JOIN
- 오라클 JOIN은 JOIN 명령어 없이 ‘=’ 기호로 JOIN 기준을 잡는다.
- PK가 아닌 컬럼만으로도 JOIN을 할 수 있지만, 시스템 상 서로 PK인 컬럼들을 WHERE 조건에 맞추는 것이 좋다.
- OUTER JOIN
- Outer 조인의 경우 ‘(+)’ 기호로 Outer JOIN을 수행한다.
A.DEPTCD = B.DEPTCD(+)
라고 설정했을 경우 A 테이블을 기준으로 B 테이블을 맞춘다.- 쉽게, A를 쭉 나열하고 B 중에 일치하는 값들을 끼워넣는다고 생각하면 된다.
- INNER JOIN
-- ANSI JOIN QUERY
SELECT A.COMPANY ,
A.BUSNNO ,
A.DEPT ,
B.EMPNO ,
B.EMPNAME ,
B.RETIRE ,
C.POSITION
FROM COMMON_COMPANY A
JOIN COMMON_EMPLOYEE B
ON A.COMPANY = B.COMPANY
A.DEPT = B.DEPT
LEFT OUTER JOIN EMP_DETAIL C
ON B.POSITION = C.POSITION
ORDER BY 1, 2, 3, 4
-- ORACLE JOIN QUERY
SELECT A.COMPANY ,
A.BUSNNO ,
A.DEPT ,
B.EMPNO ,
B.EMPNAME ,
B.RETIRE ,
C.POSITION
FROM COMMON_COMPANY A,
COMMON_EMPLOYEE B,
EMP_DETAIL C
WHERE A.COMPANY = B.COMPANY
A.DEPT = B.DEPT
B.POSITION = C.POSITION(+)
ORDER BY 1, 2, 3, 4
SET OPERATOR
- UNION & UNION ALL
- 두 테이블 간 데이터를 합치고자 할 때 사용되는 명령어
- 컬럼의 갯수와 타입이 동일해야 정상적으로 실행된다.
- UNION
- 하나의 결과를 도출할 때, 중복을 허용하지 않는다.
- 중복이 발생할 시 중복을 제거한다.
- UNION ALL
- 중복을 제거하지 않고 그대로 도출한다.
- 보통 나는 TEMP테이블과 본 테이블을 비교할 때 사용한다.
- MINUS (차집합)
- 중복된 값 제거하는 명령어
- A 테이블에 10만 건, B 테이블에 7만건, 이 둘에 동일한 데이터가 3만건 있다고 할 때, A MINUS B 일 경우 7만 건이 도출되며, B MINUS A일 경우 4만 건이 도출된다.
SUBQUERY
- 단일 행/열 SUBQUERY
- 비교 연산자 (= , >, < ETC)
- 다중 행 SUBQUERY
- 다중 행 비교 연산자 (IN, ANY, ALL ECT)
- 다중 열 SUBQUERY
-- 다중 열 SUBQUERY
SELECT EMP_ID ,
EMP_NAME ,
DEPT_ID ,
SALARY
FROM EMPLOYEE
WHERE (SALARY, DEPT_ID) IN (SELECT MIN(SALARY) ,
DEPT_ID
FROM EMPLOYEE
GROUP BY DEPT_ID)
ORDER BY 3;
-
NOT IN을 사용하기 위해서는 SUBQUERY에 NULL 값이 없어야 한다.
-
ANY / ALL
- ALL 은 SUBQUERY 범위 밖에서 도메인을 정한다.
- > ALL : SUBQUERY 범위의 최대값보다 큰 ALL 범위의 값을 본다.
- < ALL : SUBQUERY 범위의 최소값보다 작은 ALL 범위의 값을 본다.
- ANY 는 SUBQUERY 범위 안에서 도메인을 정한다.
- > ANY : SUBQUERY 범위 중 최소값보다 큰 ANY 범위의 값을 본다.
- < ANY : SUBQUERY 범위 중 최대값보다 작은 ANY 범위의 값을 본다.
일하면서 한번도 사용해 본 적 없어요…
- ALL 은 SUBQUERY 범위 밖에서 도메인을 정한다.
Written on February 29, 2020