JOIN은 두 개 이상의 테이블을 연결하여 데이터를 조회하는 방법이다. 관계형 DBMS는 성능 향상을 위해 정규화를 진행하기 때문에 테이블을 연결하여 조회하는 JOIN은 매우 중요한 기능이다.
JOIN에는 INNER JOIN(내부 조인), OUTER JOIN(외부 조인), CROSS JOIN(교차 조인), SELF JOIN(셀프 조인)이 있다. 이 네 유형을 오라클에서 사용되는 JOIN 문법과 모든 제품에서 공통적으로 사용 가능한 표준(ANSI) JOIN 문법을 사용하여 정리해볼 것이다.
JOIN 실습을 위해 테이블1, 테이블2, 테이블3 세 개의 테이블을 만들어보았다.
CROSS JOIN( = 카티션 곱(Cartesian Product))
카티션 곱은 조인할 때 WHERE절을 적지 않거나 잘못 기술되었을 때 해당 테이블에 대한 모든 데이터를 전부 가져오는 현상을 말한다. 이때 이러한 조인을 CROSS JOIN이라고 한다. 보통 조건이 빠져서 발생하는 실수로 잘 사용하지 않지만 대량의 테스트용 테이블을 생성할 때 쓰기도 한다. CROSS JOIN은 조인하는 두 테이블에 있는 튜플들의 순서쌍을 결과로 반환하며, 이때 테이블의 행의 수는 두 테이블의 행의 수를 모두 곱한 것과 같다.
-- ORACLE --
SELECT * FROM 테이블1 , 테이블2;
-- ANSI --
SELECT * FROM 테이블1 CROSS JOIN 테이블2;
INNER JOIN(내부 조인)
INNER JOIN은 조인에 참여하는 모든 테이블에 존재하는 데이터만 출력한다. 이때 선행 테이블에서 데이터를 가져온 후 조인 조건에 맞는 데이터를 후행 테이블에서 가져온다. INNER JOIN은 일반적으로 EQUI JOIN과 NON-EQUI JOIN으로 구분된다.
• EQUI JOIN(등가 조인)
조인하는 테이블 간 칼럼의 값이 동일한 데이터만 출력하는 것으로 조인 조건절에 Equal 연산자 '='를 사용하기 때문에 EQUI JOIN이라고 한다. PK ↔ FK 관계에서 자주 사용되기 때문에 가장 많이 사용하는 조인이다.
-- ORACLE --
SELECT *
FROM 테이블1 , 테이블2
WHERE 테이블1.색깔 = 테이블2.color;
-- ANSI --
SELECT *
FROM 테이블1 [INNER] JOIN 테이블2
ON 테이블1.색깔 = 테이블2.color;
*INNER 키워드는 생략 가능
오라클 문법과 ANSI 문법은 위처럼 다르다. ANSI 문법은 ON절에 조인 조건이 들어가며 추가로 검색 조건 필요시 뒤에 AND를 사용하여 검색 조건을 추가할 수 있다. 검색 조건이 있다면 검색 조건을 먼저 수행하여 데이터의 검색 범위를 줄인 후 조인 작업을 수행한다.
조인 시 컬럼 이름은 '테이블 이름.컬럼 이름' 형태로 적을 수 있다. 만약 조인에 참여하는 모든 테이블에서 컬럼 이름이 겹치지 않는다면 테이블 이름을 생략할 수 있다.
위의 EQUI JOIN의 결과는 테이블1의 fruit와 테이블2의 과일의 값이 서로 같은 튜플들을 결합하여 하나의 튜플로 출력되며 아래와 같다.
- USING절
만약 조인할 두 테이블에서 조인 조건을 정의할 컬럼의 이름이 같다면 ANSI 문법에서는 아래처럼 USING절에 조인할 컬럼을 지정하여 간단하게 작성할 수 있다. USING절에 들어가는 컬럼은 공통 컬럼이므로 테이블명 없이 사용한다.
-- ANSI --
SELECT *
FROM 테이블1 JOIN 테이블2
USING(번호);
- NATURAL JOIN
또한 두 테이블의 동일한 이름을 갖는 컬럼들 모두 조인을 하고 싶다면 ANSI 문법에서 NATURAL JOIN을 사용하여 더욱 간단하게 작성할 수 있다.
-- ANSI --
SELECT *
FROM 테이블1 NATURAL JOIN 테이블2;
테이블1과 테이블2의 동일한 이름을 가진 컬럼은 '번호' 하나로, 위의 USING절을 사용한 경우와 NATURAL JOIN을 사용한 경우의 결과는 아래처럼 같다. 만약 서로 같은 컬럼명이 많았다면 NATURAL JOIN은 그 모든 컬럼을 조인하기 때문에 결과가 달랐을 것이다.
• NON-EQUI JOIN(비등가 조인)
EQUI JOIN과 다르게 두 테이블의 칼럼 값이 일치하지 않을 경우 사용하는 조인이다. '=' 연산자가 아닌 나머지 비교 연산자(>, <, <>, >=, <=)를 사용한다.
-- ORACLE --
SELECT 테이블1.번호, 테이블1.이름, 테이블3.group_name
FROM 테이블1, 테이블3
WHERE 테이블1.번호 BETWEEN 테이블3.start_num AND 테이블3.end_num;
-- ANSI --
SELECT 테이블1.번호, 테이블1.이름, 테이블3.group_name
FROM 테이블1 JOIN 테이블3
ON 테이블1.번호 BETWEEN 테이블3.start_num AND 테이블3.end_num;
위의 결과는 아래와 같다. 테이블1의 번호에 따라 테이블3에 정의된 그룹 기준을 통해 그룹이 표시된 것을 볼 수 있다.
+ 세 개 이상 테이블 JOIN
위의 테이블1, 테이블2, 테이블3을 조인하는 것은 큰 의미가 없지만, 오라클과 ANSI 문법 비교를 위해 위에서 진행한 조인 예시를 합쳐서 쿼리문을 작성했다.
-- ORACLE --
SELECT
a.이름 AS "테이블1.이름",
a.색깔 AS "테이블1.색깔",
c.group_name AS "테이블3.group",
b.color AS "테이블2.color"
FROM 테이블1 a, 테이블2 b, 테이블3 c
WHERE a.색깔 = b.color
AND a.번호 BETWEEN c.start_num AND c.end_num;
-- ANSI --
SELECT
a.이름 AS "테이블1.이름",
a.색깔 AS "테이블1.색깔",
c.group_name AS "테이블3.group",
b.color AS "테이블2.color"
FROM 테이블1 a
JOIN 테이블2 b
ON a.색깔 = b.color
JOIN 테이블3 c
ON a.번호 BETWEEN c.start_num AND c.end_num;
위의 쿼리문 결과는 아래와 같다.
이렇게 JOIN 중 CROSS JOIN과 INNER JOIN을 살펴보았다. 다음 OUTER JOIN과 SELF JOIN은 아래 링크를 통해 확인할 수 있다.
[Oracle] JOIN (2) - OUTER JOIN, SELF JOIN(오라클, ANSI 문법)
이번에는 CROSS JOIN과 INNER JOIN에 이어서 OUTER JOIN과 SELF JOIN을 살펴볼 것이다. (CROSS JOIN과 INNER JOIN 링크는 아래에 남겨두었다.) JOIN 실습을 위한 테이블1, 테이블2, 테이블3 세 개의 테이블은 아..
worldag.tistory.com
'DataBase' 카테고리의 다른 글
[Oracle] JOIN (2) - OUTER JOIN, SELF JOIN(오라클, ANSI 문법) (2) | 2022.08.10 |
---|---|
[DB] 데이터 모델과 데이터베이스 설계( + 스키마) (0) | 2022.05.25 |
[Oracle] 테이블 복사/ 테이블의 데이터 복사 (0) | 2022.05.19 |
[Oracle] 제약 조건(Constraint) 추가, 변경, 조회, 삭제 (0) | 2022.04.14 |
댓글