[MySQL] 예제를 통해 이해하는 Join문

728x90

안녕하세요✨

 

오늘은 Join에 대해서 알아보겠습니다.

 

일단 Join에 간단한 개념은 서로 다른 두테이블이 있고, 각 테이블의 Primary key 이름이 같을 때 합칠 수 있음을 의미합니다. 

 

일단 Join을 직접 해보기 위해서 테이블을 2개를 생성합니다.

create table practiceA (
id INT NOT NULL auto_increment primary key,
name varchar(50),
age varchar(50));

create table practiceB (
id INT NOT NULL auto_increment primary key,
school varchar(50),
explains varchar(50));

 

 

그리고 각 테이블에 insert를 해줍니다.

insert into practiceA values (null,"진현규","26");
insert into practiceA values (null,"진현규","25");
insert into practiceA values (null,"진현규","24");
insert into practiceA values (null,"진현규","23");
insert into practiceA values (null,"진현규","22");
insert into practiceA values (null,"진현규","21");

insert into practiceB values (null,"남서울대하교","천안에있음");
insert into practiceB values (null,"순천향대하교","신창에있음");
insert into practiceB values (null,"상명대학교","두정에있음");
insert into practiceB values (null,"한국기술대하교","두정에있음");
insert into practiceB values (null,"동서울대하교","서울에있음");
insert into practiceB values (null,"서울대하교","관악에있음");

 

 

아래 사진은 Join을 다이어그램으로 표현한 사진 입니다.

https://yoo-hyeok.tistory.com/98

위 사진을 보면은 조인에 대한 개념이 조금 와닿을 수 있습니다.

 

join 을 다뤄보기전에 알아야하는 개념이 있습니다.

 

Join을 기본 특징

Join은 컬럼을 나누는게 아닌 ROW를 나누는 것이다. 헷갈리면 안된다.

다시 말해, JOIN은 특정 컬럼 값을 기반으로 관련된 행을 결합하는 것이 아니라❌❌,

특정 조건에 따라 연관된 테이블의 행들을 가져와서 하나의 결과로 만드는 것입니다.

 

Join 종류

  • left join
  • right join
  • inner join
  • outer join
  • full outer join

 

Join을 기본 표현식

SELECT 조인할 행
FROM TABLE_A
LEFT JOIN TABLE_B ON TABLE_A.KEY = TABLE_B.KEY
SELECT [조회할 컬럼]
FROM [첫 번째 테이블] [테이블 별칭]
[JOIN 종류] [두 번째 테이블] [테이블 별칭]
ON [연결 조건]

 

1) left join

A값의 전체와 pracitceA의 id(=key) 값과

pracitceB의 id(=key) 값이 같은 결과를 return 한다.

-- left join
SELECT a.id, a.name, a.age, b.school, b.explains
FROM practiceA a
LEFT JOIN practiceB b ON a.id = b.id
ORDER BY a.id ASC;

 

결과

  • Join을 진행 할 때 맵핑하는 같은 컬럼의 값을 id를 기준으로 매핑을 한다.

 

1-2) left join (is null)

  • 순수 A의 값만 뽑고 싶다.
select a.id, a.name, a.age, b.school, b.explains
from practicea a
left join practiceb b on a.id = b.id
where b.id is null 
order by a.id asc;

 

결과

즉, 이쿼리는 row(=행) 중에서 b테이블값이 null인 것을 찾아내는 것 이다.

즉 그뜻은 b테이블이 null값이라는건 결국 join을 해도 순수 a테이블의 값만 남을 것이다.

즉 위에올린 사진을 뽑는 것이나 마찬가지이다.

2) Right join

2-1) Right join (is null)

SELECT [조회할 컬럼]
FROM [첫 번째 테이블] [테이블 별칭]
[JOIN 종류] [두 번째 테이블] [테이블 별칭]
ON [연결 조건]

위 Right join 쿼리는 Left join에서

 

from practiceb b (어떤 테이블부터 출력할지)

Left join→ Right join (무슨 조인을 할지)

left join pracitce a → practice b (무엇을 합칠지)

이렇게만 바꾸어 주면 된다.

 

즉 sql로 보면은

-- right join
SELECT a.id, a.name, a.age, b.school, b.explains
FROM practicea a
right JOIN practiceb b  ON a.id = b.id
ORDER BY a.id ASC;

이렇게된다. 위에랑 거의 같은 내용임으로 패스

3) Inner join

  • ID값이 서로 중복되는 값 도출합니다.
select a.id, a.name, a.age, b.school, b.explains
from practicea a 
inner join practiceb b on a.id = b.id
order by a.id asc;

 

결과

 

4) Full outer join

MySQL에는 full outer join이 없다.

그러므로 left join과 right join을 섞어서 사용한다

-- full outer join
select a.id , a.name, a.age, b.school, b.explains
from practicea a 
left join practiceb b on a.id = b.id 
union
select a.id, a.name, a.age, b.school, b.explains
from practicea a
right join practiceb b on a.id = b.id
order by id asc;

 

결과

위 쿼리는 UNION 을 사용해서

서브쿼리를 만들어서 사용했다.

UNION에 대하여 간단하게 설명을 하면은

UNION 연산은 두 개의 SELECT 결과를 합칠 때 사용되며, 각 SELECT의 열 수와 데이터 유형이 일치해야 한다.

4-1) Full outer join ( is null & is null)

select a.id , a.name, a.age, b.school, b.explains
from practicea a 
left join practiceb b on a.id = b.id 
where a.id is null
union
select a.id, a.name, a.age, b.school, b.explains
from practicea a
right join practiceb b on a.id = b.id
where b.id is null
order by id asc;

겹치는 부분에 의해서만 조회를 한다.

 

 

이상 Join에 대한 설명 마치겠습니다.

 

728x90