์ผ๋ฐ์ ์ผ๋ก ์น ์๋น์ค์ ๊ฐ์ด ์ผ๋ฐ์ ์ธ ์จ๋ผ์ธ ํธ๋์ญ์
์ฒ๋ฆฌ ํ๊ฒฝ์ DB์์๋ INSERT๋ UPDATE ์์
์ ๊ฒฝ์ฐ ๊ฑฐ์ ๋ ์ฝ๋ ๋จ์๋ก ๋ฐ์ํ๋ฏ๋ก ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ ์๋ค.
ํ์ง๋ง, SELECT์ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฐ์ ํ
์ด๋ธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํด์ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค.
๋ฐ๋ผ์, SELECT ์ฟผ๋ฆฌ์ ๊ฐ ๋ถ๋ถ์ ์ฌ์ฉ๋ ์ ์๋ ๊ธฐ๋ฅ์ ์ฑ๋ฅ ์์ฃผ๋ก ์ดํด๋ณด๊ณ ์ ํ๋ค.
1. SELECT ์ ์ ์ฒ๋ฆฌ ์์
์๋์ ๊ฐ์ ๋ค์ํ ํค์๋๋ฅผ ์ด์ฉํ SELECT ๋ฌธ์ด ์กด์ฌํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ ํ ์ ์ด ๋จผ์ ์คํ๋๋์ง ์์ธกํด์ผ ์ต์ ํ๋ฅผ ํ ์ ์๋ค.
SELECT, FROM, WHERE. GROUP BY, HAVING, ORDER BY, LIMIT
SELECT s.emp_no, COUNT(DISTINCT e.first_name) AS cnt
FROM salaries s
INNER JOIN employees e ON e.emp_no=emp_no
WHERE s.emp_no IN (10001, 10002)
GROUP BY s.emp_no
HAVING AVG(s.salary) > 1000
ORDER BY AVG(s.salary)
LIMIT 10;
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฐ ์์๊ฐ ๋น ์ง ์๋ ์์ด๋ ์์๊ฐ ๋ฐ๋์ด์ ์คํ๋๋ ํํ์ ์ฟผ๋ฆฌ๋ ๊ฑฐ์ ์๋ค.
ํ์ง๋ง, ์์ธ๋ ์กด์ฌํ๋ค.
1. GROUP BY ์ ์์ด ORDER BY๋ง ์ฌ์ฉ๋ ์ฟผ๋ฆฌ
2. ORDER BY๋ GROUP BY ์ ์ด ์๋๋ผ๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ์ฒ๋ฆฌํ ๋๋ ๊ทธ ๋จ๊ณ ์์ฒด๊ฐ ๋ถํ์ํ๋ฏ๋ก ์๋ต๋๋ค.
1. GROUP BY์ ์์ด ORDER BY๋ง ์ฌ์ฉ๋ ๊ฒฝ์ฐ ์์ธ์ ์ผ๋ก ์ฒซ ๋ฒ์งธ ํ
์ด๋ธ๋ง ์ฝ์ด์ ์ ๋ ฌํ ๋ค์ ๋๋จธ์ง ํ
์ด๋ธ์ ์ฝ๋ ๊ตฌ์กฐ์ด๋ค.
์๋์ ๊ฐ์ ์์๋ก ๋์ํ๋ค.
๋๋ผ์ด๋น ํ ์ด๋ธ(WHERE ์ ์ฉ) -> ORDER BY -> ๋๋ฆฌ๋ธ ํ ์ด๋ธ(์กฐ์ธ ์ ์ฉ) -> LIMIT
์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ด์ฉํ ์ฟผ๋ฆฌ ์์ ๋ณ๊ฒฝ
์์ ๋ค๋ฅด๊ฒ ์คํ ์์๋ฅผ ๋ฒ์ด๋๋ ์ฟผ๋ฆฌ๊ฐ ํ์ํ๋ค๋ฉด ์๋ธ์ฟผ๋ฆฌ๋ก ์์ฑ๋ ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
Q) ์ธ๋ผ์ธ ๋ทฐ๋?
ํ๋์ ์ง์๋ฌธ์์๋ง ์์ฑ๋์ด ์ฌ์ฉ๋์ด ์ํ์ด ๋๋ ํ์๋ ์ฌ๋ผ์ง๋ ๋ทฐ
๋ณดํต FROM ์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ๋์ ํ ์ด๋ธ๋ก ์ฌ์ฉํ๋ ํํ๋ฅผ ๋งํจ.
์์ ์ฟผ๋ฆฌ์์ LIMIT์ ORDER. BY์ ๋์ ์์๋ฅผ ๋ฐ๊พธ๋ ค๋ฉด FROM ์ ์์ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ๋ง๋ค์ด์ LIMIT๋ฅผ ๋จผ์ ์คํํ ํ์ ๋์ค์ ๋ฐ๊นฅ(์์ฐํฐ) ์ฟผ๋ฆฌ์์ ORDER BY๋ฅผ ์คํํ๋ฉด ์์๊ฐ ๋ค๋ฐ๋๊ฒ ๋๋ค.
ํ์ง๋ง, ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์์ ํ ์ด๋ธ์ด ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ฃผ์ ํด์ผ ํ๋ค.
2. ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๊ท์น
WHERE์ ์กฐ๊ฑด๋ฟ๋ง ์๋๋ผ GROUP BY, ORDER BY ์ ๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์๋ค.
1. ์ธ๋ฑ์ค ์ปฌ๋ผ ๋ณํ ์์ด ์ฌ์ฉ
WHERE ์ ์ด๋ ORDER BY ๋๋ GROUP BY๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ฑ์ค ๋ ์ปฌ๋ผ์ ๊ฐ ์์ฒด๋ฅผ ๋ณํํ์ง ์๊ณ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค๋ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค. ์ธ๋ฑ์ค๋ ์ปฌ๋ผ์ ๊ฐ์ ์๋ฌด๋ฐ ๋ณํ ์์ด B-Tree์ ์ ๋ ฌํด์ ์ ์ฅํ๋ค.
WHERE, GROUP BY, ORDER BY์์๋ ์๋ณธ๊ฐ์ ๊ฒ์ํ๊ฑฐ๋ ์ ๋ ฌํ ๋๋ง B-Tree์ ์ ๋ ฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ค.
์์ธ์ ์ผ์ด์ค๋ ์๋์ ๊ฐ์ด salary ์ปฌ๋ผ์ผ๋ก ์ธ๋ฑ์ค๊ฐ ๋ง๋ค์ด์ ธ ์๋๋ฐ, ํด๋น ์ปฌ๋ผ์ ๊ฐ๊ณตํ ํ์ ๋ค๋ฅธ ์์ซ๊ฐ๊ณผ ๋น๊ตํ๋ ์ฟผ๋ฆฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ ์ฌ์ฉํ์ง ๋ชปํ๋ค.
SELECT * FROM salaries WHERE salary*10 > 2000;
ํด๋น ์ฟผ๋ฆฌ๋ฅผ "์ตํฐ๋ง์ด์ ์์ *10์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๊ฒจ์ ์ต์ ํ ํ ์ ์์ง ์๋?"๋ผ๊ณ ์๊ฐํ ์๋ ์์ง๋ง ๊ทธ๋ ์ง ์๋ค.
2. ๋น๊ต ๋์๋ผ๋ฆฌ ๋ฐ์ดํฐ ํ์ ์ผ์น
WHERE ์ ์ ์ฌ์ฉ๋๋ ๋น๊ต ์กฐ๊ฑด์์ ์ฐ์ฐ์ ์์ชฝ์ ๋น๊ต ๋์ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ด ์ผ์นํด์ผ ํ๋ค.
์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ์ฐฉ๊ฐํ ์ ์๋ ์ ์ด ์๋ค.
age๋ผ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ฑ์ ํ์ผ๋ ์คํ ๊ณํ์ type ์ปฌ๋ผ์ "ref" ํน์ "range"๊ฐ ํ์๋์ ๊ฑฐ๋ผ ๊ธฐ๋ํ์ง๋ง, ์ฌ์ค์ "index"๋ผ๊ณ ํ์๋๋ค. "index"๋ ์ธ๋ฑ์ค ํ ์ค์บ์ ์๋ฏธํ๋ค. ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ ์ด์ฉํ์ง ๋ชปํ๊ณ ์ธ๋ฑ์ค ํ ์ค์บ์ ํ ์ด์ ๋ age๋ VARCHARํ์
์ด์ง๋ง ๋น๊ต๋๋ ๊ฐ 2๋ INTEGER ํ์
์ผ๋ก ๋ฐ์ดํฐ ํ์
์ด ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
CREATE TABLE test (age VARCHAR(10), INDEX ix_age (age));
SELECT * FROM test WHERE age=2;
์์ ๊ฐ์ด ๋ฐ์ดํฐ ํ์
์ด ๋ถ์ผ์นํ ๋ MySQL ์ตํฐ๋ง์ด์ ๊ฐ ๋ด๋ถ์ ์ผ๋ก ๋ฌธ์์ด ํ์
์ ์ซ์ ํ์
์ผ๋ก ๋ณํํ ํ ๋น๊ต ์์
์ ์ฒ๋ฆฌํ๋ค.
๊ฒฐ๊ตญ age์ปฌ๋ผ์ด ์ซ์ ํ์
์ผ๋ก ๋ณํ๋ ํ ๋น๊ต๋๋ฏ๋ก ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
์ฟผ๋ฆฌ๋ฅผ " WHERE age = '2'; " ๋ก ๋ณ๊ฒฝํ๋ฉด ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ ์ฌ์ฉํ๋๋ก ์ ๋ํ ์ ์๋ค.
3. WHERE ์ ์ ์ธ๋ฑ์ค ์ฌ์ฉ
WHERE ์กฐ๊ฑด์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ์์ ๋ฒ์ ๊ฒฐ์ ์กฐ๊ฑด๊ณผ ์ฒดํฌ ์กฐ๊ฑด ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌ๋ถํ๋ค.
๋ ๋ฐฉ์ ์ค์ ์์ ๋ฒ์ ๊ฒฐ์ ์กฐ๊ฑด์, WHERE ์ ์์ ๋๋ฑ ๋น๊ต ์กฐ๊ฑด์ด๋ IN์ผ๋ก ๊ตฌ์ฑ๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ ์ปฌ๋ผ๋ค์ด ์ธ๋ฑ์ค์ ์ปฌ๋ผ ๊ตฌ์ฑ๊ณผ ์ข์ธก์์๋ถํฐ ๋น๊ตํ์ ๋ ์ผ๋ง๋ ์ผ์นํ๋๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
์ ๊ทธ๋ฆผ์์ ์์ชฝ์ 4๊ฐ์ ์ปฌ๋ผ์ด ์์๋๋ก ๊ฒฐํฉ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ๊ฒ์ ์๋ฏธํ๋ค.
"WHERE ์กฐ๊ฑด์ ์ ์์"์ ๋์ด๋ ์์๊ฐ ์ธ๋ฑ์ค์ ๋ค๋ฅด๋๋ผ๋ MySQL ์๋ฒ ์ตํฐ๋ง์ด์ ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ์กฐ๊ฑด๋ค์ ๋ฝ์์ ์ต์ ํ๋ฅผ ์ํํ ์ ์๋ค.
์ฆ, MySQL ์ตํฐ๋ง์ด์ ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ์กฐ๊ฑด์ ๋ฝ์์ ์ต์ ํ๋ฅผ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ WHERE ์กฐ๊ฑด์ ์ ์์๋ ์ค์ ์ธ๋ฑ์ค์ ์๊ด ์๋ค๋ ๊ฒ์ด๋ค.
ํ๊ฐ์ง ๋ ์ค์ํ ๋ถ๋ถ์ด ์๋ค.
์ ๊ทธ๋ฆผ์ WHERE ์กฐ๊ฑด์ ์์ COL_1๊ณผ COL_2๋ ๋๋ฑ ๋น๊ต ์กฐ๊ฑด์ด๊ณ , COL_3๋ ๋๋ฑ ๋น๊ต ์กฐ๊ฑด์ด ์๋ ์๋ค์ ๊ฐ์ ๋ฒ์ ๋น๊ต์กฐ๊ฑด์ด๋ฏ๋ก COL_3์ ๋ค์ ์ปฌ๋ผ์ธ COL_4์ ์กฐ๊ฑด์ ์์
๋ฒ์ ๊ฒฐ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋์ง ๋ชปํ๊ณ ์ฒดํฌ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ค.
์ด๋ WHERE ์กฐ๊ฑด์ ๊ณผ ์ธ๋ฑ์ค ์ปฌ๋ผ ์์๊ฐ ์ผ์นํ์ง ์์์๊ฐ ์๋๋ผ, ์ธ๋ฑ์ค ์์์ COL_4 ์ง์ ์ปฌ๋ผ์ธ COL_3๊ฐ ๋ฒ์ ๋น๊ต ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ธ ๊ฒ์์ ์์์ผ ํ๋ค.
โ OR ์ฐ์ฐ์์ ๊ฒฝ์ฐ
์ ์์๋ ๋ชจ๋ AND ์ฐ์ฐ์๋ก ์ฐ๊ฒฐ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ ๊ฒ์ด๊ณ , OR ์ฐ์ฐ์๊ฐ ์์ผ๋ฉด ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด ์์ ํ ๋ฐ๋๋ค.
์๋์ ์์์์ first_name์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์๊ณ , last_name์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
SELECT *
FROM employees
WHERE first_name="kim" OR last_name="hs";
์ด ๋ ์กฐ๊ฑด์ด AND๋ก ์ฐ๊ฒฐ๋์๋ค๋ฉด first_name์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์์ง๋ง OR ์ฐ์ฐ์๋ก ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ ํ
์ด๋ธ ํ ์ค์บ์ ์ ํํ ์๋ฐ์ ์๋ค.
์๋ํ๋ฉด, (์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ) + (ํ ํ
์ด๋ธ ์ค์บ) ์ ํ๋๊ฒ๋ณด๋ค (ํ ํ
์ด๋ธ ์ค์บ) ์์
ํ ๋ฒ์ด ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ, first_name๊ณผ last_name ๋ ๋ค ๊ฐ๊ฐ ์ธ๋ฑ์ค๊ฐ ์๋ฐ๋ฉด index_merge ์ ๊ทผ ๋ฐฉ๋ฒ์ผ๋ก ์คํํ ์ ์๋ค.
ํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ด ๋ฌผ๋ก ํ ํ
์ด๋ธ ์ค์บ๋ณด๋ค๋ ๋น ๋ฅด์ง๋ง ์ฌ์ ํ ์ ๋๋ก ๋ ์ธ๋ฑ์ค ํ๋๋ฅผ ๋ ์ธ์ง ์ค์บํ๋ ๊ฒ๋ณด๋ค๋ ๋๋ฆฌ๋ค.
WHERE์ ์์ ๊ฐ ์กฐ๊ฑด์ด AND๋ก ์ฐ๊ฒฐ๋๋ฉด ์ฝ์ด์์ผ ํ ๋ ์ฝ๋์ ๊ฑด์๋ฅผ ์ค์ด๋ ์ญํ ์ ํ์ง๋ง ๊ฐ ์กฐ๊ฑด์ด OR๋ก ์ฐ๊ฒฐ๋๋ฉด ์ฝ์ด์ ๋น๊ตํด์ผ ํ ๋ ์ฝ๋๊ฐ ๋ ๋์ด๋๊ธฐ ๋๋ฌธ์ WHERE ์กฐ๊ฑด์ OR ์ฐ์ฐ์๊ฐ ์๋ค๋ฉด ์ฃผ์ํด์ผ ํ๋ค.
4. GROUP BY ์ ์ธ๋ฑ์ค ์ฌ์ฉ
GROUP BY ์ ์ ๊ฐ ์ปฌ๋ผ์ ๋น๊ต์ฐ์ฐ์๋ฅผ ๊ฐ์ง์ง ์์ผ๋ฏ๋ก ์์
๋ฒ์ ๊ฒฐ์ ์กฐ๊ฑด์ด๋ ์ฒดํฌ ์กฐ๊ฑด๊ณผ ๊ฐ์ด ๊ตฌ๋ถํด์ ์๊ฐํ ํ์๊ฐ ์๋ค.
GROUP BY ์ ์ ๋ช
์๋ ์ปฌ๋ผ์ ์์๊ฐ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ปฌ๋ผ์ ์์์ ๊ฐ์ผ๋ฉด GROUP BY ์ ์ ์ผ๋จ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์๋ค.
GROUP BY์ ์ ์๋์ ๊ฐ์ ์ธ๋ฑ์ค ์ฌ์ฉ ์กฐ๊ฑด์ด ์กด์ฌํ๋ค. (๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค, but ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค๋ ๋์ผํ๊ฒ ์ ์ฉ๋จ)
- GROUP BY์ ์ ๋ช ์๋ ์ปฌ๋ผ์ด ์ธ๋ฑ์ค ์ปฌ๋ผ์ ์์์ ์์น๊ฐ ๊ฐ์์ผ ํ๋ค.
- ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ปฌ๋ผ ์ค์์ ๋ค์ชฝ์ ์๋ ์ปฌ๋ผ์ GROUP BY ์ ์ ๋ช ์๋์ง ์์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ์ธ๋ฑ์ค์ ์์ชฝ์ ์๋ ์ปฌ๋ผ์ด GROUP BY์ ์ ๋ช ์๋์ง ์์ผ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- WHERE ์กฐ๊ฑด์ ๊ณผ๋ ๋ฌ๋ฆฌ GROUP BY์ ์ ๋ช ์๋ ์ปฌ๋ผ์ด ํ๋๋ผ๋ ์ธ๋ฑ์ค์ ์์ผ๋ฉด GROUP BY ์ ์ ์ ํ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ง ๋ชปํ๋ค.
GROUP BY์ ์ WHERE๊ณผ ๋ค๋ฅด๊ฒ ์ธ๋ฑ์ค ์ปฌ๋ผ์ ์์๊ฐ ์ค์ํ๊ฒ ์์ฉํ๋๊ฒ ๊ฐ๋ค.
์๋๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ฅผ ๋์ดํ ๊ฒ์ด๋ค.
.. GROUP BY COL_2, COL_1;
.. GROUP BY COL_1, COL_3, COL_2;
.. GROUP BY COL_1, COL_3;
.. GROUP BY COL_1, COL_2, COL_3, COL_4, COL_5;
์ด๋ฒ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋์ดํ๋ค.
.. GROUP BY COL_1;
.. GROUP BY COL_1, COL_2;
.. GROUP BY COL_1, COL_2, COL_3;
.. GROUP BY COL_1, COL_2, COL_3, COL_4;
์ฌ๊ธฐ์๋, ์์ธ๋ ์กด์ฌํ๋ค.
๋ง์ฝ WHERE ์กฐ๊ฑด์ ์์ COL_1์ด ๋๋ฑ ๋น๊ต ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ค๋ฉด GROUP BY ์ ์ COL_1์ด ๋น ์ ธ๋ ์ธ๋ณ๋ฅด๋ฅด ์ด์ฉํ GROUP BY๊ฐ ๊ฐ๋ฅํ ๋๋ ์๋ค.
5. ORDER BY ์ ์ ์ธ๋ฑ์ค ์ฌ์ฉ
MySQL์์ GROUP BY์ ORDER B๋ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด ์๋นํ ๋น์ทํ๋ค.
ํ์ง๋ง ๋ค๋ฅธ์ ์ด ์๋ค๋ฉด, ์ ๋ ฌ๋๋ ๊ฐ ์ปฌ๋ผ์ ์ค๋ฆ์ฐจ์(ASC) ๋ฐ ๋ด๋ฆผ์ฐจ์(DESC) ์ต์
์ด ์ธ๋ฑ์ค์ ๊ฐ๊ฑฐ๋ ์ ๋ฐ๋์ธ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
6. WHERE ์กฐ๊ฑด๊ณผ ORDER BY(๋๋ GROUP BY) ์ ์ ์ธ๋ฑ์ค ์ฌ์ฉ
์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ๋ WHERE ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ ํ์ ์ผ๋ก ORDER BY๋ GROUP BY์ ์ ํฌํจํ ๊ฒ์ด๋ค.
์ฟผ๋ฆฌ์ WHERE์ ๋ง ๋๋ GROUP BY๋ ORDER BY์ ๋ง ํฌํจ๋ผ ์๋ค๋ฉด ์ฌ์ฉ๋ ์ ํ๋์๋ง ์ด์ ์ ๋ง์ถฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ํ๋ฉด ๋๋ค.
ํ์ง๋ง, WHERE์ + ORDER BY์ ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ ๋ WHERE์ ๊ณผ ORDER BY์ ์ด ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
์ด๋ WHERE+GROUP BY ๋๋ GROUP BY+ORDER BY์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
WHERE ์ ๊ณผ ORDER BY(๋๋ GROUP BY) ์ ์ด ๊ฐ์ด ์ฌ์ฉ๋ ์ฟผ๋ฆฌ ๋ฌธ์ฅ์ ๋ค์ 3๊ฐ์ง ์ค ํ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก๋ง ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋ค.
- WHERE์ ๊ณผ ORDER BY์ ์ด ๋์์ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉ
- WHERE์ ์ ๋น๊ต ์กฐ๊ฑด์์ ์ฌ์ฉํ๋ ์ปฌ๋ผ๊ณผ ORDER BY ์ ์ ์ ๋ ฌ ๋์ ์ปฌ๋ผ์ด ๋ชจ๋ ํ๋์ ์ธ๋ฑ์ค์ ์ฐ์ํด์ ํฌํจ๋ผ ์์ ๋ ์ด ๋ฐฉ์์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ๋๋จธ์ง ๋ฐฉ๋ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ด๋ฏ๋ก ๊ฐ๋ฅํ๋ค๋ฉด ์ด ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ์ฟผ๋ฆฌ๋ฅผ ํ๋ํ๊ฑฐ๋ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋๊ฒ ์ข๋ค,
- WHERE ์ ๋ง ์ธ๋ฑ์ค๋ฅผ ์ด์ฉ
- ORDER BY์ ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ์ธ๋ฑ์ค๋ฅผ ํตํด ๊ฒ์๋ ๊ฒฐ๊ณผ ๋ ์ฝ๋๋ฅผ ๋ณ๋์ ์ฒ๋ฆฌ๊ณผ์ (Using Filesort)์ ๊ฑฐ์ณ ์ ๋ ฌ ์ํํ๋ค.
- ์ฃผ๋ก WHERE์ ์ ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ ์ฝ๋์ ๊ฑด์๊ฐ ๋ง์ง ์์ ๋ ํจ์จ์ ์ธ ๋ฐฉ์์ด๋ค.
- ORDER BY ์ ๋ง ์ธ๋ฑ์ค๋ฅผ ์ด์ฉ
- ORDER BY ์ ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ง๋ง, WHERE์ ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ง ๋ชปํ๋ค.
- ์ด ๋ฐฉ์์ ORDER BY์ ์ ์์๋๋ก ์ธ๋ฑ์ค๋ฅผ ์ฝ์ผ๋ฉด์ ๋ ์ฝ๋ ํ ๊ฑด์ฉ WHERE์ ์ ์กฐ๊ฑด์ ์ผ์นํ๋์ง ๋น๊ตํ๊ณ , ์ผ์นํ์ง ์์ ๋๋ ๋ฒ๋ฆฌ๋ ํํ๋ก ์ฒ๋ฆฌํ๋ค.
- ์ฃผ๋ก ์์ฃผ ๋ง์ ๋ ์ฝ๋๋ฅผ ์ ๋ ฌํด์ผ ํ ๋๋ ์ด๋ฐ ํํ๋ก ํ๋ํ๊ธฐ๋ ํ๋ค.
๋ํ,
1. WHERE ์ ์์ ๋๋ฑ ๋น๊ต ์กฐ๊ฑด์ผ๋ก ๋น๊ต๋ ์ปฌ๋ผ๊ณผ ORDER BY ์ ์ ๋ช
์๋ ์ปฌ๋ผ์ด ์์๋๋ก ๋น ์ง์์ด ์ธ๋ฑ์ค ์ปฌ๋ผ์ ์ผ์ชฝ๋ถํฐ ์ผ์นํด์ผ ํ๋ค.
2. WHERE ์ ์ ๋๋ฑ ๋น๊ต ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋ ์ปฌ๋ผ๊ณผ ORDER BY์ ์ ์ปฌ๋ผ์ด ์ค์ฒฉ๋๋ ๋ถ๋ถ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
์ด๊ฒฝ์ฐ ์ค๊ฐ์ ๋น ์ง๋ ์ปฌ๋ผ์ด ์์ผ๋ฉด WHERE์ ์ด๋ ORDER BY์ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด๋๋ ์ฃผ๋ก WHERE์ ๋ง ์ธ๋ฑ์ค ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
โ ์ ๊ทธ๋ฆผ์์ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ORDER BY์ ์ ํด๋น ์ปฌ๋ผ์ด ์ฌ์ฉ๋๊ณ ์๋ค๋ฉด WHERE ์ ์ ๋๋ฑ ๋น๊ต ์ด์ธ์ ์ฐ์ฐ์(ex.๋ฒ์ ๋น๊ต ์ฐ์ฐ์)๋ก ๋น๊ต๋ผ๋ WHERE์ ๊ณผ ORDER BY์ ์ด ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก WHERE ์ ์์ ๋๋ฑ ๋น๊ต๋ก ์ฌ์ฉ๋ ์ปฌ๋ผ๊ณผ ORDER BY ์ ์ ์ปฌ๋ผ์ด ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ปฌ๋ผ๊ณผ ๊ฐ์ ์์๋ก ์ฐ์ํด์ ์ฌ์ฉ๋๋์ง๋ฅผ ํ์ธํด์ผ ํ๋ค.
(1) ์๋๋ ์ ๊ทธ๋ฆผ์์ ์ผ์ชฝ ๊ทธ๋ฆผ์ ํด๋นํ๋ ์์ ์ด๋ค. ํด๋น ์ฟผ๋ฆฌ๋ ORDER BY COL_1, COL_2, COL_3์ ๋์ผํ๊ฒ ๋์ํ๋ค.
SELECT * FROM test WHERE COL_1=10 ORDER BY COL_2, COL_3;
์ด ์ฟผ๋ฆฌ์์ WHERE ์กฐ๊ฑด์ด ์์๋ก ๋๋ฑ๋น๊ต๋ฅผ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ORDER BY์ ์ COL_1 ์ปฌ๋ผ์ ์ถ๊ฐํด๋ ์ ๋ ฌ ์์์ ๋ณํ๊ฐ ์๋ค.
ํ์ง๋ง, ์ด๋ ๊ฒ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋๊ฒ์ด ์ธ๋ฑ์ค ์ฌ์ฉ์ฌ๋ถ๋ฅผ ๋ ์ฝ๊ฒ ํ๋จํ ์ ์๋ค.
(2) ์ด์ ๋ฒ์ ์กฐ๊ฑด ๋น๊ต๊ฐ ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ ์์ ์ ๋ํด ์ดํด๋ณด์.
SELECT * FROM test WHERE COL_1 > 10 ORDER BY COL_1, COL_2, COL_3;
SELECT * FROM test WHERE COL_1 > 10 ORDER BY COL_2, COL_3;
๊ฒฐ๋ก ์ ์ผ๋ก, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉ๊ฐ๋ฅํ๊ณ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๋ค.
์๋ํ๋ฉด, 1๏ธโฃ ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ COL_1 > 10 ์กฐ๊ฑด์ ๋ง์กฑํ๋ COL_1๊ฐ์ ์ฌ๋ฌ ๊ฐ์ผ ์ ์์ง๋ง ORDER BY์ ์์ COL_1๋ถํฐ COL_3๊น์ง ์์๋๋ก ๋ชจ๋ ๋ช
์๋๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด WHERE์ ๊ณผ ORDER BY์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
ํ์ง๋ง, 2๏ธโฃ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์์๋ WHERE์ ์์ COL_1์ด ๋ฒ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋๋ฐ, ORDER BY์๋ COL_1์ด ๋ช ์๋์ง ์์๊ธฐ ๋๋ฌธ์ ORDER BY์์๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์๋ค.
์์์ ๊ณ์ WHERE + ORDER BY๋ฅผ ๊ธฐ์ค์ผ๋ก ๋งํ์ง๋ง WHERE + GROUP BY ๋ ๋๊ฐ๋ค.
7. GROUP BY์ ๊ณผ ORDER BY ์ ์ ์ธ๋ฑ์ค ์ฌ์ฉ
GROUP BY์ ORDER BY ์ ์ด ๋์์ ์ฌ์ฉ๋ ์ฟผ๋ฆฌ์์ ๋ ์ ์ด ๋ชจ๋ ํ๋์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌ๋๋ ค๋ฉด GROUP BY์ ์ ๋ช ์๋ ์ปฌ๋ผ๊ณผ ORDER BY์ ์ ๋ช ์๋ ์ปฌ๋ผ์ ์์์ ๋ด์ฉ์ด ๋ชจ๋ ๋์ผํด์ผ ํ๋ค.
GROUP BY๋ ORDER BY ์ค ๋ ์ค ํ๋๋ผ๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์์ ๋๋ ๋ ๋ค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ค.
์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ๋ ๋ค ์ธ๋ฑ์ค ์ฌ์ฉ ๋ถ๊ฐํ๋ค.
... GROUP BY col_1, col_2 ORDER BY col_2;
... GROUP BY col_1, col_2 ORDER BY col_1, col_3;
8. WHERE ์กฐ๊ฑด๊ณผ ORDER BY ์ , GROUP BY ์ ์ ์ธ๋ฑ์ค ์ฌ์ฉ
WHERE์ ๊ณผ GROUP BY์ , ORDER BY์ ์ด ๋ชจ๋ ํฌํจ๋ ์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋์ง ํ๋จํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด 3๊ฐ์ง ์ง๋ฌธ์ ๊ธฐ๋ณธ์ผ๋ก ํด์ ์๋์ ๊ทธ๋ฆผ์ ํ๋ฆ์ ์ ์ฉํด๋ณด๋ฉด ๋๋ค.
โ
1. WHERE ์ ์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฐ?
โ
2. GROUP BY ์ ์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฐ?
โ
3. GROUP BY ์ ๊ณผ ORDER BY ์ ์ด ๋์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฐ?
9. WHERE ์ ์ ๋น๊ต ์กฐ๊ฑด ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
์ฟผ๋ฆฌ๊ฐ ์ต์ ์ผ๋ก ์คํ๋๋ ค๋ฉด ์ ํฉํ ์ธ๋ฑ์ค์ ํจ๊ป WHERE ์ ์ ์ฌ์ฉ๋๋ ๋น๊ต ์กฐ๊ฑด์ ํํ์์ ์ ์ ํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค.
9-1. NULL ๋น๊ต
โ
๋ค๋ฅธ DBMS์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ MySQL์์๋ NULL ๊ฐ์ด ํฌํจ๋ ๋ ์ฝ๋๋ ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌ๋๋ค. ์ด๋ ์ธ๋ฑ์ค์์๋ NULL์ ํ๋์ ๊ฐ์ผ๋ก ์ธ์ ํด์ ๊ด๋ฆฌํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
SQL ํ์ค์์ NULL์ ์ ์๋ ๋น๊ตํ ์ ์๋ ๊ฐ์ด๋ค. ๋ฐ๋ผ์, ๋ ๊ฐ์ด ๋ชจ๋ NULL์ผ ๋ ์ด ๋ ๊ฐ์ด ๋๋ฑํ์ง ๋น๊ตํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ฟผ๋ฆฌ์์ NULL์ธ์ง ๋น๊ตํ๋ฌ๋ฉด "IS NULL" (๋๋ "<=>") ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
SELECT * FROM titles WHERE to_date IS NULL;
+----+--------+------+-----------+-------------------------+
| id | table | type | key | Extra |
+----+--------+------+-----------+-------------------------+
| 1 | titles | ref | ix_todate | Using where; Using index|
+----+--------+------+-----------+-------------------------+
์์ ๊ฐ์ด SELECT ์ฟผ๋ฆฌ๋ฅผ ํตํด to_date๊ฐ NULL์ธ ๋ ์ฝ๋๋ฅผ ์กฐํํ ๋, to_date ์ปฌ๋ผ์ ์์ฑ๋ ix_todate ์ธ๋ฑ์ค๋ฅผ ref ๋ผ๋ type์ผ๋ก ์ ์ ํ ์ด์ฉํ๊ณ ์์์ ์ ์ ์๋ค.
ISNULL() ํจ์๋ฅผ ์ด์ฉํ์ฌ NULL์ธ์ง ํ์ธํ ์๋ ์๋๋ฐ ๊ทธ๋๋ ์ฃผ์ํด์ผ ํ๋ ์ ์ด ์๋ค.
1. WHERE to_date IS NULL;
2. WHERE ISNULL(to_date);
3. WHERE ISNULL(to_date)=1;
4. WHERE ISNULL(to_date)=true;
1๋ฒ๊ณผ 2๋ฒ์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ ์ฌ์ฉํ์ง๋ง, 3๋ฒ๊ณผ 4๋ฒ์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ ํ
์ด๋ธ ํ ์ค์บ์ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ NULL ๋น๊ต์์๋ IS NULL ์ฐ์ฐ์ ์ด์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
9-2. ๋ฌธ์์ด์ด๋ ์ซ์ ๋น๊ต
โ ๋ฌธ์์ด ์ปฌ๋ผ์ด๋ ์ซ์ ์ปฌ๋ผ์ ๋น๊ตํ ๋๋ ๋ฐ๋์ ๊ทธ ํ์ ์ ๋ง๋ ์์ซ๊ฐ์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๋ค.
๋์ผํ ํ์
์ผ๋ก ๋น๊ตํ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ ์ฌ์ฉํ ์ ์์ง๋ง,
์ปฌ๋ผ์ ํ์
์ด ๋ฌธ์์ด์ด๊ณ ๋น๊ต ์์ซ๊ฐ์ด ์ซ์์ธ๊ฒฝ์ฐ์๋ ์ตํฐ๋ง์ด์ ๊ฐ ์ซ์ํ์
์ผ๋ก ๋น๊ต๋ฅผ ์ํํ๋ ค๊ณ ์คํ ๊ณํ์ ์๋ฆฝํ๊ธฐ ๋๋ฌธ์
ํด๋น ์ปฌ๋ผ์ ํ์
๋ณํ์ด ํ์ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋๋ค.
9-3. ๋ ์ง ๋น๊ต
MySQL์๋ ๋ ์ง๋ง ์ ์ฅํ๋ DATE ํ์ , ๋ ์ง์ ์๊ฐ์ ํจ๊ผ ์ ์ฅํ๋ DATETIME๊ณผ TIMESTAMP ํ์ , ๊ทธ๋ฆฌ๊ณ ์๊ฐ๋ง ์ ์ฅํ๋ TIME ํ์ ์ด ์กด์ฌํ๋ค.
(1) DATE ๋๋ DATETIME๊ณผ ๋ฌธ์์ด ๋น๊ต
DATE ๋๋ DATETIME ํ์ ์ ๊ฐ๊ณผ ๋ฌธ์์ด์ ๋น๊ตํ ๋๋ ๋ฌธ์์ด ๊ฐ์ ์๋์ผ๋ก DATETIME ํ์ ์ ๊ฐ์ผ๋ก ๋ณํํด์ ๋น๊ต๋ฅผ ์ํํ๋ค.
์๋์ ๊ฐ์ ์ฟผ๋ฆฌ์ฒ๋ผ STR_TO_DATE() ํจ์๋ฅผ ์ด์ฉํด ๋ฌธ์์ด "2023-08-15"์ DATE ํ์ ์ผ๋ก ๋ณํํ ์๋ ์์ง๋ง, ์ด๋ ๊ฒ ์ปฌ๋ผ์ ํ์ ์ด DATE๋ DATETIME ์ด๋ฉด ๋ณ๋๋ก ๋ฌธ์์ด์ DATE๋ DATETIME์ผ๋ก ๋ช ์์ ์ผ๋ก ๋ณํํ์ง ์์๋ MySQL์์ ๋ด๋ถ์ ์ผ๋ก ๋ณํ์ ์ํํ๋ค.
mysql> SELECT COUNT(*) FROM employees WHERE hire_date > STR_TO_DATE('2023-08-15', '%Y-%m-%d');
mysql> SELECT COUNT(*) FROM employees WHERE hire_date > '2011-07-23';
๊ฒฐ๋ก ์ ์ผ๋ก ์์ ๋ ์ฟผ๋ฆฌ๋ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ด์ฉํ๋ฉฐ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋๋ค.
ํ์ง๋ง ์๋์ ๊ฐ์ด DATE๋ DATETIME ํ์ ์ปฌ๋ผ์ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์ด ๊ฒฝ์ฐ๋ ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
SELECT COUNT(*) FROM employees WHERE DATE_FORMAT(hire_date, '%Y-%m-%d') > '2023-08-15';
(2) DATE์ DATETIME์ ๋น๊ต
DATETIME ๊ฐ์์ ์๊ฐ ๋ถ๋ถ๋ง ๋ผ์ด ๋ฒ๋ฆฌ๊ณ ๋น๊ตํ๋ ค๋ฉด ๋ค์ ์ฟผ๋ฆฌ์ ๊ฐ์ด DATE()ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
SELECT COUNT(*) FROM employees WHERE hire_date > DATE(NOW());
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก, DATETIME ๊ฐ์ DATE ํ์ ์ผ๋ก ๋ง๋ค์ง ์๊ณ ๋น๊ตํ๋ฉด MySQL ์๋ฒ๊ฐ DATE ํ์ ์ ๊ฐ์ DATETIME์ผ๋ก ๋ณํํด์ ๊ฐ์ ํ์ ์ ๋ง๋ ๋ค์ ๋น๊ต๋ฅผ ์ํํ๋ค.
DATETIME๊ณผ DATE ํ์ ์ ๋น๊ต์์ ํ์ ๋ณํ์ ์ธ๋ฑ์ค์ ์ฌ์ฉ ์ฌ๋ถ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ๋ณด๋ค๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์ฃผ์ํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
(3) DATETIME๊ณผ TIMESTAMP์ ๋น๊ต
DATE๋ DATETIME ํ์
๊ฐ๊ณผ TIMESTAMP์ ๊ฐ์ ๋ณ๋์ ํ์
๋ณํ ์์ด ๋น๊ตํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ผ๋ก ๋์ํ์ง ์๊ณ ์ค์ ๊ฒฐ๊ณผ ๊ฐ์ด ์๋ชป ์ถ๋ ฅ๋ ์ ์๋ค.
- FROM_UNIXTIME() ํจ์
- ์ปฌ๋ผ์ด DATETIME ํ์ ์ผ ๋, TIMESTAMP -> DATETIME ๊ฐ์ผ๋ก ๋ณํ
- UNIX_TIMESTAMP() ํจ์
- ์ปฌ๋ผ์ด TIMESTAMP ํ์ ์ผ ๋, DATETIME -> TIMESTAMP ๊ฐ์ผ๋ก ๋ณํ
9-4. โญ๏ธ Short-Circuit Evaluation
Short-Circuit Evaluation์ด๋ ์ฌ๋ฌ ๊ฐ์ ํํ์์ด AND ๋๋ OR ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ก ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ ์ ํ ํํ์์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํํ ํํ์์ ํ๊ฐํ ์ง ๋ง์ง ๊ฒฐ์ ํ๋ ์ต์ ํ๋ฅผ ์๋ฏธํ๋ค.
๋ค์๊ณผ ๊ฐ์ ํํ์์ ์๋ ๋ฐฉ์์ ์ดํด๋ณด์.
boolean is_valid;
if (is_valid && has_modified()) {
commit();
}
isValid ๋ถ๋ฆฌ์ธ ๋ณ์์ ๊ฐ์ด TRUE์ด๋ฉด has_modified() ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ๊น์ง TRUE๋ผ๋ฉด commit() ํจ์๊ฐ ์คํ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง, ๋ ์ค ํ๋๋ผ๋ FALSE์ด๋ฉด commit()์ ์คํ๋์ง ์๋๋ค.
๋ฐ๋ผ์, ์ ํ ํํ์์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํํ ํํ์์ ํ๊ฐํ ์ง ๋ง์ง ๊ฒฐ์ ํ์ฌ ์ต์ ํ ํด์ผ ํ๋ค.
MySQL์์ "short-circuit evaluation"์ด ์ด๋ป๊ฒ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋์ง ๋ณด์.
์๋ ์ฟผ๋ฆฌ์์ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ณ ํ ํ
์ด๋ธ ์ค์บ์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ค.
-- // 1๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋ ๊ฑด์
SELECT COUNT(*) FROM salaries
WHERE CONVERT_TZ(from_date,'+00:00', '+09:00') > '1991-01-01';
+----------+
| COUNT(*) |
+----------+
| 2442943 |
+----------+
-- // 2๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋ ๊ฑด์
SELECT COUNT(*) FROM salaries
WHERE to_date < '1985-01-01' ;
+----------+
| COUNT(*) |
+----------+
| 0 |
+----------+
1๋ฒ ์กฐ๊ฑด๊ณผ 2๋ฒ ์กฐ๊ฑด์ AND๋ก ์ฐ๊ฒฐํ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ 0๊ฑด์ด ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์กฐ๊ฑด์ ์์๊ฐ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๋ ๊ฒ์ ์๊ฐํด์ผ ํ๋ค.
-- // (1๋ฒ ์กฐ๊ฑด, 2๋ฒ ์กฐ๊ฑด) ์์ผ๋ก ์กฐํฉ
SELECT * FROM salaries
WHERE CONVERT_TZ(from_date,'+00:00', '+09:00') > '1991-01-01'
AND to_date < '1985-01-01';
==> (0.73 sec)
-- // (2๋ฒ ์กฐ๊ฑด, 1๋ฒ ์กฐ๊ฑด) ์์ผ๋ก ์กฐํฉ
SELECT * FROM salaries
WHERE to_date < '1985-01-01'
AND CONVERT_TZ(from_date,'+00:00', '+09:00') > '1991-01-01';
==> (0.52 sec)
2๋ฒ ์กฐ๊ฑด์ ๋จผ์ ์ฌ์ฉํ์ ๋, ์ฟผ๋ฆฌ ์๋ต์๊ฐ์ด 0.21์ด ๋ ๋น ๋ฅธ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ณ ์ฐจ์ด ์์ด ๋ณด์ผ ์ ์์ง๋ง 1๋ฒ ์กฐ๊ฑด์ด ๋ ๋ง์ CPU๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ ๋ง์ ์์์ ์ฌ์ฉํ๋ ์กฐ๊ฑด์ด์๋ค๋ฉด ์๊ฐ ์ฐจ์ด๋ ๋ ์ปค์ก์ ๊ฒ์ด๋ค.
(1) 1๋ฒ ์กฐ๊ฑด์ด ๋จผ์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ์์ MySQL ์๋ฒ๋ salaries ํ
์ด๋ธ์ ์ ์ฒด ๋ ์ฝ๋์ ๋ํด CONVERT_TZ() ํจ์๋ฅผ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ์ ๋ํด to_date ๋น๊ต ์์
์ ์ ์กฐ๊ฑด์์ ํํฐ๋ง ๋ ๋ ์ฝ๋์ ์๋งํผ ์คํํ๋ค.
(2) 2๋ฒ ์กฐ๊ฑด์ด ๋จผ์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ์์๋ ํด๋น ์กฐ๊ฑด ๋น๊ต ์์
๋ง ์ ์ฒด ๋ ์ฝ๋์ ์ ๋งํผ๋ง ์งํํ๋ฉด ๋๊ณ CONVERT_TZ() ํจ์๋ ํ ๋ฒ๋ ์คํ๋์ง ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ด 30% ์ ๋ ๋นจ๋ผ์ง ๊ฒ์ด๋ค.
MySQL ์๋ฒ๋ ์ฟผ๋ฆฌ์ WHERE ์ ์ ๋์ด๋ ์กฐ๊ฑด์ ์์๋๋ก "Short-circuit evaluation"๋ฐฉ์์ผ๋ก ํ๊ฐํด์ ํด๋น ๋ ์ฝ๋๋ฅผ ๋ฐํํด์ผ ํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
โญ๏ธ โญ๏ธ โญ๏ธ ๊ทธ๋ฐ๋ฐ WHERE ์กฐ๊ฑด ์ค์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ์กฐ๊ฑด์ด ์๋ค๋ฉด "Short-circuit evaluation"๊ณผ๋ ๋ฌด๊ดํ๊ฒ ํด๋น ์กฐ๊ฑด์ ๊ฐ์ฅ ์ต์ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก WHERE ์กฐ๊ฑด์ ์ ๋์ด๋ ์กฐ๊ฑด์ ์์๊ฐ ์ธ๋ฑ์ค์ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ์ง๋ ์๋๋ค.
์๋์ ๊ฐ์ ์ฟผ๋ฆฌ์์ first_name ์ปฌ๋ผ๋ง ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด,
first_name ๋น๊ต ์กฐ๊ฑด ๋ถํฐ ์ฐ์ ์คํ๋๊ณ ๊ทธ ๋ค์์ last_name, birth_date ์์ผ๋ก ๋น๊ต ์กฐ๊ฑด์ด ์คํ๋๋ค.
SELECT * FROM employees
WHERE last_name='hyeon'
AND first_name='kim'
AND MONTH(birth_date)=1;
์กฐ๊ธ ๋ ๋ณต์กํ ์์ ๋ฅผ ์ดํด๋ณด์. ์ฐธ๊ณ ๋ก ์๋ ์ฟผ๋ฆฌ์ EXISTS (subquery) ๋ถ๋ถ์ GROUP BY.. HAVING .. ์ ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ MySQL์ ์ธ๋ฏธ ์กฐ์ธ ์ต์ ํ๋ฅผ ํ์ฉํ ์ ์๋ ํํ์ด๋ค. ๋ํ, first_name ์ปฌ๋ผ๋ง ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
SELCET * FROM employees e
WHERE e.first_name='Kim'
AND EXISTS (SELECT 1 FROM salaries s
WHERE s.emp_no=e.emp_no AND s.to_date > '1999-01-01'
GROUP BY s.salary HAVING COUNT(*)>1)
AND e.last_name='hyeon';
์ ์ฟผ๋ฆฌ์์ ์ฐ์ 1๏ธโฃ ์ฒซ ๋ฒ์งธ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ first_name ์ปฌ๋ผ ์กฐ๊ฑด์ด ์ต์ฐ์ ์ผ๋ก ์คํ๋์ด ๋ฐ์ดํฐ์ ๋ฒ์๋ฅผ ์ต์ํํ๋ค.
๊ทธ๋ฆฌ๊ณ WHERE์ ์์ ์๋ธ์ฟผ๋ฆฌ ์กฐ๊ฑด์ด last_name ์กฐ๊ฑด๋ณด๋ค ๋จผ์ ๋์ด๋๊ธฐ ๋๋ฌธ์ MySQL ์๋ฒ๋ 2๏ธโฃ ๋ ๋ฒ์งธ๋ก EXIST(subquery) ์กฐ๊ฑด์ ๋จผ์ ํ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์ 3๏ธโฃ ์ธ ๋ฒ์งธ๋ก last_name ์กฐ๊ฑด์ด ํ๊ฐ๋๋ ์์ผ๋ก ์คํ๋๋ค.
์ด ๊ฒฝ์ฐ์ last_name์ ๋น๊ต ์กฐ๊ฑด์ด ๋จผ์ ์คํ๋๋ ๊ฒ ์ ๋ฆฌํ์ง๋ง ์์์ ๊ทธ๋ ์ง ๋ชปํ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
์ด๋ฒ์๋ ์๋์ ๊ฐ์ด EXIST(subquery) ์กฐ๊ฑด๊ณผ last_name ์กฐ๊ฑด ์์๋ฅผ ๋ณ๊ฒฝํด์ ์ต๋ํ ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ํํฐ๋งํ๋๊ฒ ์ ๋ฆฌํ๋ค. ์ด ๊ฒฝ์ฐ์๋ first_name -> last_name ๋น๊ต๋ก ์ธํด 1๊ฐ์ ๋ ์ฝ๋๊ฐ ๊ฒ์๋์๊ณ ์ด 1๊ฐ์ ๋ ์ฝ๋์ ๋ํด์๋ง EXIST (subquery)์กฐ๊ฑด ๋ง์กฑ ์ฌ๋ถ๋ฅผ ํ๊ฐํจ์ผ๋ก์จ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
SELCET * FROM employees e
WHERE e.first_name='Kim'
AND e.last_name='hyeon'
AND EXISTS (SELECT 1 FROM salaries s
WHERE s.emp_no=e.emp_no AND s.to_date > '1999-01-01'
GROUP BY s.salary HAVING COUNT(*)>1);
โญ๏ธโญ๏ธโญ๏ธ ๊ฒฐ๋ก ์ ์ผ๋ก, MySQL ์๋ฒ์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋ ๊ฐ๋ฅํ๋ฉด ๋ณต์กํ ์ฐ์ฐ ๋๋ ๋ค๋ฅธ ํ
์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ผ ํ๋ ์๋ธ์ฟผ๋ฆฌ ์กฐ๊ฑด ๋ฑ์ WHERE ์ ์ ๋ค์ชฝ์ผ๋ก ๋ฐฐ์นํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ๋์์ด ๋๋ค.
๋ฌผ๋ก , WHERE ์กฐ๊ฑด ์ค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ์กฐ๊ฑด์ ์ด๋ ์์น์ ์๋์ง ๋จผ์ ์คํ๋๋ฏ๋ก ์์๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค.
9-5. DISTINCT
ํน์ ์ปฌ๋ผ์ ์ ๋ํฌํ ๊ฐ์ ์กฐํํ๋ ค๋ฉด SELECT ์ฟผ๋ฆฌ์ DISTINCT๋ฅผ ์ฌ์ฉํ๋ค.
๋ง์ ์ฌ์ฉ์๋ค์ด ์กฐ์ธ์ ํ๋ ๊ฒฝ์ฐ ๋ ์ฝ๋๊ฐ ์ค๋ณตํด์ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด DISTINCT๋ฅผ ๋จ์ฉํ๋ ๊ฒฝํฅ์ด ์๋ค.
DISTINCT๋ฅผ ๋จ์ฉํ๋ ๊ฒ์ ์ฑ๋ฅ์์ ๋ฌธ์ ๋ ์์ง๋ง ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ์๋์ ๋ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
9-6. LIMIT n
LIMIT์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์์ ์ง์ ๋ ์์์ ์์นํ ๋ ์ฝ๋๋ง ๊ฐ์ ธ์ค๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
SELECT * FROM employees
WHERE emp_no BETWEEN 10001 AND 10010
ORDER BY first_name
LIMIT 0, 5;
์์ ์ฟผ๋ฆฌ๋ ์๋์ ๊ฐ์ ์์๋ก ์คํ๋๋ค.
- employees ํ ์ด๋ธ์์ WHERE ์ ์ ๊ฒ์ ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์ ๋ถ ์ฝ์ด ์จ๋ค.
- 1๋ฒ์์ ์ฝ์ด์จ ๋ ์ฝ๋๋ฅผ first_name ์ปฌ๋ผ๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌํ๋ค.
- ์ ๋ ฌ๋ ๊ฒฐ๊ณผ์์ ์์ 5๊ฑด๋ง ์ฌ์ฉ์์๊ฒ ๋ฐํํ๋ค.
MySQL์ LIMIT์ WHERE ์กฐ๊ฑด์ด ์๋๊ธฐ ๋๋ฌธ์ ํญ์ ์ฟผ๋ฆฌ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์คํ๋๋ค.
โ
LIMIT์ ์ค์ํ ํน์ฑ์ LIMIT์์ ํ์ํ ๋ ์ฝ๋ ๊ฑด์๋ง ์ค๋น๋๋ฉด ์ฆ์ ์ฟผ๋ฆฌ๋ฅผ ์ข
๋ฃํ๋ค๋ ๊ฒ์ด๋ค.
โ
์ฆ, ์์ ์ฟผ๋ฆฌ์์ ๋ชจ๋ ๋ ์ฝ๋์ ์ ๋ ฌ์ด ์๋ฃ๋์ง ์์๋ค ํ๋๋ผ๋ ์์ 5๊ฑด๊น์ง๋ง ์ ๋ ฌ๋๋ฉด ์์
์ ๋ฉ์ถ๋ค๋ ๊ฒ์ด๋ค!
์๋ ์์ ๋ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ๋ค.
- 1๏ธโฃ SELECT * FROM employees LIMIT 0, 10;
- ํ ํ ์ด๋ธ ์ค์บ์ ์คํํ๋ฉด์ MySQL์ด ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก๋ถํฐ 10๊ฐ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ด ๋ค์ด๋ ์๊ฐ ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก๋ถํฐ ์ฝ๊ธฐ ์์ ์ ๋ฉ์ถ๋ค.
- ์ด๋ฌํ ํํ์ ์ฟผ๋ฆฌ๋ ์๋นํ ๋นจ๋ฆฌ ๋๋ ์ ์๋ค.
- 2๏ธโฃ SELECT first_name FROM employees GROUP BY first_name LIMIT 0, 10;
- GROUP BY๊ฐ ์๊ธฐ ๋๋ฌธ์ GROUP BY ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๊ณ ๋์์ผ LIMIT ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค.
- ์ด ๊ฒฝ์ฐ ์ค์ง์ ์ธ ์๋ฒ ์์ ๋ด์ฉ์ ํฌ๊ฒ ์ค์ฌ์ฃผ์ง๋ ๋ชปํ๋ค.
- 3๏ธโฃ SELECT DISTINCT first_name FROM employees LIMIT 0, 10;
- DISTINCT๋ ์ ๋ ฌ์ ๋ํ ์๊ฑด์ด ์์ด ์ ๋ํฌํ ๊ทธ๋ฃน๋ง ๋ง๋ค์ด ๋ด๋ฉด ๋๋ค.
- MySQL์ ์คํ ๋ฆฌ์ง ์์ง์ ํตํด ํ ํ ์ด๋ธ ์ค์บ ๋ฐฉ์์ ์ด์ฉํ์ฌ employees ํ ์ด๋ธ ๋ ์ฝ๋๋ฅผ ์ฝ์ด ๋ค์๊ณผ ๋์์ DISTINCT๋ฅผ ์ํ ์ค๋ณต ์ ๊ฑฐ ์์ (์์ ํ ์ด๋ธ ์ฌ์ฉ)์ ์งํํ๋ค.
- ์ด ์์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค๊ฐ ์ ๋ํฌํ ๋ ์ฝ๋๊ฐ LIMIT ๊ฑด์๋งํผ ์ฑ์์ง๋ฉด ๊ทธ ์๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ฉ์ถ๋ค.
- DISTINCT์ ํจ๊ป ์ฌ์ฉ๋ LIMIT๋ ์ค์ง์ ์ธ ์ค๋ณต ์ ๊ฑฐ ์์ ์ ๋ฒ์๋ฅผ ์ค์ด๋ ์ญํ ์ ํ๋ค.
- ์์ ๋์ ์๋นํ ์ค์ฌ์ค ์ ์๋ ์ฟผ๋ฆฌ์ด๋ค.
- 4๏ธโฃ SELECT * FROM employees WHERE emp_no BETWEEN 10001 AND 11000 ORDER BY first_name LIMIT 0, 10;
- employees ํ ์ด๋ธ๋ก๋ถํฐ where ์กฐ๊ฑด์ ์ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ first_name ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ค.
- ์ ๋ ฌ์ ์ํํ๋ฉด์ ํ์ํ 10๊ฑด์ด ์์ฑ๋๋ ์๊ฐ, ๋๋จธ์ง ์์ ์ ๋ฉ์ถ๊ณ ์ฌ์ฉ์์๊ฒ ๊ฐ์ ๋ฐํํ๋ค.
- ์ ๋ ฌ์ ์ํํ๊ธฐ ์ ์ WHERE ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ฝ์ด ์์ผ ํ์ง๋ง ์ฝ์ด์จ ๊ฒฐ๊ณผ๊ฐ ์ ๋ถ ์ ๋ ฌ๋ผ์ผ ์ฟผ๋ฆฌ๊ฐ ์๋ฃ๋๋ ๊ฒ์ด ์๋๋ผ ํ์ํ ๋งํผ๋ง ์ ๋ ฌํ๋ฉด ๋๋ค.
- ํ์ง๋ง, ํฌ๊ฒ ์์ ๋์ ์ค์ฌ์ฃผ์ง๋ ๋ชปํ๋ค.
โ ์ฟผ๋ฆฌ ๋ฌธ์ฅ์์ GROUP BY๋ ORDER BY ๊ฐ์ ์ ์ฒด ๋ฒ์ ์์ ์ด ์ ํ๋๋๋ผ๋ LIMIT ์ ์ด ์๋ค๋ฉด ํฌ์ง ์์ง๋ง ๋๋ฆ์ ์ฑ๋ฅ ํฅ์์ ๋ฐ์ํ๋ค.
โ๏ธLIMIT ์ฃผ์์ฌํญ
- 1. 1๊ฐ ๋๋ 2๊ฐ์ ์ธ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์ธ์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ: ์์ N๊ฐ์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ด
- ์ธ์๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ: ์ฒซ ๋ฒ์งธ ์ธ์์ ์ง์ ๋ ์์น๋ถํฐ ๋ ๋ฒ์งธ ์ธ์์ ๋ช
์๋ ๊ฐ์๋งํผ์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์ฒซ๋ฒ์งธ ์ธ์(์์์์น, ์คํ์ ) ์ 0๋ถํฐ ์์ํ๋ค๋ ๊ฒ์ ์ฃผ์ํ์.
- LIMIT 10, 10; ์ ์์ 11๋ฒ์งธ ๋ถํฐ 10๊ฐ์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
- 2. LIMIT์ ์ธ์๋ก ํํ์์ด๋ ๋ณ๋์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ex) LIMIT (100-10) -> SQL syntax ERROR ๋ฐ์
- 3. ํ์ด์ง ์ฒ๋ฆฌ
- ์ค์ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ์ฌ์ฉ์์ ํ๋ฉด์ ์ถ๋ ฅ๋ ๋ ์ฝ๋์ ์๊ฐ ์๋๋ผ MySQL ์๋ฒ๊ฐ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด ๋ด๊ธฐ ์ํด ์ด๋ ํ ์์ ๋ค์ ํ๋์ง๊ฐ ์ค์ํ๋ค.
- ๋ง์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ๋ฐ์ดํฐ๋ฅผ SELECT ํ ๋ ์กฐ๊ธ์ฉ ์๋ผ์(ํ์ด์ง) ๊ฐ์ ธ๊ฐ๊ฒ ๋๋๋ฐ, ์ด๋ LIMIT๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
- ex) SELECT * FROM salaries ORDER BY salary LIMIT n, m;
- ๋ฌธ์ ๊ฐ ๋๋ ์์๊ฐ ์กด์ฌํ๋ค. ex) SELECT * FROM salaries ORDER BY salary LIMIT 2000000, 10;
- ํด๋น ์ฟผ๋ฆฌ๋ ๋จผ์ salaries ํ ์ด๋ธ์ ์ฒ์๋ถํฐ 2000010๊ฑด์ ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ์, 2000000๊ฑด์ ๋ฒ๋ฆฌ๊ณ ๋ง์ง๋ง 10๊ฑด๋ง ์ฌ์ฉ์์๊ฒ ๋ฐํํ๋ค.
- ์ฌ์ฉ์์๊ฒ๋ 10๊ฑด๋ง ๋ฐํ๋์ง๋ง ์ค์ ๋ก๋ 2000010๊ฑด์ ๋ ์ฝ๋๋ฅผ ์ฝ์ผ๋ฏ๋ก ์ฟผ๋ฆฌ๊ฐ ๋๋ ค์ง๋ค.
- โ
LIMIT ์กฐ๊ฑด์ ํ์ด์ง์ด ์ฒ์ ๋ช ๊ฐ ํ์ด์ง ์กฐํ๋ก ๋๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด WHERE ์กฐ๊ฑด์ ๋ก ์ฝ์ด์ผ ํ ์์น๋ฅผ ์ฐพ๊ณ ๊ทธ ์์น์์ 10๊ฐ๋ง ์ฝ๋ ํํ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- 1. ์ฒซํ์ด์ง ์กฐํ์ฉ ์ฟผ๋ฆฌ
- SELECT * FROM salaries ORDER BY salary LIMIT 0, 10;
- โ
2. ๋ ๋ฒ์งธ ํ์ด์ง ์กฐํ์ฉ ์ฟผ๋ฆฌ (์ฒซ ํ์ด์ง์ ๋ง์ง๋ง salary ๊ฐ๊ณผ emp_no๊ฐ์ ์ฌ์ฉ)
- SELECT * FROM salaries
WHERE salary>=38864 AND NOT (salary=38864 AND emp_no<=274049)
ORDER BY salary LIMIT 0, 10; - salaries ํ ์ด๋ธ์๋ salary ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๋๋ฐ, ์ด ์ธ๋ฑ์ค๋ ์ค๋ณต์ด ํ์ฉ๋๋ ์ธ๋ฑ์ค์ด๋ฏ๋ก ๋จ์ํ ์ด์ ํ์ด์ง์ ๋ง์ง๋ง salary ๊ฐ ๋ณด๋ค ํฐ ๊ฒ์ ์กฐํํ๊ฑฐ๋ ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์กฐํํ๋ฉด ์ค๋ณต์ด๋ ๋๋ฝ์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก "NOT (salary=38864 AND emp_no<=274049)" ์กฐ๊ฑด์ ์ถ๊ฐํ์ฌ ์ด์ ํ์ด์ง์์ ์ด๋ฏธ ์กฐํ๋๋ ๊ฑด์ ์ ์ธํ ๊ฒ์ด๋ค.
- SELECT * FROM salaries
- 1. ์ฒซํ์ด์ง ์กฐํ์ฉ ์ฟผ๋ฆฌ
- ์ค๋ณต์ด๋ ๋๋ฝ์ ์ ์ธํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ์ธ๋ฑ์ค๊ฐ ๋ช ๊ฐ์ ์ปฌ๋ผ์ผ๋ก ๊ตฌ์ฑ๋๋์ง, ์ ๋ํฌํ์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
9-7. COUNT()
COUNT() ํจ์๋ ๊ฒฐ๊ณผ ๋ ์ฝ๋์ ๊ฑด์๋ฅผ ๋ฐํํ๋ ํจ์๋ค.
COUNT() ํจ์๋ ์ปฌ๋ผ์ด๋ ํํ์์ ์ธ์๋ก ๋ฐ์ผ๋ฉฐ, ํน๋ณํ ํํ๋ก "*"์ ์ฌ์ฉํ ์๋ ์๋ค. ํด๋น ๊ฒฝ์ฐ์ "*"์ SELECT ์์ ์ฌ์ฉํ ๋ ์ฒ๋ผ ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ ธ์ค๋ผ๋ ์๋ฏธ๊ฐ ์๋๋ผ ๊ทธ๋ฅ ๋ ์ฝ๋ ์์ฒด๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, COUNT(PK์ปฌ๋ผ), COUNT(1)๊ณผ ๊ฐ์ด ์ฌ์ฉํ์ง ์๊ณ COUNT(*)๋ก ํํํด๋ ๋์ผํ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
1๏ธโฃ MyISAM ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ํญ์ ํ ์ด๋ธ์ ๋ฉํ ์ ๋ณด์ ๋ ์ฝ๋ ๊ฑด์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ WHERE์ ์ด ์๋ COUNT(*)์ฟผ๋ฆฌ์ ๋ํด์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๋ค. ํ์ง๋ง WHERE ์กฐ๊ฑด์ด ์์ผ๋ฉด ์ผ๋ฐ์ ์ธ DBMS์ ๊ฐ์ด ์ธ์ด๋ณด์์ผ ํ๋ค.
2๏ธโฃ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ WHERE ์กฐ๊ฑด์ด ์๋ COUNT(*) ์ฟผ๋ฆฌ๋ผ ํ๋๋ผ๋ ์ง์ ๋ฐ์ดํฐ๋ ์ธ๋ฑ์ค๋ฅผ ์ฝ์ด์ผ๋ง ๋ ์ฝ๋ ๊ฑด์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
COUNT ์ฟผ๋ฆฌ ์ฃผ์ ์ฌํญ
- ORDER BY๋ LEFT JOIN๊ณผ ๊ฐ์ ๋ ์ฝ๋ ๊ฑด์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๋ฌด๊ดํ ์์
์ ํฌํจํ๋ ๊ฒฝ์ฐ
- COUNT(*) ์ฟผ๋ฆฌ์ ORDER BY ์ ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ํ์ํ์ง ์๋ค.
- LEFT JOIN ๋ํ ๋ ์ฝ๋ ๊ฑด์์ ๋ณํ๊ฐ ์๊ฑฐ๋ ์์ฐํฐ ํ ์ด๋ธ์์ ๋ณ๋ ์ฒดํฌ๋ฅผ ํ์ง ์์๋ ๋๋ค๋ฉด ์ ๊ฑฐํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ข๋ค.
- MySQL 8.0 ๋ถํฐ๋ ์ตํฐ๋ง์ด์ ๊ฐ COUNT(*) ์ฟผ๋ฆฌ์ ์ฌ์ฉ๋ ORDER BY๋ ๋ฌด์ํ๋๋ก ๊ฐ์ ๋๋ค.
- ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ
- ํ์ด์งํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๋ณด๋ค ๋ช ๋ฐฐ ๋๋ ๋ช์ญ ๋ฐฐ ๋๋ฆฌ๊ฒ ์คํ๋ ์ ์๋ค.
- COUNT() ํจ์์ ์ปฌ๋ผ๋ช
์ด๋ ํํ์์ด ์ธ์๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ
- ๋ ์ฝ๋์ ๊ฒฐ๊ณผ๊ฐ NULL์ด ์๋ ๋ ์ฝ๋ ๊ฑด์๋ง ๋ฐํ
- NULL์ด ๋ ์ ์๋ ์ปฌ๋ผ์ ์๋๋๋ก ์ฟผ๋ฆฌ๊ฐ ๋์ํ๋์ง ํ์ธํ๋๊ฒ ์ข๋ค.
๊ฒ์๋ฌผ ๋ชฉ๋ก์ ๋ณด์ฌ์ค ๋ ์ผ๋ฐ์ ์ผ๋ก ์๋์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
-- // ๊ฒ์๋ฌผ ๊ฑด์ ํ์ธ
SELECT COUNT(*) FROM articles WHER board_id=1;
-- // ํน์ ํ์ด์ง์ ๊ฒ์๋ฌผ ์กฐํ
SELECT * FROM articles WHERE board_id=? ORDER BY article_id DESC LIMIT 0, 10;
board_id๊ฐ 1์ธ ๋ ์ฝ๋์ ์๊ฐ ๋ฐฑ๋ง ๊ฑด์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ๋ articles ํ
์ด๋ธ์์ 100๋ง ๊ฑด์ ์ฝ์ด์ผ ํ๋ค.
๋ฌผ๋ก ์ธ๋ฑ์ค๋ง ์ฝ์ด์ ์ฒ๋ฆฌ(์ปค๋ฒ๋ง ์ธ๋ฑ์ค)๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด ์ฟผ๋ฆฌ ์ฑ๋ฅ์ด ๋นจ๋ผ์ง๊ฒ ์ง๋ง,
์ค์ ์๋น์ค์์๋ ์ญ์ ๋ ๊ฒ์๋ฌผ์ธ์ง ๋ฑ ์ฌ๋ฌ ์ฒดํฌํด์ผ ๋๋ ๋ถ๋ถ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ผ๋ง ํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฑด์๋ฅผ ํ์ธํ๋ ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ณด๋ค 10๋ง ๋ฐฐ ๋๋ฆฌ๊ฒ ์ฒ๋ฆฌ๋ ๊ฒ์ด๋ค.
๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ๊ฒฐ๊ตญ ๋ค์ ํ์ด์ง๋ก ๋์ด๊ฐ์๋ก ์ฑ๋ฅ์ด ๋ ๋๋ ค์ง ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
๋ฐ๋ผ์, ํด๋น ๊ฒฝ์ฐ์๋ ๋ชจ๋ ํ์ด์ง ๋ฒํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ณด๋ค๋ "์ด์ ", "๋ค์" ๋ฒํผ๋ง ํ์ํ๋ ๋ฐฉ์์ ๊ฒํ ํด๋ณผ ์ ์๋ค.
'๐ข๏ธDatabase' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Real MySQL 8.0] ์ฟผ๋ฆฌ ์์ฑ ๋ฐ ์ต์ ํ - JOIN (0) | 2023.08.22 |
---|---|
Redis ์๊ณ ์ฌ์ฉํ์! (0) | 2023.08.20 |
[Real MySQL 8.0] MySQL ์ฐ์ฐ์์ ๋ด์ฅํจ์ (0) | 2023.08.08 |
[Real MySQL 8.0] InnoDB ๋ฒํผ ํโข์ธ๋ ๋ก๊ทธ โข์ฒด์ธ์ง ๋ฒํผโข ๋ฆฌ๋ ๋ก๊ทธ (0) | 2023.08.07 |
[Real MySQL 8.0] InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ํคํ ์ฒ (MVCC, ๋ฐ๋๋ฝ ๊ฐ์ง, ...) (0) | 2023.08.07 |