예제로 알아보는 SQL 문법 - join, where 필드명 in (subquery)

모선영·2022년 1월 28일
0

SQL

목록 보기
5/5

[문제상황]

테이블에 원하는 데이터가 없어서 여러 테이블을 참조해야 하는 경우가 발생했어요.

👉 오늘의 팁

  • Inner Join을 사용하여 테이블을 연결하고, 원하는 데이터를 뽑아보세요.
  • 조건으로 다른 테이블을 참조하는 경우라면 where절에서 Subquery를 사용해보세요.
    where 필드명 in (subquery) 이런 방식으로요!

01. Inner Join

예제 1) 네이버 이메일을 사용하는 유저 중, 성씨별 주문 건수를 세어보자.

  • 힌트 : orders 테이블에는 이메일과 이름이 없어 users 테이블을 inner join하고, 네이버메일 유저를 찾아 성씨별로 주문 수를 카운트하면 돼요. OO별은 group by인거 아시죠?
 select u.name, count(u.name) as order_cnt 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

  1. from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙입니다.
  2. inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙입니다. (*users 테이블에 u라는 별칭을 붙입니다)
  3. where u.email like '%naver.com': users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져옵니다.
  4. group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐줍니다.
  5. select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해줍니다.
  • Join의 실행 순서는 항상 from 과 붙어다닌다고 생각하면 편해요!

02. where 필드명 in (subquery)

예제 2) 카카오페이로 결제한 주문건 유저들만, 유저 테이블에서 출력해 보자.

  • 힌트 : order 테이블에서 카카오페이로 결제한 유저아이디를 찾아, 유저테이블에서 확인하면 돼요. order 테이블 정보를 출력할 필요는 없어요!
  • Where은 조건문이죠? Subquery의 결과를 조건에 활용하는 방식으로 유용하게 사용해 보세요.
    where 필드명 in (subquery) 이런 방식으로요!
select * from users
 where user_id in (
		select user_id from orders
		where payment_method = 'kakaopay'
  )

쿼리가 실행되는 순서를 이렇게 상상하면 편해요!
(1) from 실행: users 데이터를 가져와줌
(2) Subquery 실행: 해당되는 user_id의 명단을 뽑아줌
(3) where .. in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링 해줌
(4) 조건에 맞는 결과 출력

profile
Product Manager

0개의 댓글