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