본문 바로가기

Study/SQL

JOIN

지금까지 하나의 테이블을 다루는 작업을 진행했다면, 이제부터는 두 개의 테이블을 묶어볼 것이다. 이렇게 두 테이블을 묶어 하나의 결과를 만들어 내는 것을 조인(join)이라고 한다.  

 

INNER JOIN

우리가 조인이라 부르는 것은 대부분 내부 조인을 의미한다. 

일대다 관계(1 : N)

한쪽 테이블에는 하나의 값만 존재해야 하지만, 연결된 다른 테이블에는 여러 개의 값이 존재할 수 있는 관계를 일대다 관계라고 말한다. 여기서 회원테이블의 아이디를 PK, 구매 테이블의 아이디를 FK로 설정하여 두 테이블의 조인을 맺을 수 있다.(PK-FK 관계)

이너 조인의 기본 형식은 다음과 같다.

SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블>
    ON <조인될 조건>
[WHERE 검색 조건];

구매 테이블에서 GRL 아이디를 가진 사람이 구매한 물건을 검색하려면 다음과 같이 구문을 작성할 수 있다. 이 때 동일한 열 이름이 존재한다면 테이블_이름.열_이름 으로 표기해야 한다. 

USE maket_db;
SELECT *
	FROM buy
        INNER JOIN 
        ON buy.mem_id = member.mem_id -- PK-FK 연결
    WHERE buy.mem_id = 'GRL';

만약 모든 열을 추출하지 않고, 원하는 열만 추출하려면 어떻게 해야할까? 

SELECT buy.mem_id, mem_name, prod_name, addr, CONCAT(phone1, phone2) '연락처'
	FROM buy
    	INNER JOIN member
        ON buy.mem_id = member.mem_id;

이 때도, 동일한 열 이름이 있기 때문에 어느 테이블의 mem_id를 추출할지 명확하게 작성해야 한다. 테이블_이름.열_이름 형식으로 작성하게 되면 명확하게 열을 추출할 수는 있지만, 코드가 너무 복잡해진다는 단점이 존재한다. 이럴 때 별칭을 사용할 수 있다. 

SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
	FROM buy B
    		INNER JOIN member M
		ON B.mem_id = M.mem_id
	ORDER BY M.mem_id;

중복된 결과를 제외하고 싶다면 DISTINCT문을 사용할 수 있다. 하지만 내부 조인은 두 테이블에 모두 있는 내용만 출력을 한다. 따라서 한쪽에만 데이터가 있어도 그 결과값이 알고 싶다면 외부 조인을 사용해야 한다. 

 

OUTER JOIN

SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
	<LEFT/RIGHT/FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
    ON <조인될 조건>
[WHERE 검색 조건];
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
	FROM member M
    	LEFT OUTER JOIN buy B
		ON B.mem_id = M.mem_id
	ORDER BY M.mem_id;

본격적으로 외부 조인을 활용해보자. 회원으로 가입만 하고, 한 번도 구매한 적이 없는 회원의 목록을 추출할 수 있다. 

SELECT DISTINCT M.mem_id, M.mem_name, B.prod_name, M.addr
	FROM member M
    	LEFT OUTER JOIN buy B
		ON B.mem_id = M.mem_id
    WHERE B.prod_name IS NULL
	ORDER BY M.mem_id;

FULL OUTER JOIN은 왼쪽 외부 조인과 오른쪽 외부 조인이 합쳐진 형태이다. 

 

CROSS JOIN은 한쪽 테이블의 모든 행과 다른쪽 테이블의 모든 행을 조인시키는 기능이다. 상호 조인의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 것이 된다. (cartesian product)

SELECT *
	FROM buy
    CROSS JOIN member;

'Study > SQL' 카테고리의 다른 글

MySQL 데이터의 형식  (0) 2022.07.31
COMPANY DB SQL문  (0) 2022.07.20
SQL 기본 문법  (0) 2022.07.16