이 글은 MySQL에서 여러 테이블 결합에 사용하는 INNER JOIN의 다양한 문법과 예시를 담고 있습니다.
*관계형 데이터베이스, JOIN 관련 글 MySQL 관계형 데이터베이스(RDB), 테이블 JOIN 기초 설명 예시
*다중 내부 조인 관련 글 MySQL 다중 내부 조인(INNER JOIN 여러 개) 문법, 예시
MySQL JOIN과 INNER JOIN(내부 조인)
JOIN은 공통키를 가진 여러 테이블을 결합하여, 흩어졌던 데이터를 한 테이블에 표현합니다.
이는 내부 조인과 외부 조인으로 나뉘며, 내부조인은 JOIN의 default입니다.
때문에 INNER JOIN = JOIN으로 생각합니다.
INNER JOIN은 결합한 테이블들의 교집합을 한 테이블에 표현합니다.
공통키를 기준으로, A와 B가 동시에 갖고 있는 값만 보여줍니다.
*이에 대한 내용은 본 글의 예시에서 확실히 이해할 수 있습니다.
INNER JOIN(내부 조인) 다양한 문법
내부 조인은 어떤 테이블의 컬럼인지 구분하고자, '테이블명.컬럼명' 형식으로 입력합니다.
INNER JOIN ON
SELECT 테이블명1.컬럼명2, 테이블명2.컬럼명2
FROM 테이블명1
INNER JOIN 테이블명2
ON 테이블명1.공통키=테이블명2.공통키;
FROM WHERE
WHERE 조건절에 테이블들의 공통키를 조건으로 걸어, INNER JOIN ON과 같은 산출물을 냅니다.
SELECT 테이블명1.컬럼명1, 테이블명2.컬럼명2
FROM 테이블명1, 테이블명2
WHERE 테이블명1.공통키=테이블명2.공통키;
ALIAS(별칭, AS)
여러 테이블 조인 시, 테이블명 오타 방지 및 가독성, 가시성을 위해 별칭을 많이 사용합니다.
이때 별칭은 AS 입력 대신 띄어쓰기도 가능합니다.
*별칭 관련 글 MySQL 별칭 ALIAS 사용 방법, 규칙, 차이점
SELECT 별칭1.컬럼명1, 별칭2.컬럼명2
FROM 테이블명1 AS 별칭1, 테이블명2 AS 별칭2
WHERE 별칭1.공통키=별칭2.공통키;
SELECT 별칭1.컬럼명1, 별칭2.컬럼명2
FROM 테이블명2 별칭1 INNER JOIN 테이블명2 별칭2
ON 별칭1.공통키=별칭2.공통키;
INNER 생략
INNER JOIN은 JOIN의 디폴트(default)이기에, INNER를 생략할 수 있습니다.
SELECT 별칭1.컬럼명1, 별칭2. 컬럼명2
FROM 테이블명1 별칭1
JOIN 테이블명2 별칭2
ON 별칭1.공통키=별칭2.공통키;
SELECT문 테이블명 생략
'테이블명.컬럼명'입력이 기본이지만 SELECT문에서는 예외가 있습니다.
만약 테이블들의 컬럼명에 중복이 없으면, SELECT문은 테이블명 생략이 가능합니다.
SELECT 별칭1.컬럼명1, 별칭2.컬럼명2, 컬럼명3
FROM 테이블명1 별칭1
INNER JOIN 테이블명2 별칭2
ON 별칭1.공통키=별칭2.공통키;
INNER JOIN(내부 조인) 예시
분리된 두 개의 테이블(cust_info, order)은 공통되면서도 상이한 회원 정보를 갖고 있습니다.
모든 회원 데이터를 한 테이블에서 볼 수 없을까요? 공통키가 있다면 가능합니다.
*두 테이블은 공통키(아이디)를 갖고 있기에, 조인이 가능합니다.
cust_info | ||
아이디 | 연락처 | 성별 |
72 | 01011112222 | F |
10 | 01033334444 | M |
204 | 01055556666 | M |
526 | 01077778888 | F |
cust_order | |
아이디 | 주문제품번호 |
10 | F12 |
526 | F844 |
SELECT cust_info.아이디, cust_info.연락처, cust_info.성별, cust_order.주문제품번호
FROM cust_info, cust_order
WHERE cust_info.아이디=cust_order.아이디;
두 테이블의 INNER JOIN 산출물은 다음과 같습니다.
여기에서 INNER JOIN의 특징인 '동시에 갖고 있는 값 반환'이 나타납니다.
테이블 cust_info는 4행, cust_order는 2행이며, 공통키(아이디)에서 동시에 갖는 값은 아이디10, 526입니다.
따라서 교집합(아이디 10,526) 데이터만 반환값이 됩니다.
아이디 | 연락처 | 성별 | 주문제품번호 |
10 | 01033334444 | M | F12 |
526 | 01077778888 | F | F844 |
위와 같은 산출물을 내되, 별칭(AS)으로 더 깔끔하게 입력할 수 있습니다.
SELECT ci.아이디, ci.연락처, ci.성별, co.주문제품번호
FROM cust_info ci, cust_order co
WHERE ci.아이디=co.아이디;
SELECT ci.아이디, ci.연락처, ci.성별, co.주문제품번호
FROM cust_info ci
JOIN cust_order co
ON ci.아이디=co.아이디;
산출물을 보면 cust_info 테이블은 모든 컬럼, cust_order 테이블은 주문제품번호만 필요합니다.
그러므로 *별표(=모든)를 이용하여, 더 깔끔하게 입력할 수도 있습니다.
SELECT ci.*, co.주문제품번호
FROM cust_info ci, cust_order co
WHERE ci.아이디=co.아이디;
테이블 간 중복 없는 컬럼명(연락처 or 성별 or 주문제품번호)을 대상으로,
SELECT문의 테이블명을 생략해도 산출물은 같습니다.
SELECT ci.아이디, 연락처, 성별, 주문제품번호
FROM cust_info ci
JOIN cust_order co
ON ci.아이디=co.아이디;
'SQL > MySQL' 카테고리의 다른 글
MySQL 외부 조인(LEFT, RIGHT, FULL JOIN, UNION, UNION ALL) 문법 예시 (0) | 2023.09.15 |
---|---|
MySQL 다중 내부 조인(INNER JOIN 여러 개) 문법, 예시 (2) | 2023.09.14 |
MySQL 집계 함수, GROUP BY와 HAVING 사용 방법 (0) | 2023.09.11 |
MySQL COUNT 함수 특정 값 개수 세기 (0) | 2023.09.08 |
MySQL 조건문 CASE WHEN, 조건 여러 개(AND, OR) (0) | 2023.09.06 |