쌓고 쌓다

[SQL] 내부 조인(INNER JOIN) 본문

프로그래밍/SQL

[SQL] 내부 조인(INNER JOIN)

승민아 2022. 7. 1. 14:24

내부 조인

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은 아래의 과정을 거친다.

  1. 구매 테이블의 mem_id(buy.mem_id)인 'GRL'을 추출.
  2. 'GRL'과 동일한 값을 회원 테이블의 mem_id(member.mem_id) 열에서 검색.
  3. '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
Comments