조인(Join)

Yunsung·2024년 12월 23일
post-thumbnail
  • 조인: 여러 테이블을 결합하여 데이터를 조회하는 것.
  • 조인 순서(선행 테이블/후행 테이블) 중요: 처리 효율성에 큰 영향!!

조인의 종류

1. Inner Join(Equi Join)

  • 공통 데이터가 있는 경우만 조회

  • 조인 조건에 일치하지 않으면 제외

  • Innser Join에서 ON 사용
    - 조건: 두 테이블의 deptno 컬럼이 동일한 경우.
    - ON을 사용하면 두 컬럼의 이름이 달라도 조건을 작성할 수 있습니다.

    SELECT e.deptno, d.dname, e.empno, e.ename
    FROM dept d
    INNER JOIN emp e
    ON d.deptno = e.deptno;

  • Inner Join에서 USING 사용
    - 조건: 두 테이블에 동일한 이름의 deptno 컬럼이 존재해야 함.
    - 결과에서 deptno는 한 번만 표시됩니다.

    SELECT e.empno, e.ename, d.dname
    FROM emp e
    INNER JOIN dept d
    USING (deptno);

2. Outer Join

한쪽 테이블에 없는 데이터도 포함

Left Outer Join: 왼쪽 테이블 기준

SELECT d.deptno, d.dname, e.empno, e.ename
FROM dept d
LEFT OUTER JOIN emp e
ON d.deptno = e.deptno;

Right Outer Join: 오른쪽 테이블 기준

SELECT e.deptno, e.ename, d.dname
FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno;

Full Outer Join: 양쪽 테이블 모두 포함(MySQL은 미지원 -> UNION으로 구현가능!)

SELECT d.deptno, d.dname, e.empno, e.ename
FROM dept d
LEFT OUTER JOIN emp e ON d.deptno = e.deptno
UNION
SELECT d.deptno, d.dname, e.empno, e.ename
FROM dept d
RIGHT OUTER JOIN emp e ON d.deptno = e.deptno;


3. Cross Join

조인 조건 없이 모든 경우의 수 반환(조인테이블1행수 * 조인테이블2행수).

SELECT * 
FROM dept, emp;

4. Self Join

동일 테이블에서 조인

SELECT e1.empno, e1.ename, e2.ename AS manager
FROM emp e1
LEFT JOIN emp e2
ON e1.mgr = e2.empno;

5. Non-Equi Join

조인 조건이 =이 아닌 경우.

SELECT e.empno, e.ename, s.grade
FROM emp e
JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal;


❓ 언제 'ON'과 'USING'을 선택해야할까 ❓

상황ON 절 사용USING 절 사용
공통 컬럼 이름이 다른 경우✅ 가능 (예: ON e.dept_id = d.department_id)❌ 사용할 수 없음
나조인 조건이 복잡한 경우✅ 가능 (예: ON e.deptno = d.deptno AND e.job = 'Manager')❌ 단순 컬럼 비교만 가능
중복 컬럼 제거를 원하는 경우❌ 중복 제거하려면 추가로 SELECT에서 처리해야 함조인 조건 컬럼이 결과에 한 번만 나타남
INNER JOIN, OUTER JOIN 사용 시✅ 모든 조인에서 사용 가능✅ INNER JOIN, OUTER JOIN에서만 사용 가능
컬럼 이름이 동일한 경우✅ 가능✅ 가능 (더 간결하게 작성 가능)


실습

1. 부서원이 없는 부서 조회

SELECT deptno, dname 
FROM dept 
WHERE deptno NOT IN 
      (SELECT DISTINCT deptno FROM emp WHERE deptno IS NOT NULL);

2. 부서를 배정받지 못한 직원 조회

SELECT e.empno, e.ename, e.deptno
FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno = d.deptno
WHERE d.deptno IS NULL;
profile
풀스택 개발자로서의 도전을 하는 중입니다. 많은 응원 부탁드립니다!!😁

0개의 댓글