Database 개념5- Join

Join의 종류와 활용

조인 (Join)

  • Query문에서 특수한 구문을 사용해 2개 이상의 테이블을 하나로 연결해 조회하는 방법
  • 각 테이블에서 필요한 칼럼을 추철하여 단일 결과 집합으로 만드는 것

조인의 종류

db_join

크로스 조인 (Cross Join)

  • 테이블의 모든 행을 조인
    • EMP : 14 rows, DEPT : 4 rows 인 경우 총 14 * 4 = 56 rows 출력
  • 데이터를 많이 생성할 때 주로 사용
-- cross join & traditional join
SELECT *
FROM emp, dept;
-- ansi
SELECT *
FROM emp CROSS JOIN dept;

내부 조인 (Inner Join)

  • 2개 이상의 테이블에서 일치하는 데이터만을 추출하여 조회하는 방법
  • 조건이 일치되지 않는 행은 결과에 출력되지 않음
-- inner join
SELECT empno, sal, ename, emp.deptno
FROM emp, dept
WHERE emp.deptno = dept.deptno;
-- 별칭
SELECT empno, sal, ename, a.deptno, dname
FROM emp a, dept b
WHERE a.deptno = b.deptno;
-- ansi
SELECT *
FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;

SELECT *
FROM emp INNER JOIN dept USING (deptno);

-- 사번 이름 급여 급여등급을 구하세요.
SELECT empno, ename, sal, grade
FROM emp, salgrade
WHERE 1 = 1
AND sal BETWEEN losal AND hisal;
-- 위 쿼리와 같은 쿼리.
SELECT empno, ename, sal, grade
FROM emp, salgrade
WHERE 1 = 1
AND sal >= losal 
AND sal <= hisal;

외부 조인 (Outer Join)

  • 조건이 일치되지 않는 행도 결과에 출력
  • full outer join은 MySQL에서는 지원하지 않는다.
-- outer join
UPDATE emp SET deptno = NULL WHERE empno=7839;
SELECT * FROM emp;

SELECT *
FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;

-- 사원의 이름, 사번, 급여, 부서명을 구하세요.
-- left outer join : 기준이 emp 테이블.
SELECT *
FROM emp LEFT OUTER JOIN dept ON emp.deptno = dept.deptno;
-- right outer join : 기준이 dept 테이블.
SELECT *
FROM emp RIGHT OUTER JOIN dept ON emp.deptno = dept.deptno;
-- full outer join : oracle은 지원하지만 MySql은 지원하지 않음.
SELECT *
FROM emp FULL OUTER JOIN dept ON emp.deptno = dept.deptno;

자연 조인 (Natural Join)

  • inner join과 같지만 on이나 using 조건을 주지 않아도 된다.
-- natural join
SELECT *
FROM emp NATURAL JOIN dept;

자체 조인 (Self Join)

-- self join
-- 이름, 사번, 관리자 이름, 사원의 급여, 관리자 급여 출력.
SELECT a.ename, a.empno, b.ename, a.sal, b.sal
FROM emp a, emp b -- 사원과 관리자하고 연결하는 것.
WHERE a.mgr = b.empno;

-- ansi
SELECT a.ename, a.empno, b.ename, a.sal, b.sal
FROM emp a JOIN emp b ON a.mgr = b.empno;
-- outer join + self join
SELECT a.ename, a.empno, b.ename, a.sal, b.sal
FROM emp a LEFT OUTER JOIN emp b ON a.mgr = b.empno;

Leave a comment