JOIN이란 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다.
두 테이블을 연결할 때 가장 많이 사용되는 것이 내부 조인이다. 일반적으로 그냥 조인이라 부르면 내부 조인을 의미한다.
두 테이블을 조인하기 위해서는 테이블이 일대다(one to many) 관계로 연결되어 있어야 한다.
일대다 관계란 한쪽 테이블에는 하나의 값만 존재해야 하지만, 연결된 다른 테이블에는 여러 개의 값이 존재할 수 있는 관계를 말한다.
일대다 관계는 주로 기본 키(PK)와 외래 키(FK)의 관계로 맺어져 있기 때문에 'PK-FK 관계'라고 부르기도 한다.
USE market_db;
SELECT *
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id
WHERE buy.mem_id = 'GRL';
아래와 같이 작성하면 오류가 발생하는데, 그 이유는 mem_id는 두 테이블 모두가 가지고 있는 열이기 때문에 의미가 모호하기 때문이다.
SELECT mem_id, mem_name, prod_name, addr, CONCAT(phone1, phone2) AS '연락처'
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id;
따라서 다음과 같이 수정해주면 해결된다.
SELECT buy.mem_id, mem_name, prod_name, addr, CONCAT(phone1, phone2) AS '연락처'
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id;
실질적으로는 아래와 같이 선택한 모든 열에 대해 그것이 속한 테이블을 밝혀주는 것이 일반적이지만 이렇게 할 경우 코드가 상당히 길어진다.
SELECT buy.mem_id, member.mem_name, buy.prod_name, member.addr, CONCAT(member.phone1, member.phone2) AS '연락처'
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) AS '연락처'
FROM buy B
INNER JOIN member M
ON B.mem_id = M.mem_id;
내부 조인은 위와 같이 두 테이블에 모두 포함되는 요소만 출력해주기 때문에 누락되는 데이터가 생기게 된다.
외부 조인은 두 테이블을 조인할 때 필요한 내용이 한쪽 테이블에만 있어도 결과를 추출할 수 있다.
자주 사용되는 방식은 아니지만 참고로 알아두면 좋을 것 같다.
아래 예제는 LEFT OUTER JOIN이므로 member 테이블의 값은 모두 출력된다.
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;
기타 조인 방법으로 내부 조인이나 외부 조인만큼 자주 사용되지는 않지만 가끔 유용하게 사용되는 조인으로 상호 조인과 자체 조인이 있다.
상호 조인은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능을 말한다. 따라서 상호 조인 결과의 전체 행의 개수는 두 테이블의 각 행의 개수를 곱한 개수가 된다.
상호 조인은 ON 구문을 사용할 수 없으며 보통 의미 없는 대용량 데이터를 생성하고자 할 때 사용하는 조인이다.
SELECT * FROM buy CROSS JOIN member;
자체 조인은 자신이 자신과 조인한다는 의미이다. 따라서 자체 조인은 1개의 테이블을 사용한다.
자체 조인은 테이블이 1개이기 때문에 다음과 같이 서로 다른 별칭을 사용하여 서로 다른 것처럼 사용하면 된다.
SELECT <열 목록>
FROM <테이블> 별칭A
INNER JOIN <테이블> 별칭B
ON <조인될 조건>
[WHERE 검색 조건]
'📟 Database > 혼자 공부하는 SQL' 카테고리의 다른 글
[MySQL] 9. GUI 환경에서 테이블 생성하기, SQL로 테이블 만들기 (0) | 2022.04.08 |
---|---|
[MySQL] 8. SQL 프로그래밍(IF문, CASE문, WHILE문, 동적SQL) (0) | 2022.04.07 |
[MySQL] 6. MySQL의 데이터 형식(정수형, 문자형, 실수형, 날짜형)과 형 변환 (0) | 2022.04.06 |
[MySQL] 5. 데이터 변경을 위한 SQL 문(INSERT, UPDATE, DELETE) (0) | 2022.04.06 |
[MySQL] 4. SQL SELECT 절의 형식(ORDER BY 절과 GROUP BY 절) (0) | 2022.04.06 |