Chapter 2. 실전 SQL - 어떤 Query를 작성해야 할까?

Arin·2025년 12월 26일

UMC 8기 - Node.js

목록 보기
3/11

Join

  • join의 종류
    • Inner Join
    • Outer Join
      • Left Join
      • Right Join
      • Full Join

Inner Join

두 테이블의 공통된 부분만 가져올 때 사용

아래는 해시태그가 UMC인 책의 이름을 가져오는 쿼리문

select b.* 
from book as b
inner join book_hash_tag as bht on b.id = bht.book_id
inner join hash_tag as ht on bht.hash_tag_id = ht.id
where ht.name = "UMC";

Outer Join

교집합 외부에 존재하는 데이터를 가져올 때 사용
Left 조인이 일반적으로 가장 많이 사용됨

아래는 left join을 그림으로 표현한 이미지.

이처럼 모든 좌측 테이블을 가져오되, 조인 불가능한 것은 NULL로 채운다.

pagination (limit, offset)

아래는 offset을 이용해 최신순 정렬을 구현한 쿼리문

select * from book 
order by created_at desc
limit 15 offset 0;
  • limit: 가져올 데이터의 양
  • offset: 가져올 데이터의 초기 위치 값
  • 즉, limit 15 offset 0 은 0에서부터 15개의 데이터를 가져오라는 뜻이다.

pagination (cursor)

cursor: 마지막으로 조회한 컨텐츠를 의미

아래는 cursor를 이용해 최신순 정렬을 구현한 쿼리문

Ex) 마지막으로 본 book_id가 3일 때 , 해당 아이디의 책이 생성된 날짜 이전(created_at < )의 책들을 내림차순으로 정렬하여 최근에 생성된 책부터 15권을 출력하라

select * from book 
where created_at < (select created_at from book where id = 3)
order by created_at desc;

🎯미션 기록

  1. 내가 진행중, 진행 완료한 미션 모아서 보는 쿼리(페이징 포함)
select * from user_mission um
where status = "progress" or status = "complete"
limit ? offset (?-1)*?; 
  1. 리뷰 작성하는 쿼리,
  • 사진의 경우는 일단 배제
insert into review (user_id, restaurant_id, rating, body, created_at, updated_at) 
values(?, ?, ?, ?, now(), now());
  1. 홈 화면 쿼리
    (현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함)
select *
from mission as m 
join user_mission as um on m.id = um.mission_id
join restaurant on um.restaurant_id = restaurant .id
join region on region.id = restaurant.region_id
where region.name = ?
limit ? offset(?-1)*?;
  1. 마이 페이지 화면 쿼리
select * from user;

0개의 댓글