JOIN 이란
- 2개 이상의 테이블을 연결하여 데이터를 검색하는 방법
JOIN의 종류
- INNER JOIN
- NATURAL JOIN
- SELF JOIN
- OUTER JOIN
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
- CROSS JOIN
일반적으로 조인이라고 하면 이 정도가 전부라고 알고 있다.
그러나 위에 있는 조인들은 FROM 절의 조인 형태에 따라 구분되는 조인들이고,
추가적으로 [연산자]에 따라 분류되는 다음 조인들도 존재한다.
이들에 대해서는 간단하게만 알아볼 것이다.
- EQUI JOIN
- NON EQUI JOIN
1. INNER JOIN
- JOIN 조건에서 값이 일치하는 행만 반환한다.
- 기준 테이블과 JOIN 테이블에 중복되는 값을 보여준다.
- 교집합
사용 형태
- 조인 사용 형태에는 Oracle 과 ANSI 두 종류가 있다.
- 각 테이블에 알리어스를 준 후, 해당 알리어스를 통해 어떤 테이블에서 컬럼을 추출한 것인지 구분한다.
- Oracle
SELECT A.컬럼명, B.컬럼명 ...
FROM CUSTOMER A, PRODUCT B
WHERE 1=1
AND A.컬럼명 = B.컬럼명
...
- ANSI
SELECT A.컬럼명, B.컬럼명 ...
FROM CUSTONER A
INNER JOIN PRODUCT B
ON A.컬럼명 = B.컬럼명
AND ...
예시
위에 있는 두 가지 테이블로 조인한 결과를 확인해보자.
쿼리문
- Oracle
SELECT A.TRAN_NO, A.NAME, B.PRICE
FROM CUSTOMER A, FRUIT B
WHERE 1=1
AND A.TRAN_NO = B.TRAN_NO
- ANSI
SELECT A.TRAN_NO, A.NAME, B.PRICE
FROM CUSTOMER A
INNER JOIN FRUIT B
ON A.TRAN_NO = B.TRAN_NO
쿼리 결과
2. NATURAL JOIN
- 기준 테이블과 조인 테이블에서 동일한 이름을 가진 컬럼들이 자동으로 모두 조인된다.
- 컬럼명과 타입이 전부 동일해야 한다.
- NATURAL JOIN의 단점은 동일한 이름을 가지는 컬럼이 모두 조인된다는 것이다.
- 이를 해결하기 위해 USING 문을 사용한다.
예시
위에 있는 두 가지 테이블로 조인한 결과를 확인해보자.
쿼리문
SELECT A.NO, A.NAME, B.RANK ....
FROM EMPLOYEE A NATURAL JOIN RANK B
- USING
SELECT A.NO, A.NAME, B.RANK
FROM EMPLOYEE A
JOIN RANK B
USING (NAME)
쿼리 결과
- USING
3. SELF JOIN
- 동일한 테이블을 마치 다른 테이블처럼 조인한다.
예시
COMPANY 테이블로 SELF JOIN을 해보자.
쿼리문
- Oracle
SELECT A.NO, A.NAME, A.RANK
FROM COMPANY A, COMPANY B
WHERE 1=1
AND A.NO = B.SUPER
- ANSI
SELECT A.NO, A.NAME, A.RANK
FROM COMPANY AS A
JOIN COMPANY AS B
ON A.NO = B.SUPER
쿼리 결과
4. OUTER JOIN
- 어느 한 테이블의 데이터를 모두 가져온다.
- 조인 조건을 만족하지 않는 데이터를 처리하기 위해 사용한다.
1) LEFT OUTER JOIN
- 왼쪽에 적힌 테이블 데이터를 기준으로 OUTER JOIN을 수행한다.
- 왼쪽에 적힌 테이블에 NULL 값 혹은 조인 조건에 일치하지 않는 값이 있어도 전부 출력한다.
- A 전부
예시
쿼리문
- Oracle
SELECT A.NO, A.NAME, B.SUM_NAME
FROM STUDENT A, SUBJECT B
WHERE 1=1
AND A.SUB_CODE = B.SUB_CODE(+)
- ANSI
SELECT A.NO, A.NAME, B.SUB_NAME
FROM STUDENT A LEFT OUTER JOIN SUBJECT B
ON A.SUB_CODE = B.SUB_CODE
쿼리 결과
2) RIGHT OUTER JOIN
- 오른쪽에 적힌 테이블 데이터를 기준으로 OUTER JOIN을 수행한다.
- 오른쪽에 적힌 테이블에 NULL 값 혹은 조인 조건에 일치하지 않는 값이 있어도 전부 출력한다.
- B 전부
예시
쿼리문
- Oracle
SELECT A.NO. A.NAME, B.SUB_NAME
FROM STUDENT A, SUBJECT B
WHERE 1=1
AND A.SUB_CODE(+) = B.SUB_CODE
- ANSI
SELECT A.NO. A.NAME, B.SUB_NAME
FROM STUDENT A RIGHT OUTER JOIN SUBJECT B
ON A.SUB_CODE = B.SUB_CODE
쿼리 결과
3) FULL OUTER JOIN
- 모든 테이블의 데이터를 전부 출력한다.
- 외부 조인의 하나로 ANSI 조인에서만 제공하는 기능이다.
- 합집합
예시
쿼리문
- ANSI
SELECT A.NO, A.NAME, B.SUB_NAME
FROM STUDENT A FULL OUTER JOIN SUBJECT B
ON A.SUB_CODE = B.SUB_CODE
쿼리 결과
5. CROSS JOIN
- 테이블 조인 시 가능한 모든 경우의 데이터를 출력한다.
- 곱집합
예시
쿼리문
- Oracle
SELECT A.CUS_NAME, A.PRO_CD, B.PRO_NAME
FROM CUSTOMER A, PRODUCT B
- ANSI
SELECT A.CUS_NAME, A.PRO_CD, B.PRO_NAME
FROM CUSTOMER A CROSS JOIN PRODUCT B
쿼리 결과
6. EQUI JOIN
- INNER JOIN 은 EQUI JOIN과 NON EUQI JOIN으로 구분할 수 있다.
- 조인 대상인 테이블들에서 컬럼값들이 정확하게 일치할 때 사용하는 JOIN이다.
- WHERE 절에 연산자 ' = ' 를 사용해서 작성한다.
- 해당 조인의 성능을 높이려면 INDEX 기능을 사용하는 것이 좋다.
예시
쿼리문
- Oracle
SELECT A.TRAN_NO, A.NAME, B.PRODUCT, B.PRICE
FROM CUSTOMER A, PRODUCT B
WHERE A.TRAN_NO = B.TRAN_NO
AND B.PRICE = '2000'
- ANSI
SELECT A.TRAN_NO, A.NAME, B.PRODUCT, B.PRICE
FROM CUSTOMER A
JOIN PRODUCT B
ON A.TRAN_NO = B.TRAN_NO
WHERE B.PRICE = '2000'
쿼리 결과
7. NON EQUI JOIN
- 조인 대상 테이블들에서 어떤 컬럼 값도 일치하지 않을 때 사용한다.
- WHERE 절에 ' = ' 외의 연산자를 사용한다.
- 연산자 : BETWEEN [A] AND [B], IS NULL, IS NOT NULL, IN, NOT IN, <, >, >=, <=
예시
쿼리문
- Oracle
SELECT A.NAME, A.SCORE, B.GRADE
FROM STUDENT A, GRADE B
WHERE A.SCORE >= B.MIN
AND A.SCORE <= B.MAX
- ANSI
SELECT A.NAME, A.SCORE, B.GRADE
FROM STUDENT A JOIN GRADE B
ON A.SCORE BETWEEN MIN AND MAX
쿼리 결과
'기초이론 > DataBase' 카테고리의 다른 글
인덱스(Index)와 힌트(Hint) (0) | 2022.07.02 |
---|---|
엘라스틱 서치(Elasticsearch) (0) | 2022.06.26 |
UNION 과 UNION ALL 이란 (0) | 2022.03.14 |