관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

SQL 고급 문법 3 - 두 테이블을 묶는 조인 1 : 내부 조인에 대하여 본문

알고리즘 및 자료 관리/SQL

SQL 고급 문법 3 - 두 테이블을 묶는 조인 1 : 내부 조인에 대하여

huenuri 2024. 10. 21. 06:22

지난번에 공부하려던 단원인데 오늘 드디어 해본다. 어제는 영상을 시청하며 SQL을 가볍게 공부하며 복습하는 시간으로 보냈다. 이번주부터는 정말 열심히 공부에 몰입할 생각이다.

벌써 새벽 공부할 시간이 얼마 남지 않았지만 이 단원까지는 마쳐볼 것이다.

 

지금까지 하나의 테이블을 다루는 작업을 위주로 공부했다. 이를 기반으로 지금부터는 두 개의 테이블이 서로 관계되어 있는 상태를 고려해서 학습을 진행하겠다.

 

시작하기 전에

조인이란 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다. 두 테이블을 엮어야만 원하는 형태가 나오는 경우도 많다. 인터넷 마켓 데이터베이스의 회원 테이블과 구매 테이블을 예로 들 수 있다.

 

물건을 배송하려면 회원 테이블의 회원 이름과 연락처, 구매 테이블의 회원이 구매한 물건에 대한 정보가 함께 필요하다. 이렇게 두 테이블을 엮어서 하나의 배송을 위한 정보를 추출하는 것이 대표적인 조인이다.

 


 

 

 

 

내부 조인

두 테이블을 연결할 때 가장 많이 사용되는 것이 내부 조인이다. 그냥 조인이라 부르면 내부 조인을 의미하는 것이다.

 

일대다 관계의 의미

두 테이블의 조인을 위해서는 테이블이 일대다 관계로 연결되어야 한다. 데이터베이스의 테이블은 하나로 구성되는 것보다는 여러 정보를 주제에 따라 분리해서 저장하는 것이 효율적이다. 이 분리된 테이블은 서로 관계를 맺고 있다. 

다음 그림과 같이 market_db에서 회원 테이블의 아이디와 구매 테이블의 아이디는 일대다 관계이다. 일대다 관계란 한쪽 테이블에서는 하나의 값만 존재해야 하지만, 연결된 다른 테이블에는 여러 개의 값이 존재할 수 있는 관계를 말한다.

 

이때 회원 테이블의 아이디를 기본 키로 지정한다. 구매 테이블의 아이디에서는 3개의 BLK를 찾을 수 있다., 즉 회원은 1명이지만 이 회원은 구매를 여러 번 할 수 있다. 그래서 구매 테이블의 아이디는 기본 키가 아닌 외래 키로 설정했다.

 


 

 

 

내부 조인의 기본

일반적으로 조인이라고 부르는 것은 내부 조인을 말하는 것으로, 조인 중에서 가장 많이 사용된다. 조인은 3개 이상의 테이블로도 할 수 있지만 대부분은 2개로 조인한다. 내부 조인의 형식은 다음과 같다.

SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블>
    ON <조인될 조건>
[WHERE 검색 조건]

 

구매 테이블에는 물건을 구매한 회원의 아이디와 아이디와 물건 등의 정보만 있다. 이 물건을 배송하기 위해 서는 구매한 회원의 주소 및 연락처를 알아야 한다.

 

 

동일한 열 이름이 존재한다면 꼭 테이블_이름.열_이름 형식으로 표기해야 한다. 

 

 

 

  1. 구매 테이블의 mem_id(buy.mem_id)인 'GRL'을 추출한다.
  2. 'GRL'과 동일한 값을 회원 테이블의 mem_id(member.mem_id) 열에서 검색한다.
  3. 'GRL'이라는 아이디를 찾으면 구매 테이블과 회원 테이블의 두 행을 결합한다.

만약 WHERE by.mem_id = 'GRL'을 생략하면 어떻게 될까?

 

 

1번째 BLK부터 12번째 MMU까지 구매 테이블의 모든 행이 회원 테이블과 결합한다.


 

 

 

내부 조인의 간결한 표현

이번에는 필요한 아이디/이름/구매 물품/주소/연락처만 추출해 보겠다.

 

 

회원 아이디는 회원 테이블, 무매 테이블에 모두 들어있어서 어느 테이블의 mem_id인지 헷갈린다는 의미이다. 이럴 때는 어느 테이블의 mem_id를 추출할지 정확하게 작성해야 한다. 

 

 

 

좀 더 명확히 하기 위해 SELECT 다음의 열 이름에도 모두 테이블_이름.열_이름 형식으로 작성해 보았다.

 

 

하지만 이렇게 하니 어느 테이블에 속한 것인지는 명확해졌지만 코드가 너무 복잡하다. 이럴 때 별칭을 지정하면 코드를 줄일 수 있다.

 

 


 

 

 

내부 조인의 활용

이번에는 전체 회원의 아이디/이름/구매한 제품/주소를 출력하겠다. 결과는 보기 쉽게 회원 아이디 순으로 정렬한다.

 

 

구매 테이블의 목록이 12건으로 잘 출력되었으나 모두 한 번이라도 구매한 회원들만 출력되었다. 모든 회원의 정보를 출력하려면 어떻게 해야 할까? 이럴 때 외부 조인을 사용한다.


 

 

 

중복한 결과 1개만 출력하기

내부 조인이 양쪽에 모두 있는 내용만 나오기 때문에 유용한 경우도 있다. 예를 들어 "우리 사이트에서 한 번이라도 구매한 회원들에게 감사 안내문을 발송한다"라고 할 때, 내부 조인을 사용해서 추출한 회원에게 안내문을 발송하면 된다.

중복된 이름은 필요 없으므로 DISTINCT 문을 활용해서 화원의 주소를 조회할 수 있다.

 


 

 

 

학습을 마치고

이 단원도 분량이 많은 관계로 내부 조인에 대해서만 학습한 내용을 정리해 보았다. 오늘은 공부하는데 졸음이 몰려오고 잠을 깨기 위해 음악을 들으면서 하고 있다. 새벽 시간이 너무 빨리 지나가는 것 같다.

아직 외부 조인과 자체 조인에 대해서 학습할 게 많이 남아있는데 최소한 7시까지 마칠 수 있었으면 좋겠다. 이번 시간을 통해 무척 어렵게 느껴지던 조인을 조금은 이해할 수 있었다.