[ JOIN ]
데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해준다.
관계형 데이터베이스(Relation Database)에서 가장 많이 쓰인다.
특징
- 조인하는 테이블에는 같은 값을 가진 컬럼이 필요하다.
- 세 개 이상의 테이블도 조인이 가능하다.
- 조인할 때 테이블에 대한 별칭이 필요하다.
- 조인 컬럼을 비교하는 조건이 필요하다.
INNER JOIN
조인하는 테이블의 ON 절의 조건이 만족하는 데이터만 가져온다.
MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 같은 의미로 사용된다.
조인 관계에 부합되는 레코드를 모두 가지며, 조인에 부합되지 않는 레코드는 모두 삭제된다.
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE D.DNAME = 'RESEARCH'; -- JOIN이 끝난 후 WHERE절의 조건을 확인한다.
-- 해당 쿼리도 위와 같다.
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E INNER, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND D.DNAME = 'RESEARCH';
OUTER JOIN(LEFT, RIGHT, FULL)
두 테이블이 합쳐질 때 기준이 어디냐에 따라 기준 테이블의 것은 모두 출력된다.
LEFT JOIN
첫 번째 테이블을 기준으로 두 번째 테이블을 조합한다.
ON절의 조건을 만족하지 못하는 경우 첫 번째 테이블의 필드값은 모두 가져오지만 해당 튜플의 두 번째 테이블 필드값은 모두 NULL이다.
SELECT DISTINCT E.DEPTNO, D.DEPTNO
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
# DEPT에는 40번이 DEPTNO가 존재하지만 EMP에는 존재하지 않아 NULL이 발생한다.
SELECT DISTINCT E.DEPTNO, D.DEPTNO
FROM DEPT D
LEFT JOIN EMP E
ON E.DEPTNO = D.DEPTNO;
RIGHT JOIN
LEFT JOIN과 반대라고 생각하면 된다.
LEFT JOIN이나 RIGHT JOIN을 여러번 할 때
가장 첫 번째 테이블로 가장 많은 열을 가져와야 하며, JOIN을 변경 해 가면서 사용하지 않아야 한다.
FULL OUTER JOIN
MySQL에서는 FULL OUTER JOIN을 지원하지 않는다.
LEFT JOIN과 RIGHT JOIN으로 FULL OUTER JOIN을 구현할 수 있다.
-- UNION은 자동으로 DISTINCT(중복제거)처리가 된다.
(SELECT * FROM EMP E LEFT JOIN DEPT D on E.DEPTNO = D.DEPTNO)
UNION
(SELECT * FROM EMP E RIGHT JOIN DEPT D on E.DEPTNO = D.DEPTNO);
[ UNION(합집합) ]
여러개의 SELECT문의 결과를 하나의 테이블이나 결과 집합으로 표현할 수 있다.
SELECT문으로 선택된 필드의 개수와 타입, 순서는 모두 같아야 한다.
자동으로 DISTINCT(중복제거)처리가 된다.
DISTINCT처리를 하기 싫다면 UNION ALL을 사용하면 된다.
(SELECT * FROM EMP E LEFT JOIN DEPT D on E.DEPTNO = D.DEPTNO)
UNION
(SELECT * FROM EMP E RIGHT JOIN DEPT D on E.DEPTNO = D.DEPTNO);
[ DISTINCT(중복 제거) ]
SELECT절에서 SELECT DISTINCT를 사용하면 간단하게 처리가 가능하지만, 쿼리가 길어지면 성능이 저하된다.
DISTINCT를 사용할 경우, 성능 개선을 위해 JOIN 전에 중복을 제거하는 것이 좋다.( 서브쿼리 )
-- 간단한 사용방법
SELECT DISTINCT E.DEPTNO, D.DEPTNO
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
-- JOIN 전에 먼저 서브쿼리를 사용하여 DISTINCT처리
SELECT C.NAME, C.COUNTRYCODE
FROM CITY C
LEFT JOIN (SELECT DISTINCT NAME, CODE
FROM COUNTRY) AS CO
ON C.COUNTRYCODE = CO.CODE;
참조
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!