DB + SQL

[SQL] - SQL Join 정리

dev_SiWoo 2020. 8. 25. 11:47

1. Cross Join : 무식하게 다 1:1로 매핑한거라 잘안씀

SELECT * FROM emp, dept;

emp 테이블의 컬럼이 14, dept 테이블의 컬럼이 5 > 14*5=70개의 row가 출력됨

SELECT * FROM EMP JOIN DEPT 이 구문과 동일하다

 

 

2. Equi Join(등가조인) : 두개의 테이블을 같은 키를 조건으로 사용하여 조인

SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno

 

3. Non-Equi Join (비등가조인) :  등가조인이 아닌 조인

예제1. 포인트 상품으로 외장하드를 받을 수 있는 회원의 이름, 포인트 출력하라

SELECT g.name, g.point
   FROM guest AS g JOIN pointitem AS pi
   ON  g.point >= PI.spoint AND PI.name = '외장하드'; # 방법1

위 구문을 보면 guest 테이블과 pointitem 테이블을 조인하였는데 같은 키를 이용해서 조인을 한 것이 아니라 서로다른 컬럼을 조건으로 사용하여 조인을 하여다. 이러한 조인 구문을 비등가 조인(Non-Equi join)이라한다.

 

 

4. Self Join : 같은 테이블을 조인 (반드시 alias를 사용해야함)

위와 같이 emp 테이블에서 ename(직원명), mgr(직속상사) 컬럼이 있는데 다음과 같은 예제를 풀어보자

 

예제2. 직원명과 직속상사명을 출력하라

SELECT e1.ename AS 직원명, e2.ename AS 직속상사명
   FROM emp AS e1 JOIN emp AS e2
   ON e1.mgr = e2.empno; 
SELECT ename

위와 같이 문제를 해결할 경우 무엇이 문제가 될까?

 

'서민구'라는 대표이사도 회사 대표긴 하지만 직원이다. 그런데 대표이사이기 때문에 직속상사가 없어서 mgr컬럼이 null 값이기 때문에 조인구문에 포함되지 않아서 출력이 되지않는다.

 

직속상사가 없을 경우 그냥 null 값도 출력하도록 하게 하려면 아래와 같이 left join을 사용한다.

 

5. Left Join : 왼쪽 컬럼을 기준으로 조회 (right join은 오른쪽 컬럼을 기준으로 조인)

SELECT e1.ename AS 직원명, e2.ename AS 직속상사명
   FROM emp AS e1 left JOIN emp AS e2
   ON e1.mgr = e2.empno; # 이렇게 left 조인을하면된다.