오늘은 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을 다이어그램으로 표현한 사진 입니다.
위 사진을 보면은 조인에 대한 개념이 조금 와닿을 수 있습니다.
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;
겹치는 부분에 의해서만 조회를 한다.
아래표를 통해 최종정리를 해보면 아래와 같다.
INNER JOIN | - 양쪽 테이블에서 조건에 맞는 데이터만 가져온다. - 조건이 일치하지 않으면 해당 데이터는 제외됩니다. |
예: FROM p INNER JOIN pr ON p.id = pr.payment_id - p와 pr의 id가 일치하는 데이터만 조회됩니다. |
LEFT OUTER JOIN | - 왼쪽(p) 테이블의 모든 행을 가져오고, 오른쪽(pr)에서 조건에 맞는 데이터만 가져옵니다. - 오른쪽 테이블에 일치하는 데이터가 없으면 NULL로 채웁니다. |
예: FROM p LEFT OUTER JOIN pr ON p.id = pr.payment_id - p의 모든 데이터는 포함되며, pr의 조건이 맞지 않는 경우 NULL로 표시됩니다. |
RIGHT OUTER JOIN | - 오른쪽(pr) 테이블의 모든 행을 가져오고, 왼쪽(p)에서 조건에 맞는 데이터만 가져옵니다. - 왼쪽 테이블에 일치하는 데이터가 없으면 NULL로 채웁니다. |
예: FROM p RIGHT OUTER JOIN pr ON p.id = pr.payment_id - pr의 모든 데이터는 포함되며, p의 조건이 맞지 않는 경우 NULL로 표시됩니다. |
FULL OUTER JOIN | - 두 테이블의 모든 데이터를 가져옵니다. - 조건에 맞지 않는 데이터는 NULL로 채웁니다. - 일반적으로 데이터베이스에서 지원되지 않거나 성능에 영향을 줄 수 있습니다. |
예: FROM p FULL OUTER JOIN pr ON p.id = pr.payment_id - p와 pr 모두 조건에 상관없이 데이터를 포함하며, 조건이 맞지 않는 경우 NULL로 표시됩니다. |