SQL의 진짜 목적은 여러 데이터프레임을 합쳐서 내가 원하는 데이터 칼럼을 뽑아내는 것!
이걸 할 수 있는게 Join 인데, 오늘은 Join의 종류를 포스팅 해보고자 한다 😎
1. Inner 조인
교집합을 출력하는 조인 방식 (완죤 간단)
--2개 테이블 inner join
select a.customer_id, a.first_name, a.last_name, a.email,
b.amount, b.payment_date --선택할 칼럼
from customer a
inner join payment b -- a와 b를 merge
on a.customer_id = b.customer_id --customer_id가 같은거끼리
where a.customer_id = 2 -- customer_id가 2인 row만 조회하기
;
select ~ from 사이에는 선택해 보여주고싶은 칼럼을 주로 적는데, 코드를 끝까지 짜고 마지막에 적는게 편하다.
from 뒤에는 선택할 데이터 하나, inner join 뒤에는 나머지 데이터를 적어주면 되고 on에는 join 조건을 적어주면 됨!
--3개 테이블 inner join
select a.customer_id, a.first_name, a.last_name, a.email,
b.amount, b.payment_date, -- 선택할 칼럼은 맨 마지막에 선택하자
c.first_name as s_first_name, c.last_name as s_last_name
from customer a
inner join payment b on a.customer_id = b.customer_id
inner join staff c on b.staff_id = c.staff_id
;
데이터 3개를 join 하고 싶을때도 이렇게 연달아서 적어주면 된다!
2. Left Outer 조인
왼쪽을 기준으로 조인한다. 오른쪽을 뽑긴 뽑는데 왼쪽에 존재하는 것만 가져오겠다!
왼쪽에 존재하는 애들은 다가져오고, 만약 오른쪽이 없으면 NULL로 채우면서까지 왼쪽을 가져옴
(물론 Right outer join도 똑같이 적용)
--left, right outer join
select a.id as id_a,
a.fruit as fruit_a,
b.id as id_b,
b.fruit as fruit_b
from basket_a a
left join basket_b b -- a를 기준으로 b를 합친다. a는 다출력함
-- 만약에 a에 해당하는 b가 없으면 b는 NULL값으로 출력함
on a.fruit = b.fruit;
칼럼을 select 할 때는 as를 통해 칼럼 이름을 쉽게 바꿀 수 있다
a를 기준으로 b를 합치는데 a는 다출력하면서 만약 a에 해당하는 b가 없으면 NULL 출력
+) Left Only Outer 조인
where b.id is null;
위 코드 맨 아래에 이걸 넣어주면 only 조인이 된다!
왼쪽에는 있는데 오른쪽에는 없으면 NULL을 채우면서까지 반환하는게 Outer join인데, 오른쪽이 NULL인 것만 뽑으면 당연히 왼쪽에만 있는 데이터가 나올 것이다!
3. Full Outer 조인
Inner, Left outer, Right outer 조인 집합을 모두 출력하는 조인 방식
이렇게 연달아서 모두 보여준다
-- Full outer join
select e.employee_name, d.department_name from e
full outer join d
on d.department_id = e.department_id;
+) Full Only Outer 조인
Only는 공통된 inner 부분은 제외하는 조인이다
select e.employee_name, d.department_name from e
full outer join d on d.department_id = e.department_id
where e.employee_name is null or d.department_name is null; --only join
where 로 앞에서 나온것처럼 null을 or 절을 이용해 선택해주면 된다!
4. Cross 조인
두개의 테이블의 Catesian Product 연산 결과를 출력
(출력 가능한 모든 경우의수를 출력함)
create table cross_t1
(label char(1) primary key);
create table cross_t2
(score int primary key);
insert into cross_t1 (label)
values ('A'), ('B');
insert into cross_t2 (score)
values (1), (2), (3);
select * from cross_t1
cross join cross_t2
order by label;
select * from cross_t1, cross_t2
이것도 동일한 결과를 내는 sql문이다!
'SQL' 카테고리의 다른 글
[SQL] 데이터 집계(Group by, Having, Grouping set, Roll up, Cube) (0) | 2021.02.13 |
---|---|
[SQL] 데이터 조회와 필터링 (select, order, where, limit, in , between) (0) | 2021.02.05 |