1. LIMIT n
์ฟผ๋ฆฌ์์ ์ง์ ๋ ์์์ ์์นํ ๋ ์ฝ๋๋ง ๊ฐ์ ธ์ค๊ณ ์ ํจ
๐ LIMIT์์ ํ์ํ ๋ ์ฝ๋ ๊ฑด์๋ง ์ค๋น๋๋ฉด ์ฆ์ ์ฟผ๋ฆฌ ์ข ๋ฃ
SELECT * FROM salaries ORDER BY salary LIMIT n, m;
- n, m์ ์ฃผ์ด์ง๋ ์์น๊ฐ ๋งค์ฐ ์ปค์ง๋ฉด ์ฟผ๋ฆฌ ์คํ์ ์ค๋ ์๊ฐ ๊ฑธ๋ฆผ
- LIMIT ์กฐ๊ฑด์ ํ์ด์ง์ด ์ฒ์ ๋ช ๊ฐ ํ์ด์ง ์กฐํ๋ก ๋๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉด WHERE ์กฐ๊ฑด์ ๋ก ์ฝ์ด์ผ ํ ์์น๋ฅผ ์ฐพ๊ณ ๊ทธ ์์น์์ m๊ฐ๋ง ์ฝ๋ ํํ์ ์ฟผ๋ฆฌ ์ฌ์ฉ
-- // ๋ ๋ฒ์งธ ํ์ด์ง ์กฐํ์ฉ ์ฟผ๋ฆฌ(์ฒซ ํ์ด์ง์ ๋ง์ง๋ง salary ๊ฐ๊ณผ emp_no ๊ฐ ์ด์ฉ)
SELECT * FROM salaries
WHERE salary>=38864 AND NOT (salary=38864 AND emp_no<=274049)
ORDER BY salary LIMIT 0, 10;
- NOT (salary=38864 AND emp_no<=274049) ์กฐ๊ฑด์ ์ด์ ํ์ด์ง์์ ์ด๋ฏธ ์กฐํ๋๋ ๊ฒ์ ์ ์ธํ๊ธฐ ์ํด ์ถ๊ฐ
2. COUNT()
- MyISAM ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ ํ
์ด๋ธ์ ํญ์ ํ
์ด๋ธ์ ๋ฉํ ์ ๋ณด์ ์ ์ฒด ๋ ์ฝ๋ ๊ฑด์ ๊ด๋ฆฌ
๐ WHERE ์กฐ๊ฑด์ด ์๋ COUNT(*) ์ฟผ๋ฆฌ๋ MySQL ์๋ฒ๊ฐ ์ค์ ๋ ์ฝ๋ ๊ฑด์๋ฅผ ์ธ์ด๋ณด์ง ์์๋ ๋ฐ๋ก ๊ฒฐ๊ณผ ๋ฐํํ๋ฏ๋ก ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ
๐ WHERE ์กฐ๊ฑด์ด ์๋ COUNT(*) ์ฟผ๋ฆฌ๋ ๊ทธ ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์ฝ์ด๋ณด์ง ์๋ ์ด์ ์ ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ธ DBMS์ ๊ฐ์ด ์ฒ๋ฆฌ๋จ - InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ ํ ์ด๋ธ์์๋ WHRER ์กฐ๊ฑด์ด ์๋ COUNT(*) ์ฟผ๋ฆฌ๋ผ๊ณ ํ๋๋ผ๋ ์ง์ ๋ฐ์ดํฐ๋ ์ธ๋ฑ์ค๋ฅผ ์ฝ์ด์ผ๋ง ๋ ์ฝ๋ ๊ฑด์ ๊ฐ์ ธ์ฌ ์ ์์
- SELECT COUNT(*) ์ฟผ๋ฆฌ์ ์ฌ์ฉ๋ ORDER BY ์ ์ ์ตํฐ๋ง์ด์ ๊ฐ ๋ฌด์
๐ก ๊ฒ์๋ฌผ์ ์ ์ฒด ๊ฑด์๋ฅผ ์กฐํํ๋ ์์ ์ ํผํ๋ ๊ฒ์ด ์ข๋ค..
๐ ๊ฒ์๋ฌผ์ ํ์ด์ง ๋ฒํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์๋ณด๋ค๋ "์ด์ "๊ณผ "๋ค์" ๋ฒํผ๋ง ํ์ํ๋ ๋ฐฉ์์ ๊ฒํ ํด๋ณผ ๊ฒ์ ๊ถ์ฅ !
3. JOIN
JOIN์ด ์ด๋ป๊ฒ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋์ง์ ๋ํด ์ฟผ๋ฆฌ ํจํด๋ณ๋ก ์ดํด๋ณด๊ณ , JOIN์ ์ ํ๋ณ๋ก ์ฃผ์ํ ์ฌํญ์ ์์๋ณด์ !
โณ๏ธ JOIN์ ์์์ ์ธ๋ฑ์ค
- ๋๋ผ์ด๋น ํ ์ด๋ธ์ ์ฝ์ ๋๋ ์ธ๋ฑ์ค ํ์ ์์ ์ ๋จ ํ ๋ฒ๋ง ์ํํ๊ณ ๊ทธ ์ดํ๋ถํฐ๋ ์ค์บ๋ง ์คํ
- ๋๋ฆฌ๋ธ ํ ์ด๋ธ์์๋ ์ธ๋ฑ์ค ํ์ ์์ ๊ณผ ์ค์บ ์์ ์ ๋๋ผ์ด๋น ํ ์ด๋ธ์์ ์ฝ์ ๋ ์ฝ๋ ๊ฑด์๋งํผ ๋ฐ๋ณต
- ์ตํฐ๋ง์ด์ ๋ ํญ์ ๋๋ผ์ด๋น ํ ์ด๋ธ์ด ์๋๋ผ ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ์ต์ ์ผ๋ก ์ฝ์ ์ ์๊ฒ ์คํ ๊ณํ ์๋ฆฝ
SELECT *
FROM employees e, dept_emp de
WHERE e.emp_no=de.emp_no;
๐ท ๋ ์ปฌ๋ผ ๋ชจ๋ ๊ฐ๊ฐ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
- ์ด๋ ํ ์ด๋ธ์ ๋๋ผ์ด๋น์ผ๋ก ์ ํํ๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ๊ฒ์ ์์ ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ตํฐ๋ง์ด์ ๊ฐ ํต๊ณ ์ ๋ณด(๋ ์ฝ๋ ๊ฑด์)๋ฅผ ์ด์ฉํด ์ ์ ํ ๋๋ผ์ด๋น ํ ์ด๋ธ ์ ํ
๐ท employees.emp_no์๋ง ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
- dept_emp ํ
์ด๋ธ์ด ๋๋ฆฌ๋ธ ํ
์ด๋ธ๋ก ์ ํ๋๋ฉด employees ํ
์ด๋ธ์ ๋ ์ฝ๋ ๊ฑด์๋งํผ dept_emp ํ
์ด๋ธ์ ํ ์ค์บํด์ผ๋ง ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ ์ฝ๋ ๋ฐ๊ฒฌ
๐ ๋ฐ๋ณต๋๋ ํ ์ค์บ์ ํผํ๊ธฐ ์ํด dept_emp ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ก ์ ํํ๊ณ , employees ํ ์ด๋ธ์ ๋๋ฆฌ๋ธ ํ ์ด๋ธ๋ก ์ ํ
๐ท dept_emp.emp_no์๋ง ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
- ์์ ๊ฒฝ์ฐ์ ๋ฐ๋๋ก ์ฒ๋ฆฌ๋จ
๐ท ๋ ์ปฌ๋ผ ๋ชจ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
- ์ด๋ ํ ์ด๋ธ์ ๋๋ผ์ด๋น์ผ๋ก ์ ํํ๋๋ผ๋ ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ํ ์ค์บ์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ตํฐ๋ง์ด์ ๊ฐ ์ ์ ํ ๋๋ผ์ด๋น ํ ์ด๋ธ ์ ํ
- ๋ ์ฝ๋ ๊ฑด์๊ฐ ์ ์ ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ก ์ ํํ๋ ๊ฒ์ด ํจ์ฌ ํจ์จ์
- ์กฐ์ธ ์กฐ๊ฑด์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์ ํ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
- MySQL 8.0.18 ์ด์ ๋ฒ์ ๊น์ง๋ ๋ธ๋ก ๋ค์คํฐ๋ ๋ฃจํ ์กฐ์ธ ์ฌ์ฉ
- 8.0.18 ๋ฒ์ ๋ถํฐ๋ ํด์ ์กฐ์ธ ์ฌ์ฉ
โณ๏ธ JOIN ์ปฌ๋ผ์ ๋ฐ์ดํฐ ํ์
- ๋ฐ์ดํฐ ํ์ ์ด ๋ถ์ผ์น ์ ์ธ๋ฑ์ค์ ๋ณํ์ด ํ์ํ๋ฏ๋ก ์ ๋๋ก ์ฌ์ฉ X ๐ ํ ํ ์ด๋ธ ์ค์บ์ผ๋ก ์ ๊ทผ
- CHAR ํ์ ๊ณผ VARCHAR ํ์ , INT ํ์ ๊ณผ BIGINT, SMALLINT ํ์ , DATE ํ์ ๊ณผ DATETIME ํ์ ์ฌ์ด์์๋ ๋ฐ์ X
- ๊ฐ์ CHAR ํ์ ์ด๋๋ผ๋ ๋ฌธ์ ์งํฉ์ด๋ ์ฝ๋ ์ด์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฐ์
- ๊ฐ์ INT ํ์ ์ด๋๋ผ๋ ๋ถํธ์ ์กด์ฌ ์ฌ๋ถ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฐ์
โณ๏ธ OUTER JOIN์ ์ฑ๋ฅ๊ณผ ์ฃผ์์ฌํญ
- ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ผ๊ด๋์ง ์์ ๊ฒฝ์ฐ์๋ง OUTER JOIN ํ์
SELECT *
FROM employees e
LEFT JOIN dept_emp de ON de.emp_no=e.emp_no
LEFT JOIN departments d ON d.dept_no=de.dept_no AND d.dept_name='Development';
- ์ ์ผ ๋จผ์ employees ํ ์ด๋ธ์ ํ ์ค์บํ๋ฉด์ dept_emp ํ ์ด๋ธ๊ณผ departments ํ ์ด๋ธ์ ๋๋ฆฌ๋ธ ํ ์ด๋ธ๋ก ์ฌ์ฉ
- employees ํ ์ด๋ธ์ ์กด์ฌํ๋ ์ฌ์ ์ค์ dept_emp ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด OUTER JOIN ํ์ํ์ง๋ง ๋๋ถ๋ถ ๊ทธ๋ฐ ๊ฒฝ์ฐ๋ ์์ผ๋ฏ๋ก ๊ตณ์ด OUTER JOIN ์ฌ์ฉ X
- INNER JOIN์ ์ฌ์ฉํ๋ค๋ฉด ๋ถ์๋ช ์ด Development์ธ ๋ ์ฝ๋ 1๊ฑด๋ง ์ฐพ์์ ์กฐ์ธ ์คํ
SELECT *
FROM employees e
LEFT JOIN dept_manager mgr ON mgr.emp_no=e.emp_no
WHERE mgr.dept_no='d001';
- WHERE ์ ์ ์กฐ๊ฑด ๋๋ฌธ์ MySQL ์ตํฐ๋ง์ด์ ๊ฐ LEFT JOIN์ INNER JOIN์ผ๋ก ๋ณํํด์ ์คํ
- LEFT JOIN์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋งค์นญ๋์ง ์๋ ๋ ์ฝ๋๋ ํฌํจ๋์ง๋ง, WHERE์ ์ ์กฐ๊ฑด์ผ๋ก ์ธํด NULL ๊ฐ ์ ๊ฑฐ
SELECT *
FROM employees e
LEFT JOIN dept_manager mgr
ON mgr.emp_no=e.emp_no AND mgr.dept_no='d001';
- ์กฐ๊ฑด์ WHERE ์ ์ด ์๋ ON ์ ์ ํฌํจ์์ผ์ผ LEFT JOIN์ ํน์ฑ ์ ์ง
SELECT *
FROM employees e
LEFT JOIN dept_manager dm ON dm.emp_no=e.emp_no
WHERE dm.emp_no IS NULL
LIMIT 10;
- OUTER ํ ์ด๋ธ์ ์ปฌ๋ผ์ด WHERE ์ ์ ์ฌ์ฉ๋ ์ ์๋ ์ ์ผํ ๊ฒฝ์ฐ ๐ ANTI JOIN
โณ๏ธ JOIN๊ณผ ์ธ๋ํค
- ์ธ๋ํค๋ JOIN๊ณผ ์ฐ๊ด X
- ๋ฐ์ดํฐ ๋ชจ๋ธ์ DB์ ์์ฑํ ๋๋ ๊ทธ ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ ์ธ๋ํค๋ก ์์ฑํ์ง ์์ ๋๊ฐ ๋ ๋ง์
โณ๏ธ ์ง์ฐ๋ ์กฐ์ธ (Delayed Join)
- JOIN์ด ์คํ๋๊ธฐ ์ด์ ์ GROUP BY๋ ORDER BY๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์ = ์ง์ฐ๋ ์กฐ์ธ
๐ LIMIT์ด ํจ๊ป ์ฌ์ฉ๋ ์ฟผ๋ฆฌ์์ ๋ ํฐ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ - JOIN์ ๋์ฒด๋ก ์คํ๋๋ฉด ๋ ์๋ก ๊ฒฐ๊ณผ ๋ ์ฝ๋ ๊ฑด์๊ฐ ๋์ด๋จ
๐ JOIN์ ๊ฒฐ๊ณผ๋ฅผ GROUP BYํ๊ฑฐ๋ ORDER BY ํ๋ฉด JOIN์ ์คํํ๊ธฐ ์ ์ ๋ ์ฝ๋์ GROUP BY๋ ORDER BY๋ฅผ ์ํํ๋ ๊ฒ๋ณด๋ค ๋ง์ ๋ ์ฝ๋ ์ฒ๋ฆฌ
๐ท ์ฟผ๋ฆฌ ์์
SELECT e.*
FROM salaries s, employees e
WHERE e.emp_no=s.emp_no
AND s.emp_no BETWEEN 10001 AND 13000
GROUP BY s.emp_no
ORDER BY SUM(s.salary) DESC
LIMIT 10;
- employees ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ก ์ ํํด์ "emp_no BETWEEN 10001 AND 13000" ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ฅผ ์ฝ๊ณ , salaries ํ ์ด๋ธ์ ์กฐ์ธ
- GROUP BY ์ฒ๋ฆฌ๋ฅผ ํตํด ๊ฑด์ ์ค์
- ORDER BY ์ฒ๋ฆฌ๋ก ์์ 10๊ฑด๋ง ์ต์ข ์ ์ผ๋ก ๋ฐํ
๐ท ์์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ฐ๋ ์กฐ์ธ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ...?
SELECT e.*
FROM
(SELECT s.emp_no
FROM salaries s
WHERE s.emp_no BETWEEN 10001 AND 13000
GROUP BY s.emp_no
ORDER BY SUM(s.salary) DESC
LIMIT 10) x,
employees e
WHERE e.emp_no=x.emp_no;
๐ ์ง์ฐ๋ ์กฐ์ธ์ผ๋ก ๋ณ๊ฒฝ๋ ์ฟผ๋ฆฌ์ ์กฐ์ธ ํ์๊ฐ ํจ์ฌ ์ ์
โณ๏ธ ๋ํฐ๋ด ์กฐ์ธ (Lateral Join)
ํน์ ๊ทธ๋ฃน๋ณ๋ก ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํด์ ๊ทธ ๊ฒฐ๊ณผ์ ์กฐ์ธ
SELECT *
FROM employees e
LEFT JOIN LATERAL (SELECT *
FROM salaries s
WHERE s.emp_no=e.emp_no
ORDER BY s.from_date DESC LIMIT 2) s2 ON s2.emp_no=e.emp_no
WHERE e.first_name='Matt';
- FROM ์ ์ ์ฌ์ฉ๋ ์๋ธ์ฟผ๋ฆฌ์์ ์ธ๋ถ ์ฟผ๋ฆฌ์ FROM ์ ์ ์ ์๋ ํ
์ด๋ธ์ ์ปฌ๋ผ ์ฐธ์กฐ ๊ฐ๋ฅ
๐ salaries ํ ์ด๋ธ์ ์ฝ๋ ์๋ธ์ฟผ๋ฆฌ์์ employees ํ ์ด๋ธ์ emp_no ์ฐธ์กฐ - FROM ์ ์ ์ฌ์ฉ๋ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์ ์ฐธ์กฐํ๊ธฐ ์ํด์๋ "LATERAL" ํค์๋ ๋ช ์
๐ธ ์คํ ๊ณํ์ผ๋ก ์ธํ ์ ๋ ฌ ํํธ๋ฌ์ง
- ๋ค์คํฐ๋ ๋ฃจํ ๋ฐฉ์์ผ๋ก ์กฐ์ธ๋๋ฉด ๋๋ผ์ด๋น ํ ์ด๋ธ์ ์ฝ์ ์์๋๋ก ๊ฒฐ๊ณผ ์กฐํ๋จ
- ํด์ ์กฐ์ธ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ ๋ ฌ ์์๊ฐ ๋๋ผ์ด๋น ํ ์ด๋ธ์ ์ฝ๋ ์์์ ๋ค๋ฅด๊ฒ ์ถ๋ ฅ๋จ
๐ ์ ๋ ฌ์ด ํ์ํ๋ค๋ฉด, ORDER BY ์ ์ ๋ช ์์ ์ผ๋ก ์ฌ์ฉ !