지금까지 하나의 테이블을 다루는 작업을 진행했다면, 이제부터는 두 개의 테이블을 묶어볼 것이다. 이렇게 두 테이블을 묶어 하나의 결과를 만들어 내는 것을 조인(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 |