JOIN이란 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다.
예를 들면, 회원 테이블에는 회원의 이름과 연락처 등의 정보가 있고 구매 테이블에는 회원이 구매한 물건이 있는 경우
물건을 배송하려면 회원 이름과 연락처, 구매 테이블의 회원이 구매한 물건에 대한 정보가 함께 필요하다. 이러한 경우 두 테이블을 엮어서 하나의 배송을 위한 정보를 추출하는 것이 대표적인 JOIN의 사용 예시이다.
주로 사용되는 것이 INNER JOIN이며 보통 JOIN이라 부르는 것은 INNER JOIN을 의미한다.
두 테이블의 조인을 위해서는 테이블이 일대다 관계로 연결되어야 한다.
DB에서 테이블은 하나의 거대한 테이블보다 주제에 따라 여러 테이블로 분리해서 저장하는 것이 효율적이다.
이러한 분리된 테이블은 서로 관계를 맺고 있으며 위의 예시에서 회원 테이블의 ID를 기본키(PRIMARY KEY)로 지정한다.
구매 테이블의 아이디에서는 여러 회원 ID를 찾을 수 있으며 이는 곧 PK가 아닌 외래키(FOREIGN KEY)로 지정한다.
이러한 경우와 같이 기본키 - 외래키 관계인 경우 일대다 관계라고 부르고 내부조인을 실행할 수 있다.
꼭 기본키 - 외래키 관계가 아니어도 가능한 상호JOIN도 있다.
일반적으로 JOIN이라고 하면 대부분 INNER JOIN을 말하므로 JOIN 중 가장 많이 사용한다.
JOIN은 3개 이상의 테이블로도 할 수 있지만 대부분은 2개로 JOIN하므로 2개에 대해서 기본 틀을 잡는다.
SELECT 열목록
FROM 첫번째 테이블
JOIN 두번째 테이블
ON 조인될 조건
WHERE 검색 조건
JOIN의 경우 MYSQL은 INNER JOIN 이라는 키워드와 JOIN 키워드 모두 사용 가능하지만 ORACLE의 경우 JOIN 키워드만 사용할 수 있다.
물론 MYSQL에서 JOIN 키워드를 사용하는 경우 INNER JOIN으로 인식된다.
구매 테이블에는 물건을 구매한 회원의 아이디와 물건 등의 정보만 있다.
이 물건을 배송하기 위해서는 구매한 회원의 주소 및 연락처를 알아야 하는데, 이 회원의 주소, 연락처를 알기 위해 정보가 있는 회원 테이블과 결합하는 것이 내부 조인이다.
SELECT * FROM BUY
INNER JOIN MEMBER
ON BUY.ID = MEMBER.ID
WHERE BUY.ID = 'AD';
INNER JOIN을 하는 SQL은 아래와 같은 과정을 거친다.
1. ID를 추출
2. 동일한 ID를 검색
3. 두 행을 결합
만약 위의 프레임에서 검색조건(WHERE)을 생략하는 경우 모든 행이 회원 테이블과 결합한다.
양쪽 테이블에 모두 같은 이름의 열이 있는 경우(PK, FK 포함) 확실하게 어떤 열을 추출할지 지정해줘야 한다.
SELECT BUY.ID, NAME, PROD_NAME, ADDR, CONCAT(PHONE1, PHONE2)
FROM BUY
INNER JOIN MEMBER
ON BUY.ID = MEMBER.ID
보통은 각 열이 어느 테이블에 속하는지 명확하게 표현하고 그 뒤 별칭을 사용해 줄이는 방식으로 활용한다.
여러 테이블을 JOIN하는 경우 아래와 같은 방식으로 사용할 수 있다.
SELECT * FROM BUY B
INNER JOIN MEMBER M
ON B.ID = M.ID
ORDER BY M.ID;
기존 INNER JOIN에서는 구매한 기록이 있는 회원만 조회 가능했고 전체 회원은 조회할 수 없었다.
이러한 경우처럼 양쪽 중 한곳이라도 내용이 있을 때 JOIN하려면 외부 JOIN을 사용해야 한다.
외부 조인은 두 테이블을 JOIN하는 경우 필요한 내용이 한쪽 테이블에만 있어도 결과를 추출할 수 있다.
SELECT 열목록
FROM <LEFT TABLE>
<LEFT | RIGHT | FULL> OUTER JOIN <RIGHT TABLE>
ON 조건
WHERE 검색조건;
LEFT OUTER JOIN 문의 의미는 'LEFT TABLE의 내용은 모두 출력되어야 한다.'로 해석할 수 있으며 RIGHT OUTER JOIN은 그 반대로 사용할 수 있다.
(예시에서 LEFT와 RIGHT의 위치만 바꿔주면 된다.)
ORACLE에서는 FULL JOIN 기능이 없다.
이 점을 항상 유의해서 SQL문의 호환성을 확인하고 작성해야한다.
INNER JOIN으로 구매한 기록이 있는 회원들의 목록만 추출할 수 있었다면, 반대로 회원 가입만 하고 구매기록이 없는 회원의 목록 추출은 아래와 같이 진행할 수 있다.
SELECT DISTINCT M.ID, B.PROD_NAME, M.NAME, M.ADDR
FROM MEMBER M
LEFT OUTER JOIN BUY B
ON M.ID = B.ID
WHERE B.PROD_NAME IS NULL
ORDER BY M.ID;
구매 기록이 없으므로 JOIN된 결과의 물건 이름은 당연히 NULL이어야 한다.
여기서 IS NULL 구문은 NULL값인지 비교를 하는 역할을 한다.
또한 FULL OUTER JOIN은 LEFT OUTER JOIN, RIGHT OUTER JOIN이 합쳐진 것이라고 생각하면 된다.
즉, 왼쪽이나 오른쪽이나 한쪽에 들어 있는 내용이면 출력을 진행한다.
INNER JOIN, OUTER JOIN과 같이 자주 사용되지는 않으나 유용하게 사용되는 JOIN으로는 상호JOIN과 자체JOIN도 있다.
상호 JOIN은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 JOIN 시키는 기능이다.
그래서 상호 JOIN 결과의 행 개수는 두 테이블의 각 행의 개수를 곱한 개수가 된다.
CROSS JOIN은 아래와 같은 특징을 가진다.
진짜 대용량의 테이블을 만드는 경우 CREATE TABLE ~ SELECT 문을 사용한다.
이후 테이블 내에서 CROSS JOIN을 진행하면 대용량의 테스트 데이터를 생성할 수 있다.
(물론, 데이터 내용에는 의미가 없다.)
INNER, OUTER, CROSS JOIN은 모두 2개 이상의 테이블을 JOIN하는데 반해 SELF JOIN은 자신이 자신과 JOIN한다.
그래서 SELF JOIN은 1개의 테이블만 사용하며, 별도의 문법이 있는게 아닌 1개로 JOIN하면 SELF JOIN으로 취급이 된다.
SELECT 열 목록
FROM 테이블 ALIa
JOIN 테이블 ALIb
ON 조인될 조건
WHERE 검색 조건