๐ ๊ฐ์ฅ ํฐ ๋ฌผ๊ณ ๊ธฐ 10๋ง๋ฆฌ ๊ตฌํ๊ธฐ
๊ฐ์ฅ ํฐ ๋ฌผ๊ณ ๊ธฐ 10๋ง๋ฆฌ๋ฅผ ์ ํํ๋ผ๊ณ ํ์ผ๋๊น, ROWNUM์์จ์ผ ํ๋ค. ํ์ง๋ง ROWNUM์ Oracle์๋ง ์๋ ๋ฌธ๋ฒ์ด๊ณ , MySQL์์๋ LIMIT ํค์๋๋ก ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๋ค. ์ฃผ์ํ ์ , ROWNUM / LIMIT ์ ์๋ธ์ฟผ๋ฆฌ(subquery)์ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค. ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ ์ฐ๋ฉด WHERE์ ์ด SELECT์ ๋ณด๋ค ๋จผ์ ์ํ๋์ด ์ํ๋ ๊ฐ์ด ๋์ค์ง ์๋๋ค. ๊ธธ์ด๊ฐ ํฐ ์์ผ๋ก 10๊ฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋๋ฐ, ๊ธธ์ด์ ์๊ด ์์ด ๋๋คํ ๊ฐ 10๊ฐ๊ฐ ์ ํ๋๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ SQL๋ฌธ์ ์คํ์์ ๋๋ฌธ์ด๋ค.
SQL์ ์คํ ์์
FROM - WHERE(ROWNUM ์คํ) - GROUP BY - HAVING - SELECT - ORDER BY
LENGTH๋ฅผ ํฐ ๊ฐ๋ถํฐ ์ ๋ ฌํ๋ ORDER BY ์ ์ ROWNUM ํ ๋น ํ์ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋๊ธฐ ์ ์ ROWNUM์ด ํ ๋น๋๋ฏ๋ก, ORDER BY๋ฅผ ์ฌ์ฉํด ์ ๋ ฌ๋ ํ ํน์ ROWNUM ์กฐ๊ฑด์ ๊ธฐ๋ํ๋ฉด ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๋๋ค. ์๋ฐํ ๋งํ๋ฉด,
ROWNUM์ WHERE ์ ์ ๊ฐ์ด ์จ ์ฃผ๋ ๊ฒ์ด๋ฏ๋ก,`ROWNUM`์ SELECT ์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ ๊ฐ์ ธ์ค๊ธฐ ์์ํ ๋ ํ ๋น๋๋ค. ROWNUM ์์ฒด๋ WHERE ์ ์์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋์ง๋ง, ์ฌ์ค์ WHERE ์ ์์ ROWNUM์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋๋ก ํ๊ฐ๋ ๋๋ ์ด๋ฏธ ํ ๋น๋ ์ํ์ฌ์ผ ํ๋ค.
๐ฆ Oracle ์ ๋ต์ฝ๋
SELECT *
FROM (
SELECT LENGTH, ID
FROM FISH_INFO
ORDER BY LENGTH DESC, ID
)
WHERE ROWNUM <= 10;
๐ฆ MySQL ์ ๋ต์ฝ๋
์ฌ๊ธฐ์, (SELECT ID, LENGTH FROM FISH_INFO ORDER BY LENGTH DESC, ID) ๋ถ๋ถ์ FROM ์ ๋ด์ ์ฌ์ฉ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
MySQL์์๋ Oracle๊ณผ ๋ฌ๋ฆฌ ์๋ธ์ฟผ๋ฆฌ์ as subquery ๋ฅผ ์๋ตํ ์ ์๊ณ , ๊ผญ ์จ์ค์ผ ํ๋ค. ์๋ธ์ฟผ๋ฆฌ ๋ณ์นญ์ด ํ์์ธ ์ด์ ๋ ๋ณ์นญ์ ์ง์ ํ์ง ์์ผ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์คํ๋์ง ์๊ณ ์ค๋ฅ๊ฐ ๋๋ค. ์๋ธ์ฟผ๋ฆฌ๊ฐ ์์ ํ ์ด๋ธ์ฒ๋ผ ์๋ํ ๋ ์ด๋ฅผ ์ฐธ์กฐํ ๋ฐฉ๋ฒ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
SELECT *
FROM (
SELECT ID, LENGTH
FROM FISH_INFO
ORDER BY LENGTH DESC, ID
) AS SUBQEURY
LIMIT 10;
๊ฐ์ด ํ์ด๋ณด๋ฉด ์ข์ ๋ฌธ์
๐ ์์ฑ์ด ์ก์ ์ ๊ตฌํ๊ธฐ ๋ฌธ์
๐ ํน์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ก์ ์ด ์ ๊ตฌํ๊ธฐ
MySQL ์ ๋ต์ฝ๋
SELECT COUNT(B.FISH_NAME) AS FISH_COUNT
FROM FISH_INFO A JOIN FISH_NAME_INFO B
ON A.FISH_TYPE = B.FISH_TYPE
WHERE B.FISH_NAME IN ('BASS', 'SNAPPER');
์ฒ์์ ํ๋ฆฐ ์ด์ ๋ ์ปฌ๋ผ๋ช ์ ALIAS ์ ๋ถ์ฌ์
๋ฌธ์ ์์ FISH_COUNT๋ก ์ถ๋ ฅํ๋ผ๊ณ ํ์ผ๋๊น AS FISH_COUNT ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค.
์? ๊ทผ๋ฐ ์ด ๋ฌธ์ ๋ ๋ต์ ์ ์ถ ํ์์ผ๋ก Oracle์ ์ง์ํ์ง ์๊ณ , MySQL๋ง ์ง์ํ๋ค.
์ด๋ค ๋ฌธ์ ๋ Oracle๋ ๋๊ณ ์ด๋ค ๋ฌธ์ ๋ MySQL๋ง ๋๋ ๋ณด๋ค;;