📒 요약 : 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 조인을 활용하여 원하는 형테로 데이터를 가공할 수 있다. 내부 조인과 외부 조인, 그 외데오 상호 조인 등 자양한 종류의 조인이 있다.
두 테이블의 조인을 위해서는 테이블이 일대다 관계로 연결되어야 한다.
조인 중 가장 많이 사용하는 것이 내부 조인으로, 아래와 같은 형식을 따른다.
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색 조건]
예를 들어, 아래와 같은 구매 테이블(buy)와 회원 테이블(member)를 조인해보자.
구매 테이블에서 GRL이라는 아이디를 가진 사람이 구매한 물건을 발송하기 위해 다음과 같이 조인해서 이름/주소/연락처 등을 검색할 수 있다.
USE market_db;
SELECT *
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id
WHERE buy.mem_id = 'GRL';
그림3. 내부 조인 실행 결과
만약 아래와 같이 where절을 생략하면 구매 테이블의 모든 행이 회원 테이블과 결합된다.
USE market_db;
SELECT *
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id
그림4. where절을 생략한 조인 결과
SQL을 명확하게 작성하기 위하여 select 다음의 열 이름에 모두 테이블이름.열이름 형식으로 작성할 경우, 코드가 지나치게 복잡해지는 문제가 발생한다. 이를 방지하기 위해 별칭을 사용하는데, 다음과 같이 member 테이블의 별칭은 M, buy 테이블의 별칭은 B로 지정하여 활용할 수 있다.
SELECT buy.mem_id, member.mem_name, buy.prod_name, member.addr, CONCAT(member.phone1, member.phone2) '연락처'
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id;
SELECT B.mem_id, M.mem_name, B.prod_name, M.addr, CONCAT(M.phone1, M.phone2) '연락처'
FROM buy B
INNER JOIN member M
ON buy.mem_id = member.mem_id;
중복된 이름이 필요 없는 경우 DISTINCT 문을 활용하려 출력할 수 있다.
SELECT DISTINCT M.mem_id, M.mem_name, M.addr
FROM buy B
INNER JOIN member M
ON B.mem_id = M.mem_id;
ORDER BY M.mem_id;
그림5. 중복된 결과 1개만 출력하기
내부 조인은 두 테이블에 모두 데이터가 있어야만 결과가 나오는데, 외부 조인은 이와 달리 한쪽에만 데이터가 있어도 결과를 출력할 수 있다. 외부 조인의 기본 형식은 아래와 같다.
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT |RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인될 조건>
[WHERE 검색 조건];
LEFT OUTER JOIN문의 의미를 '왼쪽 테이블의 내용은 모두 출력되어야 한다' 정도로 기억해두자. 예를 들어, '전체 회원의 구매 기록(구매 기록이 없는 회원의 정보도 함께) 출력'하는 것을 왼쪽 외부 조인으로 만들어 보면 다음과 같다.
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM member M
LEFT OUTER JOIN buy B
ON M.mem_id = B.mem_id
ORDER BY M.mem_id;
그림6. LEFT OUTER JOIN 출력 결과
RIGHT OUTER JOIN은 LEFT OUTER JOIN과 방향만 다른 것이다. 다시 말해, RIGHT OUTER JOIN문의 의미를 '왼쪽 테이블의 내용은 모두 출력되어야 한다' 로 생각하면 된다. RIGHT OUTER JOIN으로 위의 그림과 동일한 결과를 출력하려면 다음과 같이 왼쪽과 오른쪽 테이블의 위치만 바꿔주면 된다.
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM buy B
RIGHT OUTER JOIN member M
ON M.mem_id = B.mem_id
ORDER BY M.mem_id;
FULL OUTER JOIN은 왼쪽 외부 조인과 오른쪽 외부 조인이 합쳐진 것으로, 왼쪽이든, 오른쪽이든 한쪽에 들어 있는 내용이면 출력한다.
내부 조인과 외부 조인처럼 자주 사용되지는 않지만, 가끔 유용하게 사용되는 조인으로, 상호 조인과 자체 조인이 있다.
한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시킨다. 상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 수를 곱한 것과 같다. CROSS JOIN으로 조인할 수 있다. 아래의 예시를 살펴보자.
SELECT *
FROM buy
CROSS JOIN member;
그림7. CROSS JOIN 출력 결과
상호 조인은 다음과 같은 특징을 갖는다.
- ON 구문을 사용할 수 없다.
- 결과의 내용은 의미가 없다. 랜덤으로 조인하기 때문이다. (ex. BLK를 에핑크 잇지, 소녀시대 등과도 조인한다.)
- 상호 조인의 주 용도는 테스트하기 위해 데용량의 데이터를 생성하는 것이다.
내부 조인, 외부 조인, 상호 조인은 모두 2개의 테이블을 조인한다. 반면 자체 조인은 1개의 테이블을 가지고 조인한다. 기본 형식은 아래와 같다.
SELECT <열 목록>
FROM <테이블> 별칭A
INNER JOIN <테이블> 별칭B
ON <조인될 조건>
[WHERE 검색 조건];