함께하는 데이터 분석

[SQL] 테이블 결합 - JOIN 본문

데이터분석 공부/SQL

[SQL] 테이블 결합 - JOIN

JEONGHEON 2022. 4. 27. 23:16

오늘은 여러 개의 테이블을 결합하는 데 사용하는

 

Join을 알아보겠습니다.

 

두 개 혹은 그 이상의 테이블이 있을 때

 

하나의 테이블로 합쳐서 보고 싶을 때 사용합니다.

 

column의 공통된 데이터 값을 기준으로

 

테이블을 결합합니다.

 

SQL에서 Join은 크게 3가지 종류가 있습니다.

 

  • Inner Join : 테이블의 공통되는 값에 매칭 되는 데이터만 결합
  • Left Join : 왼쪽 테이블을 기준으로 테이블의 공통 값이 매칭 되고 왼쪽 테이블에 매칭 되지 않는 오른쪽 테이블의 데이터는 NULL처리
  • Right Join : 오른쪽 테이블을 기준으로 테이블의 공통 값이 매칭 되고 오른쪽 테이블에 매칭 되지 않는 왼쪽 테이블의 데이터는 NULL처리

그럼 workbench를 통해 자세히 살펴볼까요?

 

 

 

데이터 베이스 사용

/* 데이터베이스 da 사용 */ 
use da;

이전과 마찬가지로 데이터 베이스 da를 사용하겠습니다.

 

 

 

두 개의 테이블 생성

/* 인적사항 테이블 생성 */
create table 인적사항 ( 
나이 int primary key,
이름 varchar(10),
생년월일 date not null,
성별 varchar(2)
);

/* 인적사항 테이블 데이터 삽입 */
insert into 인적사항 values (60, '최가', '1963-07-01', 'M');
insert into 인적사항 values (53, '최나', '1970-03-01', 'F');
insert into 인적사항 values (26, '최다', '1998-01-24', 'M');
insert into 인적사항 values (23, '최라', '2000-05-10', 'F');

select * from 인적사항;

첫 번째 테이블인 인적사항 테이블을 생성해줬습니다.

 

테이블의 column에는 나이, 이름, 생년월일, 성별이 있습니다.

 

이제 두 번째 테이블을 만들어보겠습니다.

 

/* 세부사항 테이블 생성 */
create table 세부사항 ( 
나이 int primary key,
이름 varchar(10),
몸무게 int,
키 int,
취미 varchar(6)
);

/* 세부사항 테이블 데이터 삽입 */
insert into 세부사항 values (26, '최다', '71', '176', '야구');
insert into 세부사항 values (21, '김나', '48', '166', '드라이브');
insert into 세부사항 values (32, '이바', '87', '181', '쇼핑');
insert into 세부사항 values (23, '최라', '53', '155', '게임');

select * from 세부사항;

이번엔 세부사항 테이블을 생성해줬습니다.

 

눈치채신 분들도 계시겠지만, 최라와 최다의 데이터가

 

인적사항 테이블의 데이터와 겹치죠.

 

join을 통해 하나의 column의 같은 데이터 값 기준으로 

 

테이블이 생성되는지 확인하기 위함입니다.

 

column에는 나이, 이름, 몸무게, 키,  취미가 있습니다.

 

기준이 되는 column을 나이로 설정하고 진행하겠습니다.

 

나이뿐 아니라 이름도 같으므로

 

이름을 기준으로 하셔도 무방합니다. 

 

 

 

Inner Join

select * from 인적사항 as a
inner join 세부사항 as b
on a.나이 = b.나이;

select * from을 통해 인적사항의 모든 column을 불러오고

 

as a를 통해 a라고 지정했습니다.

 

그 이후 inner join을 세부사항으로 설정하고

 

as b를 통해 b라고 지정했습니다.

 

그리고 on을 통해 a(인적사항)의 나이와 b(세부사항)의 나이가

 

같은 데이터 값을 기준으로 join을 시켜줬습니다.

 

눈에 보이시는 데로 공통된 값인 최라와 최다의 행만 보입니다.

 

만약 인적사항이 아닌 세부사항의 테이블을 앞에 두고 싶으시면

 

select * from 세부사항 as a
inner join 인적사항 as b
on a.나이 = b.나이;

이렇게 세부사항을 앞에 쓰시면 됩니다.

 

간단하죠?

 

앞으로는 통일을 위해 인적사항 테이블 뒤에

 

세부사항 테이블이 오도록 하겠습니다.

 

이제 left join을 해보겠습니다.

 

 

 

Left Join

select * from 인적사항 as a
left join 세부사항 as b
on a.나이 = b.나이;

위의 inner join코드에서 inner이 left로 바뀐 것이 전부입니다.

 

앞서 join을 설명할 때 말씀드린 대로

 

left join은 겹치는 데이터만 표현되는 것이 아닌

 

왼쪽 테이블을 기준으로 모든 데이터가 표시되고

 

왼쪽 테이블의 데이터에 매칭 되지 않는 오른쪽 테이블의 데이터는

 

모두 NULL로 표시되는 것을 확인할 수 있습니다.

 

이번에는 right join을 살펴보겠습니다.

 

 

 

Right Join

select * from 인적사항 as a
right join 세부사항 as b
on a.나이 = b.나이;

right join은 left join에서 왼쪽 테이블이

 

오른쪽 테이블이 된 것뿐 모든 것이 똑같습니다.

 

상황에 맞게 두 테이블의 동일한 데이터만 뽑아내고 싶으시면 inner를

 

한쪽 테이블의 모든 데이터를 뽑아내려고 하시면

 

left나 right를 사용해주시면 됩니다!