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)
데이터베이스 자체에서 끊어서 가져오는 것
- Offset based 페이징
- 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 |