조인(Join)이란?
join의 사전적 정의를 보면 '연결하다', '잇다', '합쳐지다' 등등 어느 하나와 다른 하나를 더하는 의미를 가지고 있다.
마찬가지로 데이터 베이스에서 join의 의미도 하나의 테이블과 다른 하나의 테이블을 더하는 것으로 볼 수 있다.
그러면 문뜩 '하나의 테이블에 다 집어넣고 사용하면 되는데 굳이 Join이라는 키워드를 써야 되는가'라는 의문점이 생긴다.
사실 조인을 사용하는 이유는 '정규화' 과정 때문이다.
정규화란? 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스
쉽게 말해서 불필요한 데이터의 정합성을 확보하고 이상 현상의 발생을 피하기 위해 테이블을 분할하여 생성하는 것을 일컫는다.정규화를 위해 분할한 테이블을 조합해서 사용하기 위해 조인(join)을 사용한다고 할 수 있다.
그러면 우리가 쿼리문을 작성할 때, Join이라는 키워드를 왜 써야 하는지 알았다. 그러면 Join의 종류와 그 사용법에 대해 알아보자.
조인의 종류
먼저 미국 국립 표준 협회(ANSI)에서 제시한 ANSI SQL의 Join을 보고 Oracle의 Join을 보도록 하겠다.
예제에 사용할 테이블에 대해 먼저 보면 사용할 테이블은 LESSON 테이블과 PRICES 테이블이다.
- LESSON 테이블
LESSON 테이블 | |
ID(PK) | NUMBER |
name | VARCHAR2 |
- PRICES 테이블
PRICES 테이블 | |
ID(FK) | NUMBER |
PRICE | NUMBER |
ANSI 기준
Join의 종류에는 Inner Join, Outer Join, Cross Join, Self Join이 있다.
1. Inner Join
Inner Join은 중학교를 처음 들어가면 배우는 집합의 종류 중에 '교집합'을 떠올리면 된다. 즉, 두 테이블의 공통된 부분만 추출하는 것이다.
SELECT
*
FROM
LESSON l
INNER JOIN PRICES s
ON l.id = s.id ;
LESSON 테이블과 PRICES 테이블의 데이터중에서 서로 일치하는 데이터만 가져온 것을 알 수 있다.
2. Outer Join
Outer Join은 조건에 일치하는 데이터와 일치하지 않는 데이터 모두를 가지고 온다. 그래서 Outer Join을 할 때 중요한 것은 '어떤 테이블을 중심으로 Join을 할 것인가?'이다.
그래서 Outer Join은 다시 Left Outer Join과 Right Outer Join, Full Outer Join으로 나눌 수 있다.
- Left Outer Join
SELECT
*
FROM
LESSON l
Left outer JOIN PRICES s
ON l.id = s.id ;
쿼리문을 작성할 때, Left를 기준으로 Outer Join을 하겠다고 했고 결과를 보면 아까와는 다른 양상을 보이고 있다.
PRICES 테이블을 보면 ID 값이 4와 5의 데이터는 없다. 그래서 존재하지 않는 데이터는 NULL로 SELECT 해 준 것이다.
- Right Outer Join
유의미한 결과를 출력하기 위해 LESSON 테이블의 id = 3인 데이터를 DELETE 하고 Join을 했다.
SELECT
*
FROM
LESSON l
Right outer JOIN PRICES s
ON l.id = s.id ;
LESSON 테이블에서 id = 3인 값을 지웠기 때문에 이번에는 LESSON 테이블에서 NULL이 SELECT 되었다.
- Full Outer Join
SELECT
*
FROM
LESSON l
Full outer JOIN PRICES s
ON l.id = s.id ;
결과를 보면 앞서 실행한 Left Outer Join과 Right Outer Join의 결과를 합친 결과를 보여준다.
3. Cross Join
Cross Join은 두 테이블을 Join 할 경우 나올 수 있는 모든 경우의 수를 다 출력해준다.
앞서 본 Inner Join과 Outer Join은 조건이 필요했지만, Cross Join은 조건이 필요 없다.
SELECT
*
FROM
LESSON
Cross JOIN PRICES ;
현재 LESSON 테이블에는 4개의 데이터가 존재하고 PRICES 테이블에는 3개의 데이터가 존재한다.
위에서 말했듯이 모든 경우의 수를 출력해준다고 했으니 4 X 3은 12이므로 쿼리문 결과가 제대로 나온 것을 알 수 있다.
4. Self Join
Self Join은 이름에서 알 수 있듯이 자기 자신을 가지고 Join 한다. 즉, LESSON 테이블과 LESSON 테이블이 Join 한다는 것이다.
여기서 발생할 수 있는 문제는 특정 열을 명시할 때, 어느 쪽의 열을 명시하는 것인지 애매하다는 문제가 발생한다는 것이다. 그래서 ㄴSelf Join 할 때, 별칭을 사용하는 것을 권고한다.
SELECT
*
FROM
LESSON T1
Join LESSON T2
on T1.id = T2.id ;
Oracle 기준
이번에는 Oracle에서는 어떻게 Join을 사용하는지 보도록 하자. 참고로 지금까지 본 ANSI Join 또한 Oracle에서 사용해도 무방하다.
ANSI에서는 'ON'이라는 키워드 뒤에 Join의 조건을 넣었지만 Oracle에서는 'where' 뒤에 Join의 조건을 넣는다.
그리고 Outer Join의 경우 기준이 되는 테이블의 상대 테이블에 (+)을 붙여서 표시를 해준다. 필자도 추후에 헷갈릴 거 같아서 다시 한번 강조한다. 기준이 되는 테이블이 아니라 기준이 되는 테이블의 상대 테이블에 (+)을 붙이는 것이다.
그래서인지 Oracle에서는 Full Outer Join이 안된다고 한다. 그래서 Full Outer Join을 하려면 ANSI 문법을 써야 할 거 같다.
1. Inner Join
SELECT
*
FROM
LESSON l, PRICES p
WHERE
l.id = p.id
;
앞서 말했듯이 Join의 조건을 이전에는 'ON' 키워드 뒤에 썼다면 Oracle에서는 'where' 뒤에 쓰는 것을 알 수 있다.
(위의 Inner Join과 결과가 다른 이유는 위에서 Right Outer Join을 위해 LESSON 테이블에 Id = 3 데이터를 지워서 그렇다.)
2. Left Outer Join
SELECT
*
FROM
LESSON l, PRICES p
WHERE
l.id = p.id(+)
;
3. Right Outer Join
SELECT
*
FROM
LESSON l, PRICES p
WHERE
l.id(+) = p.id
;
4. Cross Join
SELECT
*
FROM
LESSON l, PRICES p
;
5. Self Join
SELECT
*
FROM
LESSON T1, LESSON T2
WHERE
T1.id = T2.id
;
정리
- Join을 사용하는 이유는 정규화 과정 때문이다.
- Join에는 Inner Join, Outer Join, Cross Join, Self Join이 있다.
- ANSI Join은 Join의 조건을 ON 뒤에 붙이고, Oracle은 where절에 붙인다.
▽ 도움을 주신 분
'DataBase' 카테고리의 다른 글
[Oracle] ORA-01008 : not all variables bound (0) | 2023.02.13 |
---|---|
[MariaDB] Truncated incorrect decimal value '' (0) | 2023.02.02 |
[DataBase] 기본 키를 여러 개 설정한다고?? (2) | 2022.09.29 |
[DataBase] 정규화에 대해 알아보자! (0) | 2022.07.21 |
[DataBase] RDBMS VS NoSQL (0) | 2022.07.08 |