쌓고 쌓다
[SQL] 내부 조인(INNER JOIN) 본문
내부 조인
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색 조건]
-> INNERT JOIN을 JOIN이라고만 써도 INNER JOIN으로 인식
예제
: 구매 테이블에서 GRL 아이디를 가진 사람의 이름/주소/연락처를 검색
SELECT * FROM buy INNER JOIN member ON buy.mem_id = member.mem_id WHERE buy.mem_id = 'GRL';
만약, WHERE buy.mem_id='GRL'을 생략하면 구매 테이블의 모든 행에 대하여
buy.mem_id = member.mem_id인 조건을 만족하면 결합하여 모두 출력해버린다.
SELECT * FROM buy INNER JOIN member ON buy.mem_id=member.mem_id;
내부 조인 SQL은 아래의 과정을 거친다.
- 구매 테이블의 mem_id(buy.mem_id)인 'GRL'을 추출.
- 'GRL'과 동일한 값을 회원 테이블의 mem_id(member.mem_id) 열에서 검색.
- 'GRL'이라는 아이디를 찾으면 구매 테이블과 회원 테이블의 두 행을 결합(JOIN).
내부 조인의 간결한 표현
아이디/이름/구매 물품/주소/연락처만 추출하려고 한다. 아래와 같은 SQL을 보자.
SELECT mem_id, prod_name, addr, CONCAT(phone1, phone2) '연락처'
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id;
실행했더니 아래와 같은 에러가 뜬다.
-> mem_id가 member 테이블에도 buy 테이블에도 있기에 어떤 mem_id를 가져와야 할지 모르기에 에러가 난다.
해결방법: 어떤 테이블의 mem_id를 가져올지 정확하게 작성하자.
SELECT buy.mem_id, prod_name, addr, CONCAT(phone1, phone2) '연락처'
FROM buy
INNER JOIN member
ON buy.mem_id = member.mem_id;
실행 결과
즉, SQL을 명확히 하기 위해서 SELECT 다음의 열 이름(컬럼 이름)에도 모두 테이블_이름.열_이름 형식으로 작성.
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;
코드는 명확해졌지만 오히려 복잡해 보인다.
이럴 때 FROM 뒤에 나오는 테이블의 이름에 별칭을 주어 간단히 표현한다.
USE market_db;
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 B.mem_id = M.mem_id;
주의 : 테이블의 이름을 별칭으로 사용하고, 일부만 원래 테이블의 이름을 사용했더니 원래 테이블을 못 알아봄.
중복된 결과 1개만 출력
구매 기록이 한 번이라도 있는 사람들의 리스트를 뽑아내고자 한다.
이때 중복된 이름은 필요 없으므로 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;
추가로, 구매한 회원의 구매 기록과 구매하지 않은 회원의 이름/주소가 같이 검색되도록 하고자 한다.
지금까지 사용한 내부 조인은 두 테이블 모두 데이터가 있어야 JOIN 된다.
만약, 한쪽이라도 내용이 있을 때 조인하려면 외부 조인을 사용해야 한다.
모든 내용은 "혼자 공부하는 SQL" 교재를 통해 학습한 후, 정리한 글입니다.
'프로그래밍 > SQL' 카테고리의 다른 글
[SQL] SQL 프로그래밍 ( IF, CASE, WHILE ) (0) | 2022.07.05 |
---|---|
[SQL] 외부 조인, 상호 조인, 자체 조인 (0) | 2022.07.01 |
[SQL] 테이터 형 변환 (0) | 2022.06.27 |
[SQL] 변수 사용 + LIMIT (0) | 2022.06.26 |
[SQL] 데이터 형식 (0) | 2022.06.26 |