우리는 SQL을 통해 Schema를 설계할 때, 당연하게도 정규화를 하게 된다.
정규화를 하게 된 Table들은 서로 관계를 갖고 따로 분리되게 되는데,
이런 Table들을 다시 엮어 정보를 가져오는 것이 JOIN 이다.
JOIN에 대해서 한 번 알아보자.
CROSS JOIN
CROSS JOIN은 두 Table의 모든 Tuple 조합을 다 Join한다.
아래와 같이 아무 조건 없이 Join을 걸어서 사용을 할 수 있다.
그러나, 모든 조합을 다 Join하기 때문에 Table이 뻥튀기 될 위험이 있다.
EQUI & NON-EQUI
우선, EQUI와 NON-EQUI JOIN 으로 JOIN을 분류해보자.
EQUI JOIN 은 어떤 Column에 같은 값이 존재할 때 =
연산자를 통해 JOIN한다.
해당 기능은 양쪽에 다 존재하는 값만 테이블로 만들어 출력한다.
NON-EQUI JOIN 은 =
연산자가 아닌, 범위 연산자를 통해 JOIN한다.
서로 다른 값을 가지거나, 상대편 테이블의 Data 범위 내의 Data만 출력한다.
INNER JOIN
INNER JOIN 은 걸려있는 조건에 대하여 동일한 값이 있는 행만 반환한다.
즉, EQUI JOIN + NON-EQUI JOIN 이다.
EQUI와의 차이는, JOIN
명령어를 직접 명시하며, WHERE
이 빠진다.
WHERE
대신에 USING
이나 ON
절이 들어가게 된다.
- 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에서만 사용 가능하다.
- FROM 절에 USING 조건 절을 붙여 편하게 JOIN이 가능하다.
- 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 절로 검색하는 것을 권장한다.
- Column 명이 다르더라도 JOIN 조건을 사용할 수 있다.
OUTER JOIN
OUTER JOIN 은 한 쪽 Table을 기준으로 잡고 JOIN을 하는 방식이다.
기준 Table의 모든 값을 먼저 읽고, 이후 상대 Table과 비교하여 JOIN한다.
- LEFT : 왼쪽 Table을 기준으로, 오른쪽 Table을 JOIN 한다.
- RIGHT : 오른쪽 Table을 기준으로, 왼쪽 Table을 JOIN 한다.
- FULL : LEFT, RIGHT의 결과를 UNION한 Table을 출력한다.