Home
>
DB
>
๐พ[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๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ.