Spring Boot/UMC

Chapter 2. 실전 SQL

seung_hyeon 2025. 3. 27. 14:56

Join 

두 개 이상의 테이블 연결해서 데이터 조회

(기본키, 외래키) 기준으로 결합

 

 

INNER JOIN

  •  두 테이블에서 일치하는 데이터만 반환
  • on 사용해서 연결 조건 설정
  • 일치하지 않는 데이터 무시됨
SELECT <열 목록>
FROM <첫 번째 테이블>
    INNER JOIN <두 번째 테이블> ON <조인 조건>
[WHERE 검색 조건]

SELECT
	mm.id AS mission_id, 
	m.point_reward, 
	s.name AS store_name,
	mm.status, 
	mm.finish,
	mm.complated_at
FROM member_mission AS mm
INNER JOIN mission AS m ON mm.mission_id = m.id

 

LEFT JOIN

  • 왼쪽 테이블의 모든 행 가져온다
  • 오른쪽 행은 일치하는 값있으면 가져온다 (데이터 없으면 NULL)

RIGHT JOIN

  • 오른쪽 테이블 모든 행 가져온다
  • 왼쪽 행 일치하는 값 있으면 가져온다 (데이터 없으면 NULL 

FULL JOIN

  • 두 테이블의 모든 테이터 가져온다
  • 일치하는 값 없으면 NULL
  • 일반적으로 MySQL에서는 FULL JOIN 지원 안 함 → UNION 사용

SELF JOIN

  • 같은 테이블을 자기 자신과 조인
  • 트리 구조(부모-자식), 자기 참조 데이터 다룰 때 사용
  • 서로 다른 별칭 주고 JOIN

CROSS JOIN

  • 두 개의 테이블에서 JOIN 조건 없이 모든 조합 생성
  • 첫 번째 테이블의 각 행이 두 번째 테이블의 모든 행과 결합
  • 결과 곱 집합 형태로 나온다
SELECT *
FROM <첫 번째 테이블>
    CROSS JOIN <두 번째 테이블>

 

 


Subquery

쿼리 안에 또 다른 쿼리 넣어서 실행

(WHERE, SELECT, FROM 절에서 사용)

 

SELECT name 
FROM member 
WHERE id IN (SELECT member_id FROM member_mission WHERE status = 'completed');

 

 


페이징(Paging)

데이터베이스 자체에서 끊어서 가져오는 것

  1. Offset based 페이징
  2. Cursor based 페이징

 

Offset based 페이징

직접 번호 찾아서 이동하는 페이징

limit 사용해서 한 페이지에 보여 줄 데이터 개수 정하고 offset으로 몇 개 건너뛸지 정한다

 

limit y offset(x-1) * y;

→ 페이지 x번에 대해 한 페이지에 y개 보여준다

 

 

offset paging의 단점!

- 성능 문제 

LIMIT 10 OFFSET 1000일 경우 1000개의 데이터 다 일고 10개만 가져온다

 

- 데이터 변경 시 중복 또는 누락

1페이지에서 2페이지로 넘어가는 순간 새로운 데이터 추가 → 중복 데이터 생길 수 있다

 

 

Cursor based 페이징 

(offset based 페이징 단점 개선)

마지막 데이터를 기준으로 다음 데이터 조회

SELECT * FROM posts 
ORDER BY created_at DESC 
LIMIT 10;

→ 마지막으로 본 게시글 기준으로 다음 10개 조회

'Spring Boot > UMC' 카테고리의 다른 글

Chapter 4. Spring Boot 코어 개념  (0) 2025.04.09
Chapter 3. API  (0) 2025.04.01