조인
두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력할 때 사용
FROM절에 여러 개의 테이블을 쉼표(,)로 구분자를 이용해 지정 (서브쿼리, 뷰 등이 이에 해당)
SELECT
FROM 테이블1, 테이블2, ..., 테이블N
-- 크로스 조인, 교차 조인 (모든 원소의 순서쌍)
SELECT *
FROM EMP, DEPT;
위처럼 조인 조건
이 없을 때 문제점?
결과로 나올 수 있는 모든 행을 조합하기 때문에 두 테이블의 데이터가 맞아 떨어지지 않아도 출력됨
따라서, 어떤 데이터를 연결해야 하는지 기준을 정해줘야 함! (WHERE절
의 중요성)
⇒ 테이블이름.열이름
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
테이블 별칭
테이블 이름에서 한칸 띄운 후 별칭 지정
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
SELECT절의 *
한 번에 모든 열을 출력할 수 있다.
하지만, 어떤 열이 어떤 순서로 출력될지도 명확히 알 수 없고, 변화와 감지에 따른 프로그램 수정이 쉽지 않을 수 있기에 *를 사용하지 않고 출력할 열을 하나하나 직접 명시하는 것이 좋다.
조인 종류 (ANSI 문법)
등가 조인
= 내부 조인, 단순 조인
테이블을 연결한 후 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식 (일반적인 방식)
✏ 여러 테이블의 열 이름이 같을 때?
어느 테이블에 속해 있는지 테이블 구분을 명시해야 한다. (TABLE.COLUMN)
⇒ 겹치지 않는 열 이름이라도 명시하는 것이 좋음!
✏ 조인할 테이블 개수와 조건식 개수?
테이블 수보다 하나 적은 수만큼의 테이블 연결 조건식이 있어야 한다.
SELECT E.EMPNO, E.ENAME, E.SAL, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND SAL >= 3000;
비등가 조인
등가 조인 방식 외의 방식 (자주 사용하는 방식은 아님)
-- 최소 급여와 최대 급여 사이에 있는 사원의 급여 금액 (일치 여부가 아닌 범위를 지정하는 조건식으로 조인)
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
자체 조인
하나의 테이블을 여러 개의 테이블처럼 활용하여 조인하는 방식 (자기 자신의 테이블을 조인)
-- 사원 정보와 직속 상관 정보 출력
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;
=> 결과에 MGR이 NULL인 행은 제외되어 출력 (내부 조인)
외부 조인
조인 조건 데이터 중 어느 한쪽이 NULL이라도 결과를 출력해야하는 경우에 사용
(내부 조인(등가, 자체 조인 포함) <-> 외부 조인(아우터 조인))
조인 기준 한 쪽에 (+)
기호 붙여줌
Left Outer Join : WHERE T1.COL = T2.COL(+)
Right Outer Join : WHERE T1.COL(+) = T2.COL
-- 왼쪽 외부 조인
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO(+);
=> 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관없이 출력
-- 오른쪽 외부 조인
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR(+) = E2.EMPNO;
=> 오른쪽 열을 기준으로 왼쪽 열의 데이터 존재 여부에 상관없이 출력
SQL-99 표준 문법
NATURAL JOIN
등가 조인을 대신해 사용하는 조인 방식
두 테이블에 이름과 자료형이 같은 열을 찾으 후 그 열을 기준으로 등가 조인을 하는 방식
-- 자동으로 DEPTNO 열을 기준으로 등가 조인됨 (테이블 이름을 붙이면 안되는 특성을 지님)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, DEPTNO, D.DNAME, D.LOC
FROM EMP E NATURAL JOIN DEPT D;
JOIN ~ USING
등가 조인을 대신해 사용하는 조인 방식
USING 키워드에 조인 기준으로 사용할 열을 명시
-- (테이블 이름을 붙이면 안되는 특성을 지님)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, DEPTNO, D.DNAME, D.LOC
FROM EMP E JOIN DEPT D USING(DEPTNO);
JOIN ~ ON
WHERE절에 있는 조건식을 ON 키워드에 작성 (조인 기준 조건식을 ON에 명시, 출력 조건식은 WHERE절에 사용)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E JOIN DEPT D ON(E.DEPTNO = D.DEPTNO);
OUTER JOIN
=외부 조인
WHERE절에 있는 조건식을 FROM절의 ON 키워드에 작성
-- 🎵 기존 방식과의 차이점
**LEFT OUTER JOIN**
방법1) WHERE T1.COL = T2.COL(+)
방법2) FROM TABLE1 LEFT OUTER JOIN TABLE2 ON (T1.COL = T2.COL)
**RIGHT OUTER JOIN**
방법1) WHERE T1.COL(+) = T2.COL
방법2) FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON (T1.COL = T2.COL)
**FULL OUTER JOIN**
방법1) X (UNION 집합 연산자 활용)
방법2) FROM TABLE1 FULL OUTER JOIN TABLE2 ON (T1.COL = T2.COL)
'Programming > Database' 카테고리의 다른 글
[ORACLE 초급] DML - INSERT, UPDATE, DELETE (feat. 서브쿼리) (0) | 2020.09.26 |
---|---|
[ORACLE 초급] 서브쿼리 - WHERE절(단일행, 다중행, 다중열), 인라인뷰(WITH절), 스칼라서브쿼리 (0) | 2020.09.20 |
[ORACLE 중급] 그룹화 함수 - ROLLUP, CUBE, GROUPING, PIVOT 등 (0) | 2020.09.18 |
[ORACLE 초급] 데이터 그룹화 GROUP BY절, HAVING절 (0) | 2020.09.18 |
[ORACLE 초급] 오라클 함수 - 단일행 함수(문자, 날짜, 숫자 ...), 다중행 함수(SUM, AVG, COUNT ...) (0) | 2020.09.14 |