[SQL] Join 기능 (left join/inner join)과 Union 기능 활용하기
이 글은 제가 개발을 하며 알게 된 내용, 느낀 점 등을 기록하고자 쓰는 글입니다. '스파르타코딩클럽'의 '엑셀보다 쉬운 SQL' 강의를 듣고 배우고 있습니다. 내용에 대한 반박과 피드백은 늘 감사히 받겠습니다.
여러 테이블을 연결해보자: Join 이란?
Join이란? 두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미한다.
두 테이블의 정보를 연결해서 함께 보고싶을 때 사용한다.
예) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶다. 이 때 users 테이블과 orders 테이블 둘 다 user_id 필드를 갖고 있어야 한다. -> 이런 필드(user_id를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 부른다.
ㄴ 두 테이블의 공통 필드(user_id)
[오늘의 꿀팁!] 혹시 엑셀을 잘 쓴다면? SQL의 Join은 엑셀의 vlookup과 동일하다고 생각하면 된다.
Join의 종류 : left join / inner join
ㄴ left join 그림으로 이해하기
여기서 A와 B는 각각의 테이블을 의미한다. 둘 사이의 겹치는 부분은, 테이블 A와 B의 key 값이 연결되는 부분이다.
ㄴ inner join 그림으로 이해하기
여기서 A와 B는 각각의 테이블을 의미한다. 이 그림은 두 테이블의 교집합을 이야기하고 있다.
[여기서 꿀팁!] left join보다는 inner join이 쓰기 쉽다. left join은 join의 순서를 잘 신경써줘야 하는데 (A 테이블에 B 테이블을 join하는 것과, B 테이블에 A 테이블을 join하는 것이 다르게 나올 수 있음) inner join은 순서 상관 없이 join해주어도 되기 때문이다.
inner join문 예시 들어보기
[실습] orders 테이블에 users 테이블 연결해보기 (inner join 사용)
select * from orders o
inner join users u
on o.user_id = u.user_id;
연결의 기준이 되고 싶은 테이블을 from 절에, 붙이고 싶은 테이블을 join 절에 위치해 놓는다. on 뒤에는 두 테이블에 공통적으로 있는 필드명(key)을 입력해준다.
[주의할 점!] join하면서 필드명을 입력할 때는 꼭 o.user_id 이런 식으로 '어떤 테이블의 필드'인지 명시해주어야 한다.
위 쿼리가 실행되는 순서: from → join → select
- from orders o : orders 테이블 데이터 전체를 가져온다.
- inner join users u on o.user_id=u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users의 테이블을 붙인다.
- select * : 붙여진 모든 데이터를 출력한다.
[오늘의 꿀팁!] 항상 from에 들어간 테이블을 기준으로, 다른 테이블이 붙는다고 생각하면 편하다.
결과물 합치기! Union 배우기
Select를 두 번 할 게 아니라, 한번에 모아서 보고싶은 경우에 사용한다.
ㄴ 이 때 조건 : 노란색과 파란색의 필드명이 같아야 한다.
Union 예시 들어보기
ㄴ 실습 예시 : 7월코드와 8월코드를 붙여서 보고 싶음.
(
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
)
select 옆에 있는 '7월' as month와 '8월' as month를 통해서 month 필드를 만들어준다.
그 후 두 코드들을 union all
로 연결해주면, 두 코드가 연결되어 출력된다!
union을 사용하면 내부 정렬이 먹지 않는다. 이럴 때 쓰는 유용한 방법이 있는데 바로 SubQuery(서브쿼리)이다.
서브쿼리는 다음 강의 일지에 쓰도록 하겠다.
👉 참고한 내용
스파르타코딩클럽 '엑셀보다 쉬운 SQL' 3주차 강의 & 강의자료
Author And Source
이 문제에 관하여([SQL] Join 기능 (left join/inner join)과 Union 기능 활용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eeeun/SQL-Join-기능-left-joininner-join과-Union-기능-활용하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)