일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 파일시스템 구현
- 병행성 관련 오류
- 다이나믹 프로그래밍
- 그리디알고리즘
- 락
- 디자인패턴
- 영속성
- DirectX 12
- 다이나믹프로그래밍
- 타입 객체
- DirectX12
- 알고리즘
- 프로그래머스
- 컨디션 변수
- 자료구조
- 운영체제
- Direct12
- I/O장치
- 쓰레드
- directx
- 멀티쓰레드
- 동적계획법
- OS
- codility
- 병행성
- 멀티프로세서
- 백준
- 그리디 알고리즘
- 렌더링 파이프라인
- 스케줄링
- Today
- Total
기록공간
OracleSQL - JOIN 본문
JOIN은 두 개 이상의 테이블을 서로 연결하여 데이터를 검색할 때 사용하는 방법으로 두 개의 테이블을 마치 하나의 테이블인 것처럼 보여주는 것이다.
JOIN의 사용 형식은 SQL 1992 CODE와 SQL 1999 CODE로 나눌 수 있다.
JOIN의 예를 쉽게 설명하기 위해 직원(EMP)라는 테이블을 정의하였으며 데이터의 내용은 다음과 같다.
SQL 1992 CODE
CROSS JOIN
CROSS JOIN은 수학에서 말하는 데카르트 곱(Cartersian Product)을 두 테이블에 수행하는 것을 뜻한다.
두 테이블을 결합하였을때 모든 경우의 수를 보여준다.
SELECT *
FROM EMP, DEPT;
결과는 다음과 같다.
EQUI JOIN
EQUI JOIN은 서로 정확히 일치하는 것들끼리 연결하여 결합시키는 결합 방법이다. 가장 중요하게 쓰이는 JOIN 방법 중 하나이다.
CROSS JOIN을 한 후 WHERE 조건절을 사용해 조건에 맞는 것들만 검색해 출력한다.
-- EMP와 DEPT를 결합하여 같은 부서 번호를 가진 데이터만 검색
SELECT
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
-- 위와 같은 코드
SELECT
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
NON EQUI JOIN
NON EQUI JOIN은 범위 안에 적합한 것들끼리 연결시키는 결합 방법이다.
-- EMP 테이블의 SAL이 SAL 테이블의 범위에 알맞은 등급으로 결합
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
결과는 다음과 같다.
EQUI JOIN 시 (+)를 활용
앞서 EQUI JOIN에서 부서번호에 맞게 부서, 사원 테이블을 결합하였다. 하지만 만약 EMP 테이블에 부서 번호를 갖지 못한 사원이 있다면 JOIN된 정보에서 그 사원의 정보는 누락될 것이다. 이를 해결하기 위해 (+)를 이용해 볼 수 있다. 다음과 같이 사용한다.
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO [여기에 (+) 삽입] = D.DEPTNO [여기에 (+) 삽입] --> 두 방향 중 한쪽만 삽입 가능
(+)가 없는 쪽 테이블의 데이를 모두 메모리에 적재한 후, (+)가 있는 쪽 테이블의 데이터를 하나하나 확인하여 결합시키는 형태로 JOIN이 이루어지게 된다. 즉, (+)가 없는 쪽인 주연이고, 있는 쪽이 조연이다.
하지만 (+)는 두 방향 동시에 삽입은 문법적으로 허용하지 않는다.
SQL 1999 CODE
1999 CODE에서는 본격적으로 JOIN과 ON 키워드가 등장한다. JOIN은 결합의 유형을 명시하고, ON은 결합 조건을 WHERE 조건절 대신에 사용하는 키워드이다.
CROSS JOIN
SELECT *
FROM EMP CROSS JOIN DEPT;
INNER JOIN
INNER JOIN은 1992 CODE의 EQUI JOIN에 해당한다.
SELECT *
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT. DEPTNO;
SELECT *
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
SELECT *
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO; --> INNER JOIN에서 INNER 생략 가능
OUTER JOIN
OUTER JOIN은 1992 CODE에서 (+)를 활용한 EQUI JOIN에 해당한다. 주목해야 할 점은 1992 CODE와 반대로 LEFT OUTER JOIN은 왼쪽이 주연, 오른쪽이 조연이고, RIGHT OUTER JOIN은 오른쪽이 주연, 왼쪽이 조연이다. 또한 여기서는 FULL OUTER JOIN이라고 해서 1992 CODE에서 사용할 수 없었던 양쪽에 (+)를 붙이는 기능을 사용할 수 있다.
SELECT *
FROM EMP E LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
SELECT *
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DPETNO = D.DEPTNO;
-- OUTER 생략 가능
SELECT *
FROM EMP E LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
SELECT *
FROM EMP E RIGHT JOIN DEPT D
ON E.DPETNO = D.DEPTNO;
-- FULL OUTER JOIN 기능 추가
SELECT *
FROM TBL_EMP E FULL OUTER JOIN TBL_DEPT D
ON E.DEPTNO = D.DEPTNO;
SELECT *
FROM TBL_EMP E FULL JOIN TBL_DEPT D
ON E.DEPTNO = D.DEPTNO;
세 개 이상의 테이블 JOIN
JOIN은 테이블 두 개를 넘어서 세 개 이상에서도 사용할 수 있다. 사용 방법은 다음과 같다.
-- 1. SQL 1992 CODE
SELECT 테이블명1. 컬럼명, 테이블명2.컬럼명, 테이블명3.컬럼명
FROM 테이블명1, 테이블명2, 테이블명3
WHERE 테이블1.컬럼명1 = 테이블명2.컬럼명1
AND 테이블명2.컬럼명2 = 테이블명3.컬럼명2;
--2. SQL 1999 CODE
SELECT 테이블명1.컬럼명, 테이블명2.컬럼명, 테이블명3.컬럼명
FROM 테이블명1 JOIN 테이블명2
ON 테이블명1.컬럼명1 = 테이블명2.컬럼명1
JOIN 테이블명3
ON 테이블명2.컬럼명2 = 테이블명3.컬럼명2;
NATURAL JOIN
NATURAL JOIN은 JOIN에 아무런 조건절을 집어 넣지 않아도 오라클 내부에서 관계를 찾아 알아서 JOIN 시켜주는 기능이다. 오라클이 관계를 직접 찾아줘야 하기 때문에 성능이 떨어지기 때문에, 실무에서는 왠만하면 쓰지 않는다. 사용 방법은 다음과 같다.
SELECT DEPTNO, DNAME, ENAME, SAL
FROM EMP NATURAL JOIN DEPT
'DataBase > Oracle' 카테고리의 다른 글
OracleSQL - 뷰(VIEW) (0) | 2020.10.18 |
---|---|
OracleSQL - 무결성 제약조건(Constraint) (0) | 2020.10.18 |
OracleSQL - ROW_NUMBER (0) | 2020.10.10 |
OracleSQL - 서브쿼리 (0) | 2020.10.05 |
OracleSQL - 중첩 그룹함수 / 분석함수 (0) | 2020.10.05 |