CS

[DB] 조인

soom22 2024. 7. 21. 22:07

JOIN이란?

  • 여러 개의 테이블이나 데이터베이스를 연결 → 데이터 검색하는 방법
  • 집합 개념 생각하면 편함
  • 기준 테이블과 조인 테이블로 나뉨
    • 교집합, 차집합, 합집합 등 여러 방식으로 조인할 수 있음.

💡 JOIN을 왜 사용할까?

  • 처음부터 전체 데이터가 들어있는 테이블을 생성하여 사용하면 안되는건가?
  • 정규화 과정 때문에 테이블을 분할하여 생성하기 때문
  • 이를 조합해서 사용하기 위해 조인을 사용한다. 

JOIN의 종류

inner join

  • 교집합
  • 기준 테이블과 조인 테이블의 중복된 값을 보여줌
  • 기본값이라 JOIN만 입력해도 inner join이 됨
  • 테이블을 읽는 순서는 결과와 상관없음
  • 결과
    • 공통된 값만 보여줌
SELECT *
FROM MEMBER, DIARY
WHERE MEMBER.Diary_id = DIARY.Diary_id;

 

SELECT *
FROM MEMBER
INNER JOIN DIARY
ON MEMBER.Diary_id = DIARY.Diary_id;

outer join

  • 기준 테이블의 값과 조인 테이블의 값을 더한 값을 보여줌
  • 한쪽 테이블에는 해당 데이터가 존재하는데 다른 쪽의 테이블에는 존재하지 않는다면 그 데이터가 검색되지 않는 문제점을 해결하기 위해 사용
  • outer가 되는 테이블을 먼저 읽어야 함

left outer join

  • 기준 테이블이 왼쪽 테이블
  • 결과
SELECT *
FROM MEMBER M LEFT OUTER JOIN DIARY D
ON M.Diary_id = D.Diary_id;

right outer join

  • 기준 테이블이 오른쪽 테이블
  • 결과
SELECT *
FROM MEMBER M RIGHT OUTER JOIN DIARY D
ON M.Diary_id = D.Diary_id;
💡 공통된 부분을 제외하고, 한쪽에만 있는 것을 출력하고 싶다면 NULL 조건만 추가해주면 됨.

 

full outer join

  • 합집합
  • 기준 테이블이 중요하지 않음
  • left outer join + right outer join
  • mysql에서는 지원하지 않음. 
  • 결과
  •  
  • -- MYSQL 에서는 지원하지 않아서 left랑 right 합쳐줘야함 SELECT * FROM MEMBER M LEFT OUTER JOIN DIARY D ON M.id = D.Diary_id; UNION SELECT * FROM MEMBER M RIGHT OUTER JOIN DIARY D ON M.id = D.Diary_id;
  • -- ORACLE
    SELECT *
    FROM MEMBER M FULL OUTER JOIN DIARY D
    ON M.id = D.Diary_id;

cross join

  • 모든 경우의 수를 전부 표현해주는 방식
  • 카디널리티 곱
  • 결과
SELECT *
FROM MEMBER M CROSS OUTER JOIN DIARY D
ON M.id = D.Diary_id;

self join

  • 본인 테이블과 본인 테이블을 조인
  • 본인 테이블에 있는 요소를 테이블에 사용하고 있을 때 사용하면 됨
  • 결과 
  •  
  • SELECT mem.id, mem.name, mem.mail, mem.friend_id, friend.name AS friend_name friend.mail AS friend_mail FROM mem AS friend WHERE mem.friend_id = friend.id
SELECT
 mem.id,
 mem.name,
 mem.mail,
 mem.friend_id,
 friend.name AS friend_name
 friend.mail AS friend_mail
FROM MEMBER mem INNER JOIN MEMBER friend
   ON mem.friend_id = friend.id

natural join

  • 알아서 같은 이름의 열을 조인 조건으로 걸어줌
  • 동일한 컬럼이 여러개 있는 경우 사용
  • 결과
SELECT *
FROM MEMBER M NATURAL JOIN DIARY D