코딩 쏙쏙

[MySQL] JOIN(INNER, OUTER)-정리 본문

[MySQL]

[MySQL] JOIN(INNER, OUTER)-정리

두두만두 2023. 4. 8. 19:55

테이블 결합

테이블 결합은 RDBMS의 꽃이라 할 수 있는 중요한 개념이다.

데이터 베이스는 하나의 테이블에 많은 데이터를 저장하지 않고 데이터를 정규화해서 여러개의 테이블로 나누어 저장한다.

다양하고 복잡한 데이터를 보여주기 위해서는 복수의 테이블을 결합해 데이터 검색할 수 있어야 한다.

 

결합은 여러가지 결합이 존재하는데 교차 결합은 생략하고 내부 결합과 외부 결합에 대해서 알아보자.

 

조인(JOIN)

 

조인(Join)SELECT와 더불어 가장 많이 사용하는 옵션 중 하나이다.

두 개 이상의 테이블을 묶어서 하나의 결과 집합으로 만들어 낸다.

즉, 서로 다른 테이블에서 데이터를 가져올 때 사용하는 것이 조인(Join)이다.

 

INNER JOIN(내부 결합)

 

INNER JOIN은 조인 중 가장 많이 사용된다. 기준이 되는 테이블(left table)과 join이 되는 테이블(right table) 양쪽 모두 결합조건이 만족 되는 row만 검색하는 방법이다.

SELECT * FROM TableA A INNER JOIN TableB ON A.key = B.key;

조인하는 테이블의 ON절의 조건이 일치하는 결과만 출력

MySQL에서 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용된다.

 

INNER JOIN 함축 구문

SELECT
u.userid,name
FROM usertbl as u
INNER JOIN buytbl as b
ON u.userid = b.userid
WHERE u.userid = "111" 

// # INNER JOIN 함축 구문

SELECT
u.userid,name
FROM usertbl as u, buytbl as b
WHERE u.userid = "111"

위 코드를 보면 단순히 FROM 절에 콤마를 쓰면 INNER JOIN으로 치부된다.

 

OUTER (LEFT/RIGHT/FULL) JOIN(외부 결합) 

외부 결합(OUTER JOIN)에는 대표적으로 LEFT JOIN, RIGHT JOIN, FULL JOIN이 있다. 외부 결합은 내부 결합과 함께 자주 사용되는 결합으로 결합(Join)하는 여러테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블을 기준으로 모두 출력하는 결합 방법이다. 

 

LEFT JOIN
 첫 번째 테이블을 기준으로 두 번째 테이블을 결합하는 JOIN이다.
SELECT users.name, posts.name 
FROM users LEFT OUTER JOIN posts // users를 기준으로 왼쪽 조인
ON users.id = posts.user_id

※ 주의

1. LEFT JOININNER JOIN과 다르게 조인하는 테이블의 순서가 중요하다.

어느 순서로 테이블을 조인하는지에 따라 결과 테이블에 조회되는 행의 개수와 구성이 달라질 수 있다.

2. 조인을 여러 번 해야할 때 시작을 LEFT JOIN으로 했다면 나머지 조인도 LEFT JOIN으로 이어나가야 한다.
즉, LEFT JOIN을 쓰다가 INNER JOIN 이나 다른 조인을 사용하지 않아야 한다.

 

RIGHT JOIN
 두 번째 테이블을 기준으로 첫 번째 테이블을 결합하는 JOIN이다.
SELECT users.name, posts.name 
FROM users RIGHT OUTER JOIN posts // posts를 기준으로 오른쪽 조인
ON users.id = posts.user_id
FULL JOIN
SELECT * FROM users FULL OUTER JOIN posts 
ON users.id = posts.user_id

 

대부분의 DB(Database)에서는 FULL OUTER JOIN을 지원하지 않는다.  그러나 간접적으로 구현하는 방법은 존재한다.

(SELECT * FROM users LEFT JOIN posts ON users.id = posts.user_id)) 
UNION 
(SELECT * FROM users RIGHT JOIN posts ON users.id = posts.user_id))

LEFT JOIN한 테이블과 RIGHT JOIN한 테이블을 UNION 합집합 해주면 된다.

'[MySQL]' 카테고리의 다른 글

[MySQL]AUTO_INCREMENT초기화  (0) 2023.04.12
[MySQL] 테이블 정렬_페이지네이션(PagiNation)  (0) 2023.04.09
[MySQL] 사용법-2  (0) 2023.04.02
[MySQL] 사용법-1  (0) 2023.03.27