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 |