
join을 모르고 이그림을 본다면 뭔소린지 싶지만
배우고나서 그림을보면 join에 대해서 가장 잘 정리한 그림이라고 생각한다
CROSS JOIN
INNER JOIN
OUTER JOIN
SELF JOIN
지금까지 SELECT절에서 컬럼안의 데이터들을 이리만지고 저리만지고 조건을 붙이면서
하나의 테이블에서 데이터를 원하는대로 출력했다면
이제는 테이블이 하나가아닌 두개이상의 테이블에서 원하는 데이터들을
조건을 통해 출력할수 있는 방법이다
SELECT *
FROM EMP, DEPT
ORDER BY EMPNO;
/*EMP의 행과 DEPT 행을 곱해서 모든행을 표현*/
/*14 * 4 의 행이 출력됬다*/
EMP테이블과 DEPT테이블의 모든 데이터들을 연결해서 나오는 모든 경우의 수의
데이터를 출력한다
EMP테이블의 행은 14개이고 DEPT테이블의 행은 4개라서
경우의수를 다 가져오기때문에 14 * 4의 행갯수가 출력된다
위그림에는 해당없는 JOIN이고
보통 CROSS JOIN은 테스트로 사용할 대용량의 테이블을 생성할 경우에 사용된다
내 생각에는 CROSS JOIN이 잘 사용 안되는 이유가
DB의 근본적인 사용방법은 많은 데이터들중 원하는 데이터만 찾을려고 쓰는용도인데
CROSS JOIN은 오히려 더많은 데이터를 만들어 버린다 그래서 자주 안쓰이는 것 같다
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
EMP 테이블과 DEPT테이블은 DEPTNO를 키값으로 공유하고있다
이 키값은 두 테이블에서 동일한 데이터를 의미하고 있으므로
WHERE절에 E.DEPTNO = D.DEPTNO 라는 조건을 붙이면
두테이블의 동일한 데이터일 경우만 TRUE이고 그 데이터를 출력해라 라는 뜻이 된다
처음 그림에서 합집합의 형태가 되는것이다
EMP테이블이 DEPT 테이블보다 DEPTNO의 데이터값이 많다
출력값을 보면 EMP테이블의 데이터는 중복데이터가 없지만 DEPT테이블의 데이터는
중복데이터가 많다
마치 GROUP BY로 컬럼별 데이터를 출력할때 두개이상의 그룹이 생길경우
더 큰 그룹의 데이터는 중복없이 나오고 작은 그룹의 데이터는 큰 그룹의 데이터갯수만큼
중복데이터를 허용해서 출력되는것과 비슷한 형태라고 생각이 든다
OUTER JOIN은 종류가 많다 위 그림에서 INNER JOIN을 제외한 나머지 모든게 OUTER JOIN인데
일단 크게보자면 겹치는 데이터보다 더많은 데이터를 출력한다면 OUTER JOIN이라고 얘기할수 있고
그 방향성에 따라서 RIGHT JOIN, LEFT JOIN, FULL OUTER JOIN으로 나눌수도 있다
SELECT
FROM A테이블 LEFT JOIN B테이블
ON A키값 = B키값
집합 그림을 보면 겹치는 데이터 뿐만 아니라 왼쪽의 테이블의 모든 데이터까지 전부 출력하고 싶다면
LEFT JOIN을 사용한다(그반대는 RIGHT JOIN 사용)
/*EMP테이블의 모든 데이터와 EMP와 DEPT를 둘다 만족하는 데이터를 출력*/
SELECT *
FROM EMP E LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
SELECT
FROM A테이블 FULL OUTER JOIN B테이블
ON A키값 = B키값
겹치는 값과 A,B테이블의 모든 값을 출력하고 싶다면 FULL OUTER JOIN을 사용한다
SELECT *
FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
만약 겹치는 데이터를 제외한 나머지 모든 테이블의 데이터를 출력하고 싶다면?
SELECT *
FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE E.DEPTNO IS NULL OR D.DEPTNO IS NULL;
이렇게 한다면 DEPTNO가 겹치는 모든값은 제외하고 서로 안겹치는 값만 출력한다
SELECT
FROM A테이블 A, A테이블 B
테이블 하나를 A, B라고 명명하고 그둘을 비교해서 원하는 데이터로 가공할수 있는 방법이다
동일한 테이블을 사용하면 테이블과 컬럼이름이 동일하기 때문에
식별을 위해 반드시 테이블 별칭을 사용해야 한다
/*EMP 테이블에는 사원번호와 사원이름 그리고 그사원의 상사의 사원번호가 있다
사원번호와 사원이름은 바로 매칭되어 있기때문에 한눈에 볼수 있지만
상사의 이름은 사원번호만 있기때문에 이름을 쉽게 찾을 수가 없다
이때 SELF JOIN을 이용하여 사원번호, 사원이름, 상사의사원번호, 상사의이름 으로 출력하라*/
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO, E2.ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;
ORDER BY E1.MGR ASC;
사원과 상사의 사원이름을 SELF JOIN을 통해 보기 쉽게 데이터를 가공했다
JOIN의 핵심은 여러개의 테이블에서 원하는 데이터를 출력/가공 해야하는 경우
그 방법자체가 JOIN이라는 기능이고 문법과 기능만 외우는 것이 아니라
왜 사용하는지 이해하고 문제가 생겼을때 활용할 수 있어야 된다고 생각한다