테이블 및 데이터
JOIN 이란?
2개 이상의 테이블을 연결하여 데이터를 검색하는 방법이다.
보통 공통된 값인 PK 및 FK 값을 사용하여 조인한다.
조인은 조인 연산자에 따라, From 절의 조인 형태에 따라서 구별한다.
JOIN의 구별
■ 연산자에 따은 분류
EQUI JOIN : 두 테이블 간의 칼럼 값들이 서로 일치하는 경우 ( '=' 연산자 사용)
NON EQUI JOIN : 두 테이블 간의 칼럼 값들이 서로 일치하는 경우 (비교 연산자 사용)
■ FROM 절의 JOIN 형태에 따른 분류
INNER JOIN : JOIN 조건에서 값이 일치하는 행만 반환
OUTER JOIN : JOIN 조건에서 한쪽 값이 없더라도 행을 반환
INNER JOIN
INNER JOIN은 EQUI JOIN과 NON EQUI JOIN으로 구분된다.
1. EQUI JOIN (동등조인)
조인 대상 테이블의 칼럼 값들이 서로 정확하게 일치하는 경우에 사용하는 JOIN으로 WHERE 절에 '=' (Equality Condition) 연산자를 사용하여 JOIN 조건을 명시한다.
일반적으로 PK, FK로 지정된 칼럼을 JOIN으로 많이 사용한다.
EQUI JOIN의 성능을 높이려면 INDEX 기능을 사용하는 것이 좋다.
■ EQUI JOIN 구문
1 2 3 4 5 | SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명 = 테이블명2.속성명 | cs |
■ EQUI JOIN 예제
<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 속성을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력
1 2 3 4 5 | SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME FROM STUDENT s, DEPARTMENT d WHERE s.D_CODE = d.D_CODE; | cs |
■ 실행 결과
조인시 테이블 간의 ','를 생략하고 INNER JOIN을 사용할 수 있으며, INNER는 생략 가능하다. JOIN 조건은 ON 절에 온다.
■ INNER JOIN 구문
1 2 3 4 5 6 | SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1 INNER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명 | cs |
■ INNER JOIN 예제
위의 EQUI JOIN을 INNER JOIN으로 변경
1 2 3 4 5 6 | SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME FROM STUDENT s INNER JOIN DEPARTMENT d ON s.D_CODE = d.D_CODE; | cs |
2. NATURAL JOIN
EQUI JOIN에서 JOIN 조건이 '='일 때 동일한 속성이 두 번 나타나게 되는데, 이 중 중복을 제거하여 같은 속성을 한번만 표기하는 방식이다.
NATURAL JOIN은 두 테이블의 동일한 이름을 가지는 칼럼이 모두 조인된다.
동일한 칼럼을 내부적으로 찾게 되므로 테이블 별칭(Alias)을 주면 오류가 발생한다.
■ NATURAL JOIN 구문
1 2 3 4 | SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1 NATURAL JOIN 테이블명2 | cs |
■ NATURAL JOIN 예제
<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 속성을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력
1 2 3 4 | SELECT s.S_NO, s.S_NAME, D_CODE, d.D_NAME FROM STUDENT s NATURAL JOIN DEPARTMENT d; | cs |
■ 실행 결과
NATURAL JOIN의 단점은 동일한 이름을 가지는 칼럼은 모두 조인이 되는데, USING 문을 사용하면 칼럼을 선택해서 조인을 할 수가 있다. USING절 안에 포함되는 칼럼에 별칭(Alias)을 지정하면 오류가 발생한다.
■ JOIN ~ USING 구문
1 2 3 4 5 6 | SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1 JOIN 테이블명2 USING(속성명) | cs |
■ JOIN ~ USING 예제
<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 속성을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력
1 2 3 4 5 6 | SELECT s.S_NO, s.S_NAME, D_CODE, d.D_NAME FROM STUDENT s JOIN DEPARTMENT d USING (D_CODE); | cs |
3. NON EQUI JOIN
조인 대상 테이블의 어떤 칼럼 값도 일치하지 않을 때 사용하며 '=' 이외의 연산자를 사용한다.
사용 빈도가 매우 낮다.
연산자 : BETWEEN AND, IS NULL, IS NOT NULL, IN, NOT IN, < , >, >=, <=
■ NON EQUI JOIN 구문
1 2 3 4 5 | SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1, 테이블명2.. WHERE (NON EQUI JOIN 조건) | cs |
■ NON EQUI JOIN 예제
<학생> 테이블과 <성적등급> 테이블을 JOIN하여 각 학생의 학번, 이름, 성적, 등급을 출력
1 2 3 4 5 | SELECT s.S_NO, s.S_NAME, s.S_GRADE, g.GRADE FROM STUDENT s, GRADE g WHERE s.S_GRADE BETWEEN G.MIN AND G.MAX; | cs |
■ 실행 결과
4. SELF JOIN
SELF JOIN은 같은 테이블에서 2개의 속성을 연결하여 EQUI JOIN을 하는 것이다.
■ SELF JOIN 구문
1 2 3 4 5 6 7 8 9 10 11 12 | -- 방법1 SELECT [별칭1.]속성명, [별칭2.]속성명 .... FROM 테이블명1 AS 별칭1, 테이블명2 AS 별칭2 WHERE 별칭1.속성명 = 별칭2.속성명 -- 방법2 SELECT [별칭1.]속성명, [별칭2.]속성명 .... FROM 테이블명1 AS 별칭1 JOIN 테이블명2 AS 별칭2 ON 별칭1.속성명 = 별칭2.속성명 | cs |
■ SELF JOIN 예제
<학생> 테이블을 SELF JOIN하여 선배가 있는 학생과 선배의 이름을 표시
1 2 3 4 5 | SELECT a.S_NO AS 학번, a.S_NAME AS 이름, b.S_NAME AS 선배 FROM STUDENT a, STUDENT b WHERE a.S_SENIOR = b.S_NO; | cs |
■ 실행 결과
OUTER JOIN
조인 조건을 만족하지 않는 데이터를 처리하기 위한 JOIN으로 INNER JOIN이 두 테이블에 있는 일치하는 값만 가져오는 것에 비해 OUTER JOIN은 어느 한 쪽의 데이터를 모두 가져온다.
JOIN 조건에 일치하지 않은 값을 추가 할 때 사용한다.
1. LEFT OUTER JOIN
JOIN 수행 시 왼쪽에 표기된 데이터를 기준으로 OUTER JOIN을 수행한다.
■ LEFT OUTER JOIN 구문
1 2 3 4 5 6 7 8 9 10 11 | -- 방법1 SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1 LEFT OUTER JOIN 테이블명2.. ON 테이블명1.속성명 = 테이블명2.속성명 -- 방법2 SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명 = 테이블명2.속성명(+) | cs |
■ LEFT OUTER JOIN 예제
<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력
1 2 3 4 5 6 7 8 9 | -- 방법1 SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME FROM STUDENT s LEFT OUTER JOIN DEPARTMENT d ON s.D_CODE = d.D_CODE; -- 방법2 SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME FROM STUDENT s, DEPARTMENT d WHERE s.D_CODE = d.D_CODE(+); | cs |
■ 실행 결과
2. RIGHT OUTER JOIN
JOIN 수행 시 오른쪽에 표기된 데이터를 기준으로 OUTER JOIN을 수행한다.
■ RIGHT OUTER JOIN 구문
1 2 3 4 5 6 7 8 9 10 11 | -- 방법1 SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1 RIGHT OUTER JOIN 테이블명2.. ON 테이블명1.속성명 = 테이블명2.속성명 -- 방법2 SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명(+) = 테이블명2.속성명 | cs |
■ RIGHT OUTER JOIN 예제
<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력
1 2 3 4 5 6 7 8 9 10 11 | -- 방법1 SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME FROM DEPARTMENT d RIGHT OUTER JOIN STUDENT s ON d.D_CODE = s.D_CODE -- 방법2 SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME FROM DEPARTMENT d, STUDENT s WHERE d.D_CODE(+) = s.D_CODE; | cs |
■ 실행 결과
3. FULL OUTER JOIN
조인 수행 시 왼쪽, 오른쪽 테이블의 모든 값을 읽어 JOIN을 수행한다. LEFT OUTER JOIN과 RIGHT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다.
■ FULL OUTER JOIN 구문
1 2 3 4 5 | SELECT [테이블명1.]속성명, [테이블명2.]속성명 .... FROM 테이블명1 FULL OUTER JOIN 테이블명2.. ON 테이블명1.속성명 = 테이블명2.속성명 | cs |
■ FULL OUTER JOIN 예제
<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력, 이때 학과코드가 입력 안 된 학생이나 학과명이 없는 학과코드도 모두 출력
1 2 3 4 5 | SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME FROM STUDENT s FULL OUTER JOIN DEPARTMENT d ON s.D_CODE = d.D_CODE; | cs |
■ 실행 결과
'코딩 > DataBase' 카테고리의 다른 글
[Oracle] 오라클 제약조건 조회, 추가, 삭제하기 (0) | 2017.01.19 |
---|---|
[MySQL] MySQL 계정 생성하기 (1) | 2016.10.30 |
데이터베이스 - 데이터 삽입, 수정, 삭제, 조회 쿼리 (0) | 2016.10.09 |
[Oracle] 오라클 포트번호 및 SID 확인방법 (2) | 2016.10.06 |
데이터베이스 DDL (0) | 2016.09.21 |