Home > DB > πŸ’Ύ[Database] MySQL의 쿼리λ₯Ό 기반으둜 μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ SQL 쿼리 뢄석.

πŸ’Ύ[Database] MySQL의 쿼리λ₯Ό 기반으둜 μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ SQL 쿼리 뢄석.
Database Native SQL Query MySQL

πŸ’Ύ[Database] MySQL의 쿼리λ₯Ό 기반으둜 μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ SQL 쿼리 뢄석.

πŸ“ Intro

  • μ•„λž˜μ˜ Query 문은 β€œMySQLβ€μ˜ 쿼리λ₯Ό 기반으둜 μž‘μ„±λœ Native SQL Queryμž…λ‹ˆλ‹€.
    • β€œSpring Data JPAβ€μ—μ„œ @Query μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 μ‚¬μš©λ˜λ©°, νŠΉμ • boardId에 μ†ν•œ κ²Œμ‹œλ¬Ό(Article)을 νŽ˜μ΄μ§€λ„€μ΄μ…˜ λ°©μ‹μœΌλ‘œ μ‘°νšŒν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
@Query(
    value = "SELECT article.article_id, article.title, article.board_id, article.writer_id, " +
			"article.created_at, article.modified_at " +
			"FROM (" +
			"   SELECT article_id FROM article " +
			"   WHERE board_id = :boardId " +
			"   ORDER BY article_id DESC " +
			"   LIMIT :limit OFFSET :offset " +
			") t LEFT JOIN article ON t.article_id = article.article_id ",
	nativeQuery = true
)
List<Article> findAll(
	@Param("boardId") Long boardId,
	@Param("offset") Long offset,
	@Param("limit") Long limit
);

βœ…1️⃣ Query λ¬Έ 뢄석.

SELECT article.article_id, article.title, article.board_id, article.writer_id,
       article.created_at, article.modified_at
FROM (
    SELECT article_id
    FROM article
    WHERE board_id = :boardId
    ORDER BY article_id DESC
    LIMIT :limit OFFSET :offset
) t
LEFT JOIN article ON t.article_id = article_article_id

1️⃣ λ‚΄λΆ€ μ„œλΈŒμΏΌλ¦¬.

SELECT article_id
FROM article
WHERE board_id = :boardId
ORDER BY article_id DESC
LIMIT :limit OFFSET :offset
  • λͺ©μ  : νŠΉμ • κ²Œμ‹œνŒ(board_id)μ—μ„œ ν•„μš”ν•œ κ²Œμ‹œλ¬Όμ˜ ID만 μΆ”μΆœ.
  • μ„ΈλΆ€ λ‚΄μš©:
    • board_id = :boardId
      • β†˜οΈŽ 전달 받은 boardID에 ν•΄λ‹Ήν•˜λŠ” κ²Œμ‹œλ¬Όλ§Œ 쑰회
    • ORDER BY article_id DESC
      • β†˜οΈŽ article_idλ₯Ό μ§€κ΅°μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬.(μ΅œμ‹  κ²Œμ‹œλ¬Ό 순)
    • LIMIT :limit OFFSET :offset
      • β†˜οΈŽ νŽ˜μ΄μ§€λ„€μ΄μ…˜ 처리λ₯Ό μœ„ν•œ ν‚€μ›Œλ“œ.
        • :limit πŸ‘‰ ν•œ νŽ˜μ΄μ§€μ— ν‘œμ‹œν•  κ²Œμ‹œλ¬Ό 수.
        • :offset πŸ‘‰ λͺ‡ λ²ˆμ§ΈλΆ€ν„° 데이터λ₯Ό κ°€μ Έμ˜¬μ§€ κ²°μ •.

2️⃣ μ™ΈλΆ€ 쿼리.

SELECT article.article_id, article.title, article.board_id, article.writer_id,
       article.created_at, article.modified_at
FROM ... LEFT JOIN article ON t.article_id = article.article_id
  • λͺ©μ  : μ„œλΈŒμΏΌλ¦¬μ„Έμ–΄ κ°€μ Έμ˜¨ article_idλ₯Ό κΈ°μ€€μœΌλ‘œ κ²Œμ‹œλ¬Όμ„ 상세 정보λ₯Ό 쑰회.
  • μ„ΈλΆ€ λ‚΄μš© :
    • LEFT JOIN
      • β†˜οΈŽ μ„œλΈŒμΏΌλ¦¬(t)와 article ν…Œμ΄λΈ”μ„ 쑰인.
      • β†˜οΈŽ t.article_id와 article.article_idκ°€ μΌμΉ˜ν•˜λŠ” 데이터λ₯Ό κ°€μ Έμ˜΄.
    • SELECT …
      • β†˜οΈŽ κ²Œμ‹œλ¬Όμ˜ μ£Όμš” 정보λ₯Ό μ„ νƒμ μœΌλ‘œ κ°€μ Έμ˜΄.

3️⃣ Query의 λ™μž‘ κ³Όμ •.

1️⃣ μ„œλΈŒμΏΌλ¦¬ μ‹€ν–‰.

  • β†˜οΈŽ article ν…Œμ΄λΈ”μ—μ„œ board_idκ°€ :boardId인 κ²Œμ‹œλ¬Όμ˜ IDλ₯Ό μ΅œμ‹  순으둜 μ •λ ¬.
  • β†˜οΈŽ LIMIT와 OFFSET을 μ‚¬μš©ν•΄ ν•„μš”ν•œ κ²Œμ‹œλ¬Ό ID만 선택.

4️⃣ μ™ΈλΆ€ 쿼리 μ‹€ν–‰.

  • β†˜οΈŽ μ„œλΈŒ μΏΌλ¦¬μ—μ„œ κ°€μ Έμ˜¨ article_idλ₯Ό κΈ°μ€€μœΌλ‘œ article ν…Œμ΄λΈ”μ˜ λ‚˜λ¨Έμ§€ 데이터λ₯Ό κ°€μ Έμ˜΄.
  • β†˜οΈŽ 각 κ²Œμ‹œλ¬Όμ˜ ID, 제λͺ©, κ²Œμ‹œνŒ ID, μž‘μ„±μž ID, 생성/μˆ˜μ • μ‹œκ°„μ„ λ°˜ν™˜.

4️⃣ νŒŒλΌλ―Έν„°.

  • @Param(β€œboardId”) Long boardId
    • β†˜οΈŽ νŠΉμ • κ²Œμ‹œνŒμ˜ IDλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • β†˜οΈŽ WHERE board_id = :boardId 쑰건에 μ‚¬μš©λ©λ‹ˆλ‹€.
  • @Param(β€œoffset”) Long offset
    • β†˜οΈŽ νŽ˜μ΄μ§€λ„€μ΄μ…˜μ˜ μ‹œμž‘ 지점을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • β†˜οΈŽ 예: 0이면 첫 번째 데이터뢀터, 10이면 11번째 데이터뢀터 쑰회.
  • @Param(β€œlimit”) Long limit
    • β†˜οΈŽ ν•œ νŽ˜μ΄μ§€μ— κ°€μ Έμ˜¬ λ°μ΄ν„°μ˜ 수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • β†˜οΈŽ 예: 10이면 ν•œ λ²ˆμ— 10개의 데이터λ₯Ό λ°˜ν™˜.