Database/MySQL (DBeaver)

[DBeaver] MySQL - 테이블 조인(Join)하기 (Foreign Key)

juunghee 2025. 2. 3. 00:28
테이블 조인(Join)하기

 

 

 

Join이란 ?

두 개 이상의 테이블에서 데이터를 결합하여 하나의 테이블로 사용할 수 있는 기능이다.

Join을 사용하면 관련된 데이터를 효율적으로 검색하고 분석할 수 있다.

 

 

조인이 필요한 이유 예를 들어보자면,

 

중복데이터 관리!

온라인에서 쇼핑을 할 때 고객의 데이터가 저장될 것이다.

- 고객 정보 <고객의 이름, 이메일, 주소 등...>

- 주문상품정보 <고객이 주문한 상품, 개수 등...>

고객이 상품을 주문했을 때 구매한 상품 정보만 저장하면 되는데

이 두개가 한 테이블에 저장이 된다면 이름, 이메일이 중복으로 저장이 된다.

 

 

그러므로 고객정보와 고객이 구매한 상품 정보따로 저장을 해준다.

고객이 가입을 하고 상품을 구매할 때 고객의 정보가 필요하기 때문에 테이블에서 아이디를 불러오는 작업을 해준다.

이것을 관계형데이터베이스라고 한다.

 

 

 

이제 조인(join) 을 사용해보자 !

 

Foreign Key 설정

test7 데이터베이스에

customers와 orders 테이블 생성

customers 테이블에 생성할 컬럼

id               -->  id는 항상 자동증가, PRIKey !
first_name
last_name
email

 

 

 

orders 테이블에 생성할 컬럼
id
order_date
amount

customer_id -> Foreign Keys

 

마지막으로 customers에 id를 불러와줄건데 

customer_id라고 입력해주고 컬럼을 생성해준다.

// 데이터 타입은 당연히 customers 에서 id를 INT로 설정했기 때문에 똑같이 INT로 한다.

 

 

 

테이블을 생성한 데이터베이스를 더블클릭 눌러서 ER Diagram 을 누르면 두개가 있는 걸 확인할 수 있다.

 

 

 

Foreign Key

이제 customers에 id를 order 테이블에 연결해줄건데

orders 테이블로 이동 > Foreign Keys 클릭> 우클릭 > Create New Foreign Key

 

 Enter a part of object name here -> 어느 테이블에서 가져올 것이냐

customers 클릭 > customer_id 클릭 > ok 클릭

연결해주고 저장한다.

 

 

그리고나서 다시 ER Diagram을 눌러서

 

연결된 선을 눌러보면

oders에 customers id가 customer_id로 연결되있는 걸 볼 수 있다.

 

 

 

두 테이블 간 조인하기

Join

 

- 두개 테이블을 합쳐서 조회할 때는 join 키워드를 사용해준다.

- join을 사용하면 두개의 테이블에서 공통된 값을 가져온다.

- join을 사용할 때는 on을 같이 붙여줘야한다.

기본문법은 이렇다.

select *
from 테이블1
join 테이블2
on  테이블1.컬럼명 = 테이블2.컬럼명;

두 테이블 간에 연결되어있는 각각 컬럼명을 입력하면된다.

 

위에서 Foreign Key를 설정한 ER Diagram을 보면 이해하기 쉽다.

아래는 orders 테이블과 customers를 조인하는 예제이다.

 

이때, 아래와 같이 테이블명 옆에 o, c 를 붙여서 테이블명을 줄여서 사용하면 편리하다.

select *
from orders o
join customers c
on o.customer_id = c.id;

 

 

 

Left join

left join은 왼쪽 데이터는 모두 살리고 오른쪽에 다른 테이블을 합친다.

 예를 들어서 가입은 했지만 주문은 하지 않은 고객이 있을 수도 있다.

 주문하지 않은 고객의 데이터도 가져오고싶을 때 사용해준다.

// light join도 있지만 left join이 코드 짜기가 편해서 left join을 쓰는 게 좋다.

 

 

left 조인을 해서 실행한 결과

 

 

 

.

.

.

 

 

home