💅 SQL 입문
지난 시간에는 UNION을 통해 복수의 테이블을 다루는 내용에 대해서 알아보았다. 이번 시간에서는 INDEX와 같이 정말 너무나도 중요한 JOIN에 대해서 알아보는 시간을 가진다.
❌ JOIN
우리가 배우고 있는 RDBMS에서는 1~6 정규화를 통해 테이블을 적절히 나누어서 관리한다. 따라서 나누어서 관리하는 이러한 테이블들을 합치기 위해서는 JOIN 연산을 통해 이를 처리한다. JOIN 연산에는 크게 다음과 같은 종류가 있다.
CROSS JOIN
INNER JOIN
OUTER JOIN (LEFT/RIGHT)
❌ CROSS JOIN
CROSS JOIN이라고 명칭하는 걸 보니 무엇인가를 '교차' 시키는 느낌을 받을 수 있다. 저번에 생성했던 GameDB를 이용하여 다음과 같은 테이블과 행을 추가하도록 하자.
CREATE TABLE testA
(
a INTEGER
)
CREATE TABLE testB
(
b VARCHAR(10)
)
-- A(1, 2, 3)
INSERT INTO testA VALUES(1);
INSERT INTO testA VALUES(2);
INSERT INTO testA VALUES(3);
-- B('A', 'B', 'C')
INSERT INTO testB VALUES('A');
INSERT INTO testB VALUES('B');
INSERT INTO testB VALUES('C');
사실 Cross Join의 경우 데이터가 많아질 경우 부담이 되는 연산 + 매우 비효율적이기 때문에 사용되지 않지만, Join의 개념을 알아두기 위한 과정으로 생각하면 편하다.
Cross Join을 사용하는 방법은 다음과 같이 두 가지 방법이 있다.
-- 방법 1
SELECT *
FROM testA
CROSS JOIN testB;
-- 방법 2
SELECT *
FROM testA, testB;
쿼리를 질의해보면 다음과 같은 결과를 얻을 수 있다.
9개의 행이 결과로 나왔다. 결과를 보면 아시다싶이 Cross Join이 무엇인지 쉽게 알 수 있을 것이다. Cross Join은 두 테이블의 모든 행의 조합을 모두 반환한다. 따라서 TestA의 3개, TestB의 3개의 행을 서로 조합하므로 3*3=9개의 행을 반환하는 것을 알 수 있다.
따라서 CrossJoin의 문제점은 모든 행의 조합을 모두 반환한다는 것인데 이는 두 테이블의 행 수가 커지면 커질수록 매우 비효율적이 된다는 문제점이 발생한다. 단순히 두 테이블의 행이 각자 100개 씩이라고만 하여도 100*100=10,000의 행을 반환하는 것이다. 따라서 Inner Join과 Outer Join을 시의적절하게 사용해야 한다.
❌ INNER JOIN
이제 INNER JOIN에 대해서 알아보도록 하자. INNER JOIN의 경우 두 개의 테이블을 가로로 이어 붙인 후, ON 절에 해당하는 기준을 만족한 행들만 반환한다. 이렇게 글로써 작성하면 쉽사리 알기 어려우므로 예제를 통해 살펴보자.
players, salaries 테이블엔 PlayerID라는 열이 공통적으로 있으므로 두 테이블을 사용하자.
SELECT *
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID;
위 결과와 같이, 두 테이블의 PlayerID가 같은 행들만 반환해주는 모습을 볼 수 있다.
❌ OUTER JOIN
Outer Join은 Inner Join과 유사하다. 그렇지만 Outer Join은 Left / Right Join이 두 가지 형식이 존재한다.
Left Join은 두 개의 테이블을 가로로 이어 붙인 후, ON 절에 있는 기준을 만족한 행들을 반환한다. 단, 왼쪽 테이블에 존재하지만 우측 테이블에 존재하지 않는 경우 이 부분은 NULL로 채운다.
Right Join은 두 개의 테이블을 가로로 이어 붙인 후, ON 절에 있는 기준을 만족한 행들을 반환한다. 단, Left Join과 반대로 오른쪽 테이블에 존재하지만 왼쪽 테이블에 존재하지 않는 경우 이 부분은 NULL로 채운다.
Left Join의 예시를 살펴보도록 하자.
SELECT *
FROM players AS p
LEFT JOIN salaries AS s
ON p.playerID = s.playerID;
yearID부터는 salaries 테이블로 부터 가로로 붙여진 부분이다. playerID가 NULL이므로, 이 후의 모든 부분이 NULL로 채워진 것을 알 수 있다.
이와 마찬가지로 Right Join은 Left Join의 반대의 결괏값을 가지므로 한 번 따라해보자. 😎
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 5-2-18. SQL 입문 : 변수와 흐름 제어, 배치/테이블 변수 (0) | 2024.05.30 |
---|---|
Part 5-2-17. SQL 입문 : TRANSACTION, COMMIT/ROLLBACK (0) | 2024.05.13 |
Part 5-2-15. SQL 입문 : UNION, INTERSECT, EXCEPT (1) | 2024.02.13 |
Part 5-2-14. SQL 입문 : INDEX (1) | 2024.02.13 |
Part 5-2-13. SQL 입문 : 정규화 (1) | 2024.02.13 |