우리는 SQL을 통해 Schema를 설계할 때, 당연하게도 정규화를 하게 된다.
정규화를 하게 된 Table들은 서로 관계를 갖고 따로 분리되게 되는데,
이런 Table들을 다시 엮어 정보를 가져오는 것이 JOIN 이다.
JOIN에 대해서 한 번 알아보자.

CROSS JOIN

CROSS JOIN은 두 Table의 모든 Tuple 조합을 다 Join한다.
아래와 같이 아무 조건 없이 Join을 걸어서 사용을 할 수 있다.
그러나, 모든 조합을 다 Join하기 때문에 Table이 뻥튀기 될 위험이 있다.

SELECT EMP.NAME AS 사원이름, DEP.EMAIL AS 이메일 문의 주소
FROM EMPLOYEE EMP, DEPT DEP
WHERE EMP.TEAM_NAME = DEP.TEAM_NAME;

EQUI & NON-EQUI

우선, EQUI와 NON-EQUI JOIN 으로 JOIN을 분류해보자.
EQUI JOIN 은 어떤 Column에 같은 값이 존재할 때 = 연산자를 통해 JOIN한다.
해당 기능은 양쪽에 다 존재하는 값만 테이블로 만들어 출력한다.

SELECT EMP.NAME AS 사원이름, DEP.EMAIL AS 이메일 문의 주소
FROM EMPLOYEE EMP, DEPT DEP
WHERE EMP.TEAM_NAME = DEP.TEAM_NAME;

NON-EQUI JOIN= 연산자가 아닌, 범위 연산자를 통해 JOIN한다.
서로 다른 값을 가지거나, 상대편 테이블의 Data 범위 내의 Data만 출력한다.

SELECT EMP.NAME AS 사원이름, EMP.POINT AS 사원포인트, G.GIFTNAME AS 상품명
FROM EMPLOYEE EMP, GIFT G
WHERE EMP.POINT BETWEEN G.POINT_FROM AND G.POINT_TO;

INNER JOIN

INNER JOIN 은 걸려있는 조건에 대하여 동일한 값이 있는 행만 반환한다.
즉, EQUI JOIN + NON-EQUI JOIN 이다.

EQUI와의 차이는, JOIN 명령어를 직접 명시하며, WHERE 이 빠진다.
WHERE 대신에 USING 이나 ON 절이 들어가게 된다.

SELECT EMP.NAME AS 사원이름, DEP.EMAIL AS 이메일 문의 주소
FROM EMPLOYEE EMP INNER JOIN DEPT DEP
ON EMP.TEAM_NAME = DEP.TEAM_NAME;

SELECT EMP.NAME AS 사원이름, EMP.POINT AS 사원포인트, G.GIFTNAME AS 상품명
FROM EMPLOYEE EMP INNER JOIN GIFT G
ON EMP.POINT BETWEEN G.POINT_FROM AND G.POINT_TO;
  • Natural JOIN?
    • 두 Table 간의 동일한 이름을 갖는 모든 Column에 대해 EQUI JOIN을 한다.
    • USIGN이나 ON 을 사용할 수 없다.
    • SQL Server에서는 지원하지 않고, Oracle에서만 사용이 가능하다.
  • USING?
    • FROM 절에 USING 조건 절을 붙여 편하게 JOIN이 가능하다.
      • 단, Column 명이 해당 Column으로 동일해야한다.
      • FROM DEPT JOIN DEPT_TEMP USING(DEPTNO);
      • 위와 같이 Query를 짜면, 자동으로 양 테이블의 DEPTNO가 JOIN된다.
    • USING 절에는 ALIAS를 붙일 수 없다.
    • SQL Server에서는 지원하지 않고, Oracle에서만 사용 가능하다.
  • ON?
    • Column 명이 다르더라도 JOIN 조건을 사용할 수 있다.
      • FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO
    • WHERE 절과 혼용해서 사용이 가능하다.
      • ON E.DEPTNO = D.DEPTNO WHERE E.DEPTNO = 30;
      • ON 조건 절로 검색을 할 수 있지만, WHERE 절로 검색하는 것을 권장한다.

OUTER JOIN

OUTER JOIN 은 한 쪽 Table을 기준으로 잡고 JOIN을 하는 방식이다.
기준 Table의 모든 값을 먼저 읽고, 이후 상대 Table과 비교하여 JOIN한다.

  • LEFT : 왼쪽 Table을 기준으로, 오른쪽 Table을 JOIN 한다.
  • RIGHT : 오른쪽 Table을 기준으로, 왼쪽 Table을 JOIN 한다.
  • FULL : LEFT, RIGHT의 결과를 UNION한 Table을 출력한다.