1) Join 이란?
두 테이블의 공통된 정보(Key값)을 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
ex) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶다!
👉 이럴 때를 대비해서 무언가 연결된 정보가 있을 때, user_id 처럼 동일한 이름과 정보가 담긴 필드를 두 테이블에 똑같이 담아놓는데 이런 필드를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 부른다.
2) Join의 종류: Left Join, Inner Join
1. Lefg Join
Left join은 A테이블에 B테이블이 매핑되는 부분이 붙혀진, 모든 A테이블의 데이터가 조회됩니다.
2. Ineer join
ineer join은 B테이블과 매핑되는 A테이블의 데이터(교집합)만 조회됩니다.
👉 연결의 기준이 되고싶은 테이블을 from 절에, 기준이 되는 테이블에 붙이고 싶은 테이블을 Join 절에 위치해 놓습니다.
3) inner join 사용법
join 'table' on 결합 조건
select u.name, count(u.name) as count_name from orders o
inner join users u
on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name
👉 위 쿼리가 실행되는 순서: from → join → where → group by → select
4) Left join 사용법
left join을 주로 이용할 때는, 조인하는 테이블의 데이터를 가지고 있거나, 없는 데이터를 판단할 때 주로 이용합니다
select name, count(*) from users u
left join point_users pu on u.user_id = pu.user_id
where pu.point_user_id is not NULL
group by name
5) Union 결과물 합치기
조회하고자 하는 조건이 서로다른 쿼리문을 함께 보고싶었을 때 Union을 사용하면
Select를 두번 할 필요없이 사용할 수 있다!
(
select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at < '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)
union all
(
select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at > '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)
👉 유니온을 사용하기 위해서는 한 가지 조건이 있는데, 두 테이블의 필드명이 같아야 한다. (결과를 합치는 것이기 때문에)
Union을 사용하면 내부 정렬이 먹히지 않는데, order by는 모든 결과가 나온 후 정렬을 진행하기 때문이다.
이때 유용한 방법이 서브쿼리이다! (다음게시물에 포스팅레츠고)
'DataBase > Mysql' 카테고리의 다른 글
MySql orderBy null first /null last 정렬 (0) | 2022.07.05 |
---|---|
[SQL] 서브쿼리문, Subquery 사용하기 (0) | 2022.01.06 |
[SQL] SQL 쿼리문, 통계 데이터 내기 (0) | 2022.01.06 |
[SQL] Select 쿼리문, Where절 연습하기 (0) | 2022.01.05 |
Mysql 중복 데이터 제거(같은 테이블 유사 데이터 제거) (0) | 2021.09.23 |