[SQL] Join 기능 (left join/inner join)과 Union 기능 활용하기

7022 단어 sqlsql

이 글은 제가 개발을 하며 알게 된 내용, 느낀 점 등을 기록하고자 쓰는 글입니다. '스파르타코딩클럽'의 '엑셀보다 쉬운 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주차 강의 & 강의자료

좋은 웹페이지 즐겨찾기