본문 바로가기
Develop/Database

DB | Join

by Hoya324 2023. 9. 20.

Join이란?

  • 데이터베이스에서 두 개 이상의 테이블을 연결하여 하나의 결과의 테이블로 만드는 것을 의미
  • 이를 통해 데이터를 효율적으로 검색하고 처리하는데 도움을 준다.

Join을 사용하는 이유

  • 데이터베이스에서 테이블을 분리하여 데이터 중복을 최소화하고 데이터의 일관성을 유지하기 위함

Join의 종류

INNER JOIN

 

  • 조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력
SELECT u.userid, name 
FROM usertbl AS u INNER JOIN buytbl AS b 
ON u.userid=b.userid 
WHERE u.userid="111" -- join을 완료하고 그다음 조건을 따진다.

inner join 함축 구문

  • 단순히 from 절에 콤마 쓰면 inner join 으로 치부된다.
SELECT u.userid, name 
FROM usertbl u, buytbl b 
WHERE u.userid=b.userid AND u.userid="111"

💡 MySQL의 경우

표준 SQL과는 달리 MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용된다.

OUTER JOIN

  • 두 테이블이 합쳐 질때 왼쪽/오른쪽을 기준으로 했느냐에 따라 기준 테이블의 것은 모두 출력된다.
  • 즉, OUTER JOIN은 조인하는 테이블의 ON 절의 조건 중 한쪽의 데이터를 모두 가져온다.
  • OUTER JOIN은 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN가 있다.

거의 대부분 LEFT OUTER JOIN을 사용하며, FULL OUTER JOIN은 성능상 거의 사용하지 않는다.

LEFT OUTER JOIN

 

 

  • LEFT JOIN은 두 테이블이 있을 경우, 첫 번째 테이블을 기준으로 두 번째 테이블을 조합하는 JOIN이다.
SELECT STUDENT.NAME, PROFESSOR.NAME 
FROM STUDENT LEFT OUTER JOIN PROFESSOR -- STUDENT를 기준으로 왼쪽 조인
ON STUDENT.PID = PROFESSOR.ID 
WHERE GRADE = 1

💡LEFT JOIN을 여러번 할 때 주의할 점

1) INNER JOIN과는 달리 LEFT JOIN은 조인하는 테이블의 순서가 상당히 중요하다.
어떤 순서로 테이블을 조인하는지에 따라 결과 테이블에 조회되는 행의 개수며 구성 등이 달라질 수 있다.

따라서 JOIN 문을 작성할 때, 만약 LEFT JOIN을 할 거라면 가장 첫 번째의 테이블로 SELECT문에 가장 많은 열을 가져와야 할 테이블을 우선으로 적어준다.

2) 조인을 여러 번 해야하는데 시작을 LEFT JOIN으로 했다면 나머지 조인도 LEFT JOIN을 이어나간다.

즉, LEFT JOIN을 쓰다가 갑자기 INNER JOIN 이나 다른 조인을 사용하지 않는다는 이야기.

RIGHT OUTER JOIN

 

 

  • RIGHT JOIN은 두 테이블이 있을 경우, 두 번째 테이블을 기준으로 첫 번째 테이블을 조합하는 JOIN이다.
SELECT STUDENT.NAME, PROFESSOR.NAME 
FROM STUDENT RIGHT OUTER JOIN PROFESSOR -- PROFESSOR를 기준으로 오른쪽 조인
ON STUDENT.PID = PROFESSOR.ID 
WHERE GRADE = 1

FULL OUTER JOIN

 

대부분 DB는 FULL OUTER JOIN을 지원하지 않는다. 하지만 간접적으로 구현하는 방법이 존재한다

  • UNION 합집합을 통해 FULL OUTER JOIN 구현
(select * from A LEFT JOIN B on A.id = B.id)) 
UNION 
(select * from A RIGHT JOIN B on A.id = B.id))
  • LEFT 조인한 테이블과 RIGHT조인한 테이블을 UNION 합집합 해주면 된다.
  • UNION 은 DISTICT자동 포함이라, 따로 중복제거 안해줘도 자동으로 중복제거 해준다

EXCLUSIVE LEFT JOIN

 

  • 어느 특정 테이블에 있는 레코드만 가져오는 것
  • EXCLUSIVE LEFT JOIN는 만약 테이블 두개를 JOIN한다면 둘중 한가지 테이블에만 있는 데이터를 가져온다.
  • LEFT JOIN과 Where절의 조건을 함께 사용하여 만드는 EXCLUSIVE LEFT JOIN 문법
SELECT * 
FROM table1 A LEFT JOIN table2 B
ON A.ID_SEQ = B.ID_SEQ 
WHERE B.ID_SEQ IS NULL 
-- 조인한 B 테이블의 값이 null만 출력하라는 말은, 조인이 안된 A 레코드 나머지값만 출력하라는 말

SELF JOIN

  • 말 그대로 테이블 자기자신을 조인 한 것
  • 이를 통해 데이터베이스에서 한 테이블 내의 레코드를 다른 레코드와 연결할 수 있습니다.
SELECT t1.column_name1, t2.column_name2, ...
FROM table_name t1
JOIN table_name t2 ON t1.join_column = t2.join_column
WHERE 조건;

CROSS JOIN

 

  • Cartesian product(데카르트 곱)인 집합 A와 B를 곱한 집합을 반환합니다.
  • 다시 말해 집합 A의 레코드의 갯수와 집합 B의 레코드의 갯수의 곱만큼 결과값이 반환되는 것입니다.
  • 경우의 수라고 생각하면 이해하기 쉽습니다.
SELECT 테이블1.열이름, 테이블2.열이름1, ...
FROM 테이블1
CROSS JOIN 테이블2
WHERE (조건)

Reference

'Develop > Database' 카테고리의 다른 글

DB | DB Locking과 Optimistic Lock/Pessimistic Lock  (0) 2023.09.20
DB | 트랜잭션, 동시성 제어, 회복  (1) 2023.08.28
DB | 정규화  (0) 2023.08.28
DB | 데이터 모델링  (1) 2023.08.28
DB | 데이터베이스 프로그래밍  (1) 2023.08.27