๐ ๋ทฐ๋ ๊ฐ์์ ํ ์ด๋ธ์ด๋ค!
๐ก ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด ๋์ ๊ฒ!
๐ ์ฆ, ์๋ณธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ ์ฐฝ(๊ฐ์ง ํ ์ด๋ธ)์ด๋ผ๊ณ ๋ณด๋ฉด ๋ผ!
๐ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์์ ํ์ง ์๊ณ , ํ์ํ ์ ๋ณด๋ง ๊ฐ๊ณตํด์ ๋ณผ ์ ์์ด!
โ 2. VIEW์ ๊ธฐ๋ณธ ๊ฐ๋
๐ฏ VIEW๋ฅผ ์ ์ฌ์ฉํ ๊น?
1๏ธโฃ ๋ณด์ ๊ฐํ ๐ก๏ธ
- ํน์ ์ปฌ๋ผ๋ง ๋ณด์ด๊ฒ ํ ์ ์์ (์: ์ง์ ๊ธ์ฌ ์จ๊ธฐ๊ธฐ) 2๏ธโฃ ๋ณต์กํ SQL์ ๊ฐ๋จํ๊ฒ! ๐
- ์์ฃผ ์ฐ๋ ๋ณต์กํ
JOIN์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ ๊ฐ๋จํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ! 3๏ธโฃ ๊ฐ๋ ์ฑ & ์ ์ง๋ณด์ ํธ๋ฆฌ ๐ - ์๋ณธ ํ ์ด๋ธ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋, ์ํ๋ ํํ๋ก ๋ฐ์ดํฐ ํ์ ๊ฐ๋ฅ! 4๏ธโฃ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ง ๐
- ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ณ๊ฒฝํ ํ์ ์์ด ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉ ๊ฐ๋ฅ!
๐น 1๏ธโฃ VIEW ๊ฐ๋
| ๊ตฌ๋ถ | ์ค๋ช |
|---|---|
| VIEW๋? | ํ๋ ์ด์์ ํ ์ด๋ธ์ ์ด์ฉํด ๊ฐ์์ ํ ์ด๋ธ์ฒ๋ผ ์ ์ํ ์ ์ฅ๋ SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์งํฉ |
| ์ค์ ๋ฐ์ดํฐ? | ๋ฐ์ดํฐ ์ ์ฅ X โ ์๋ณธ ํ ์ด๋ธ์์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํ |
| ์ค์ฒด | ์ค์ ๋ฌผ๋ฆฌ์ ๋ฐ์ดํฐ๋ ์๊ณ , ์ฟผ๋ฆฌ๋ง ์ ์ฅ |
| ์ฌ์ฉ ๋ชฉ์ | ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋จํ ์ด๋ฆ์ผ๋ก ์ฌ์ฌ์ฉ, ๋ณด์์ฑ ๊ฐํ, ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง |
๐น 2๏ธโฃ VIEW์ ํน์ง
| ํน์ง | ์ค๋ช |
|---|---|
| ๊ฐ์ ํ ์ด๋ธ | ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง, ๋ฐ์ดํฐ๋ ๋ณ๋๋ก ์ ์ฅ๋์ง ์์ |
| ์ค์๊ฐ์ฑ | ๊ธฐ๋ฐ ํ ์ด๋ธ์ด ๋ณ๊ฒฝ๋๋ฉด VIEW ๊ฒฐ๊ณผ๋ ์ฆ์ ๋ฐ์ |
| ํธ์์ฑ | ๋ณต์กํ JOIN, SUBQUERY ์ฟผ๋ฆฌ๋ค์ ๋จ์ํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ |
| ๋ณด์์ฑ | ์๋ณธ ํ ์ด๋ธ์ ๋ํ ์ ๊ทผ ๊ถํ ์์ด VIEW๋ง ์ ๊ทผ ๊ฐ๋ฅ |
๐น 3๏ธโฃ VIEW์ ์ฅ์ & ๋จ์
โ ์ฅ์
| ์ฅ์ | ์ค๋ช |
|---|---|
| 1. ๋ณต์กํ ์ฟผ๋ฆฌ ๊ฐ์ํ | ๋ณต์กํ JOIN, SUBQUERY ๋ฑ์ ํ๋ฒ์ ์บก์ํ ๊ฐ๋ฅ |
| 2. ๋ณด์ ๊ฐํ | ํน์ ์ปฌ๋ผ์ด๋ ๋ฐ์ดํฐ๋ง ์ ๊ณตํ์ฌ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ๋ ธ์ถ ๋ฐฉ์ง |
| 3. ๋ฐ์ดํฐ ์ผ๊ด์ฑ | ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ๋์ผํ ๋ฐ์ดํฐ ํํ ์ ๊ณต |
| 4. ์ ์ง๋ณด์ ์ฉ์ด | ์ฟผ๋ฆฌ ์์ ์ VIEW๋ง ์์ ํ๋ฉด ์ ์ฒด ์ ์ฉ ๊ฐ๋ฅ |
| ย | ย |
โ ๋จ์
| ๋จ์ | ์ค๋ช |
|---|---|
| 1. ์ฑ๋ฅ ์ด์ | ์คํ ์๋ง๋ค ๊ธฐ๋ฐ ํ ์ด๋ธ์์ ์ค์๊ฐ ์กฐํ โ ๋์ฉ๋ ๋ฐ์ดํฐ์์ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ |
| 2. ๋ฐ์ดํฐ ์ ์ฅ ๋ถ๊ฐ | ๋ฌผ๋ฆฌ์ ๋ฐ์ดํฐ ์ ์ฅ X โ ๋ ๋ฆฝ์ ๋ฐ์ดํฐ ๋ณด์กด ๋ถ๊ฐ |
| 3. ์ ํ์ DML | VIEW์์ ์ง์ INSERT, UPDATE, DELETE ์ ์ผ๋ถ ์ ์ฝ ๋ฐ์ (ํนํ JOIN, GROUP BY ํฌํจ ์) |
โ
3. VIEW ๋ง๋ค๊ธฐ (CREATE VIEW)
๐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
CREATE VIEW ๋ทฐ์ด๋ฆ AS
SELECT ์ปฌ๋ผ1, ์ปฌ๋ผ2 FROM ํ
์ด๋ธ์ด๋ฆ
WHERE ์กฐ๊ฑด;
๐ ์์ - ํ์ ํ ์ด๋ธ์์ 6ํ๋ ํ์๋ง ์กฐํํ๋ ๋ทฐ ๋ง๋ค๊ธฐ
CREATE VIEW high_grade_students AS
SELECT id, name, grade
FROM student
WHERE grade = 6;
์ด๋ ๊ฒ ํ๋ฉด, "high_grade_students"๋ผ๋ ๋ทฐ๊ฐ ์์ฑ๋จ!
์ด์ ์ด ๋ทฐ๋ฅผ ๋ง์น ํ ์ด๋ธ์ฒ๋ผ ์กฐํํ ์ ์์ด!
SELECT * FROM high_grade_students;
๐ ๊ฒฐ๊ณผ
| id | name | grade |
|---|---|---|
| 1 | ๊น์ฒ ์ | 6 |
| 2 | ์ด์ํฌ | 6 |
๐น ์์ - v_stu2 ์์ฑํ๊ธฐ
-- 2ํ๋
ํ์์ ํ๋ฒ, ์ด๋ฆ, ํค, ๋ชธ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ๋ทฐ
-- v_stu2 ์์ฑํ๊ธฐ
CREATE OR REPLACE VIEW v_stu2
AS SELECT studno, NAME, height, weight
FROM student
WHERE grade = 2
-- v_stu2 ๋ทฐ์ ๋ด์ฉ ์กฐํํ๊ธฐ
SELECT * FROM v_stu2
๐น ์์ - 2
-- view ๊ฐ์ฒด ์กฐํํ๊ธฐ
USE information_schema
SELECT VIEW_definition FROM views
WHERE TABLE_NAME = "v_stu2"
use gdjdb
SELECT ''
-- 2ํ๋
ํ์์ ํ๋ฒ, ์ด๋ฆ, ๊ตญ์ด, ์์ด, ์ํ ๊ฐ์ ๊ฐ์ง๋
-- v_score2 ๋ทฐ ์์ฑํ๊ธฐ
CREATE VIEW v_score2 AS
SELECT s.studno, s.name, c.kor, c.eng, c.math
FROM student s
join score c ON s.studno = c.studno
WHERE s.grade = 2;
DROP VIEW v_score2
SELECT * FROM v_score2
โ
4. VIEW ์ฌ์ฉํ๊ธฐ (SELECT)
๋ทฐ๋ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ด!
SELECT * FROM high_grade_students;
๐ก ๊ฒฐ๊ณผ๋ ๋ง์น ํ
์ด๋ธ์์ ๊ฐ์ ธ์จ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์๋ณธ student ํ
์ด๋ธ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ทฐ๋ ์๋ ๋ฐ์๋จ!
๐น ์์ - 3
-- CREATE or replace : ์์ฑ ๋๋ ๋ณ๊ฒฝ
SELECT * form v_score2
-- v_str2, v_score2 ๋ทฐ๋ฅผ ์ด์ฉํ์ฌ ํ๋ฒ, ์ด๋ฆ, ์ ์๋ค, ํค, ๋ชธ๋ฌด๊ฒ ์ ๋ณด ์กฐํํ๊ธฐ
SELECT v1.*, v2.height, v2.weight
FROM v_score2 v1, v_stu2 v2
WHERE v1.studno = v2.studno
-- v_score2 ๋ทฐ์ student ํ
์ด๋ธ์ผ ์ด์ฉํ์ฌ ํ๋ฒ, ์ด๋ฆ, ์ ์๋ค, ํ๋
, ์ง๋๊ต์๋ฒํธ
-- ์ถ๋ ฅํ๊ธฐ
SELECT s.studno, s.name, v.kor, v.eng, v.math, s.grade, s.profno
FROM student s, v_score2 v
WHERE s.studno = v.studno
๐น ์์ - 4
-- v_score2 ๋ทฐ์ student professor ํ
์ด๋ธ์ผ ์ด์ฉํ์ฌ
-- ํ๋ฒ, ์ด๋ฆ, ์ ์๋ค, ํ๋
, ์ง๋๊ต์๋ฒํธ, ์ง๋๊ต์์ด๋ฆ
SELECT s.studno, s.name, v.kor, v.eng, v.math, s.grade, s.profno, p.name
FROM student as s
JOIN v_score2 as v ON s.studno = v.studno
JOIN professor as p ON s.profno = p.no
-- ๋ทฐ ์ญ์ ํ๊ธฐ
DROP VIEW v_stu2
SELECT * FROM v_stu2
๐น 4๏ธโฃ VIEW vs ํ ์ด๋ธ ๋น๊ต
| ๊ตฌ๋ถ | VIEW | ํ ์ด๋ธ |
|---|---|---|
| ๋ฐ์ดํฐ ์ ์ฅ | โ X (๊ฐ์) | โ O (์ค์ ๋ฐ์ดํฐ) |
| ๋ฐ์ดํฐ ๋ณ๊ฒฝ | ์ผ๋ถ ๊ฐ๋ฅ (์ ์ฝ ๋ง์) | ๊ฐ๋ฅ |
| ๊ธฐ๋ฐ | SELECT ์ฟผ๋ฆฌ๋ก ์์ฑ | ๋ ๋ฆฝ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ |
| ์ฑ๋ฅ | ์กฐํ ์๋ง๋ค ์คํ | ๊ณ ์ ๋ฐ์ดํฐ ์กฐํ |
| ๋ณด์์ฑ | ํ ์ด๋ธ ๋ฐ์ดํฐ ์ผ๋ถ ์ ํ ๊ฐ๋ฅ | ์ ์ฒด ๋ฐ์ดํฐ ๋ ธ์ถ ๊ฐ๋ฅ |
๐ ์ธ๋ผ์ธ ๋ทฐ(Inline View)๋? ๐
๐ ์ธ๋ผ์ธ ๋ทฐ(Inline View)๋?
โ์๋ธ์ฟผ๋ฆฌ(Subquery)๋ฅผ FROM ์ ์์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ๊ฐ์์ ํ ์ด๋ธโ
์ฆ, SELECT ๋ฌธ ์์์ ์์๋ก ์์ฑ๋๋ ๊ฐ์์ ํ ์ด๋ธ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ผ!
๐ ๋ทฐ(View)์ฒ๋ผ ๋ณด์ด์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ง ์๊ณ , ์คํ๋ ๋๋ง ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ!
๐ ์ค์ ํ
์ด๋ธ์ฒ๋ผ JOINํ๊ฑฐ๋ ํํฐ๋งํ ์ ์์ด!
โ 1. ์ธ๋ผ์ธ ๋ทฐ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
SELECT ์ปฌ๋ผ๋ช
FROM (์๋ธ์ฟผ๋ฆฌ) AS ์ธ๋ผ์ธ๋ทฐ์ด๋ฆ
WHERE ์กฐ๊ฑด;
๐ก FROM ์ ์ ์๋ ์๋ธ์ฟผ๋ฆฌ(SELECT ๋ฌธ)๊ฐ ์ธ๋ผ์ธ ๋ทฐ์ผ!
๐ก ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ด!
โ 2. ์ธ๋ผ์ธ ๋ทฐ ๊ธฐ๋ณธ ์์
๐ ์์ ํ
์ด๋ธ (emp - ์ง์ ์ ๋ณด ํ
์ด๋ธ)
| empno | ename | deptno | salary |
|---|---|---|---|
| 101 | ๊น์ฒ ์ | 10 | 5000 |
| 102 | ์ด์ํฌ | 20 | 6000 |
| 103 | ๋ฐ์ง์ฑ | 10 | 7000 |
| 104 | ์ํฅ๋ฏผ | 30 | 4000 |
๐น ๋ฌธ์ : ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ์ง์๋ง ์กฐํ
๐ ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ์ง์๋ง ์ถ๋ ฅํ๋ ค๋ฉด?
SELECT e.empno, e.ename, e.deptno, e.salary
FROM emp AS e
JOIN (SELECT deptno, AVG(salary) AS avg_salary
FROM emp
GROUP BY deptno) AS avg_table
ON e.deptno = avg_table.deptno
WHERE e.salary > avg_table.avg_salary;
๐ฏ ์ฟผ๋ฆฌ ๋ถ์
1๏ธโฃ ์ธ๋ผ์ธ ๋ทฐ (avg_table) ์์ฑ
SELECT deptno, AVG(salary) AS avg_salary
FROM emp
GROUP BY deptno
- ๊ฐ
deptno(๋ถ์๋ฒํธ)๋ณ๋ก ํ๊ท ๊ธ์ฌ(avg_salary)๋ฅผ ๊ตฌํจ. avg_table์ด๋ผ๋ ๊ฐ์์ ํ ์ด๋ธ์ ๋ง๋ค์์.
2๏ธโฃ ๋ฉ์ธ ์ฟผ๋ฆฌ์์ JOIN ์ํ
FROM emp AS e
JOIN avg_table
ON e.deptno = avg_table.deptno
- ์๋ ์ง์ ํ
์ด๋ธ(
emp)๊ณผ ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ(avg_table)๋ฅผJOIN. - ์ฆ, ๊ฐ ์ง์์ด ์ํ ๋ถ์์ ํ๊ท ๊ธ์ฌ๋ฅผ ํจ๊ป ๊ฐ์ ธ์ด.
3๏ธโฃ ๊ธ์ฌ๊ฐ ํ๊ท ๋ณด๋ค ๋์ ์ง์๋ง ์กฐํ
WHERE e.salary > avg_table.avg_salary;
- ๊ฐ ์ง์์ ๊ธ์ฌ๊ฐ ์๊ธฐ ๋ถ์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ๋๋ง ์กฐํ
๐ ๊ฒฐ๊ณผ ์์ (๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ์ง์๋ง ์ถ๋ ฅ)
| empno | ename | deptno | salary |
|---|---|---|---|
| 103 | ๋ฐ์ง์ฑ | 10 | 7000 |
| 102 | ์ด์ํฌ | 20 | 6000 |
๐ก ์ธ๋ผ์ธ ๋ทฐ ์์ด ์์ฑํ๋ฉด HAVING์ ํ์ฉํ ๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ๋ ์๋ ์์ง๋ง,
์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ๊ฐ ํจ์ฌ ๊น๋ํ๊ณ ์ง๊ด์ ์ผ๋ก ๋ณํจ! ๐
โ 3. ์ธ๋ผ์ธ ๋ทฐ์ ์ฅ์
| ์ฅ์ | ์ค๋ช |
|---|---|
| 1. ์ฟผ๋ฆฌ ๊ฐ๋ ์ฑ ํฅ์ | ๋ณต์กํ ์ฐ์ฐ์ ๋ฐ๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ๊ฒ ์ดํด ๊ฐ๋ฅ |
| 2. ์์ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ | JOIN, WHERE ๋ฑ ํ์ฉ ๊ฐ๋ฅ |
| 3. ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค ์ฑ๋ฅ์ด ๋์ ์๋ ์์ | ์ตํฐ๋ง์ด์ ๊ฐ ์ต์ ํํ ์ ์์ |
โ 4. ์ธ๋ผ์ธ ๋ทฐ์ ๊ณ ๊ธ ํ์ฉ ์์
๐น ๋ฌธ์ : ์์ 3๋ช ์ ๊ธ์ฌ๋ง ์กฐํ
๐ ์์ 3๋ช ์ ๊ธ์ฌ๋ฅผ ์กฐํํ๋ ค๋ฉด?
SELECT empno, ename, salary
FROM (
SELECT empno, ename, salary, RANK() OVER (ORDER BY salary DESC) AS ranking
FROM emp
) AS ranked_emp
WHERE ranking <= 3;
๐น ์์ 6
-- ์ฌ์ํ
์ด๋ธ์์ ์ฌ์๋ฒํธ, ์ฌ์๋ช
, ์ง๊ธ, ๋ถ์์ฝ๋ ๋ถ์๋ช
-- ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ, ๋ถ์๋ณ ํ๊ท ๋ณด๋์ค ์ถ๋ ฅํ๊ธฐ
SELECT e1.empno, e1.ename, e1.job, e1.deptno,
d.๋ถ์๋ช
, e2.๋ถ์๋ณํ๊ท ๊ธ์ฌ, e2.๋ถ์๋ณํ๊ท ๋ณด๋์ค
FROM emp AS e1
JOIN (SELECT deptno, AVG(salary) AS `๋ถ์๋ณํ๊ท ๊ธ์ฌ`,
AVG(IFNULL(salary,0)) AS `๋ถ์๋ณํ๊ท ๋ณด๋์ค`
FROM emp
GROUP BY deptno) AS e2 ON e1.deptno = e2.deptno
JOIN (SELECT deptno, dname AS `๋ถ์๋ช
`
FROM dept) AS d ON e1.deptno= d.deptno
๐ฅ ์ด์ ๊ธ์ฌ๊ฐ ๋์ ์์ 3๋ช ์ ์ง์๋ง ์กฐํ ๊ฐ๋ฅ!
๐ฏ ์ต์ข ์ ๋ฆฌ
| ๊ฐ๋ | ์ค๋ช |
|---|---|
| ์ธ๋ผ์ธ ๋ทฐ๋? | FROM ์ ์ ๋ค์ด๊ฐ๋ ์๋ธ์ฟผ๋ฆฌ |
| ์ด๋์ ์ฌ์ฉ? | JOIN, WHERE, ORDER BY ๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉ |
| ์ฅ์ | ๊ฐ๋ ์ฑ ์ฆ๊ฐ, ์์ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ |
๐ ์ด์ ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ํ์ฉํด์ SQL์ ๋ ํจ์จ์ ์ผ๋ก ์์ฑํ ์ ์์ด! ๐ฅ
โ
5. VIEW ์์ ํ๊ธฐ (ALTER VIEW)
๋ง์ฝ ๊ธฐ์กด ๋ทฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด ALTER VIEW๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ!
๐ ๋ทฐ ์์ ๋ฌธ๋ฒ
ALTER VIEW high_grade_students AS
SELECT id, name, grade
FROM student
WHERE grade >= 5;
๐ ์ด์ 5ํ๋ ์ด์ ํ์๋ค๋ ํฌํจ๋จ!
โ
6. VIEW ์ญ์ ํ๊ธฐ (DROP VIEW)
๋ทฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด DROP VIEW๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ!
DROP VIEW high_grade_students;
๐ ์ด์ "high_grade_students" ๋ทฐ๊ฐ ์ญ์ ๋จ!
โ 7. VIEW์ ์๋ณธ ํ ์ด๋ธ์ ๊ด๊ณ
๐ฏ ๋ทฐ๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์์!
- ๋ทฐ๋ SELECT ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ โ์ ์ฅ๋ ์ฟผ๋ฆฌโ์ผ!
- ์๋ณธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ๋ทฐ์ ๋ฐ์ดํฐ๋ ์๋์ผ๋ก ๋ณ๊ฒฝ๋จ!
์๋ฅผ ๋ค์ด, ์๋ณธ student ํ
์ด๋ธ์์ ํ ๋ช
์ ์ถ๊ฐํ๋ฉด?
INSERT INTO student (id, name, grade) VALUES (3, '๋ฐ์ง์ฑ', 6);
๊ทธ๋ผ ๋ทฐ์์ ๋ค์ ์กฐํํ๋ฉด?
SELECT * FROM high_grade_students;
๐ ๊ฒฐ๊ณผ
| id | name | grade |
|---|---|---|
| 1 | ๊น์ฒ ์ | 6 |
| 2 | ์ด์ํฌ | 6 |
| 3 | ๋ฐ์ง์ฑ | 6 |
๐ฅ ์ฆ, ๋ทฐ๋ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋ฐ์ํ๋ค! ๐
โ 8. VIEW์ ๊ณ ๊ธ ๊ฐ๋
๊ธฐ์ ๋ฉด์ ์์๋ ๊ธฐ๋ณธ ๊ฐ๋ ๋ฟ๋ง ์๋๋ผ, ์ ์ฝ ์ฌํญ๊ณผ ํ์ฉ๋ฒ๋ ์ค์ํด!
์๋ ๋ด์ฉ์ ๊ผญ ๊ธฐ์ตํด ๋์!
๐ฏ (1) ๋ทฐ์์ INSERT, UPDATE, DELETE ๊ฐ๋ฅํ ๊น?
๋ทฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์์ง๋ง,
์ผ๋ถ ๊ฒฝ์ฐ์๋ INSERT, UPDATE, DELETE๋ฅผ ์ฌ์ฉํ ์ ์์ด!
UPDATE high_grade_students
SET name = '์ํฅ๋ฏผ'
WHERE id = 1;
๐ ๋ง์ฝ ์๋ณธ ํ
์ด๋ธ(student)์์ name ์ปฌ๋ผ์ ์์ ํ ์ ์๋ค๋ฉด, ๋ทฐ์์๋ ์์ ๊ฐ๋ฅ!
โ ๋ทฐ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์๋ ๊ฒฝ์ฐ
| ์กฐ๊ฑด | ์์ ๊ฐ๋ฅ ์ฌ๋ถ |
|---|---|
| ๋จ์ผ ํ ์ด๋ธ SELECT | ๊ฐ๋ฅ |
| JOIN ํฌํจ | ๋ถ๊ฐ๋ฅ |
| ์ง๊ณ ํจ์ ํฌํจ (SUM, AVG ๋ฑ) | ๋ถ๊ฐ๋ฅ |
| DISTINCT ํฌํจ | ๋ถ๊ฐ๋ฅ |
| GROUP BY, HAVING ํฌํจ | ๋ถ๊ฐ๋ฅ |
| ์๋ธ์ฟผ๋ฆฌ ํฌํจ | ๋ถ๊ฐ๋ฅ |
| ์ปฌ๋ผ ์ฐ์ฐ ํฌํจ (์: ๊ณ์ฐ์ ํฌํจ) | ์ ํ์ (๋ทฐ ์ปฌ๋ผ๋ช ์ผ์น ์ฌ๋ถ ๋ฐ๋ผ ๋ค๋ฆ) |
๐ก ํนํ MariaDB์์ WITH CHECK OPTION ์ต์
์ฌ์ฉ ์, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๊ฐ์ ๊ฐ๋ฅ
CREATE VIEW v_stu2 AS
SELECT studno, NAME, height, weight
FROM student
WHERE grade = 2
WITH CHECK OPTION;
์ด ์ต์ ์ด ์์ผ๋ฉด, WHERE ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ๋ฐ์ดํฐ INSERT/UPDATE ๋ฐฉ์ง ๊ฐ๋ฅ โ ๋ณด์ ๊ฐํ & ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง์ ์ ๋ฆฌ.
๐ฏ (2) ๋ทฐ์ ์ฑ๋ฅ ์ต์ ํ
๋ทฐ๋ ๊ฐ๋ ฅํ์ง๋ง ๋ฌด์กฐ๊ฑด ๋น ๋ฅด์ง ์์!
- ๋งค๋ฒ ์๋ณธ ํ ์ด๋ธ์ ์กฐํํ๊ธฐ ๋๋ฌธ์, ์ฑ๋ฅ์ด ๋จ์ด์ง ์๋ ์์!
- ๋ง์ฝ ๊ณ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํด์ผ ํ๋ค๋ฉด
MATERIALIZED VIEW(๋ฌผ๋ฆฌ์ ๋ทฐ)๋ฅผ ๊ณ ๋ คํ ์๋ ์์! (MariaDB์์๋ ์ง์ํ์ง ์์, Oracle ๋ฑ์์ ๊ฐ๋ฅ)
๐กVIEW ์ฌ์ฉ ์ ์ฑ๋ฅ ์ฃผ์์
โ๏ธ ์ผ๋ฐ VIEW๋ ํญ์ ์ค์๊ฐ์ผ๋ก ์๋ณธ ํ ์ด๋ธ์ ์กฐํํ๋ฏ๋ก,
- ๋์ฉ๋ ํ ์ด๋ธ์์ ๋ณต์กํ JOIN์ด ๊ฑธ๋ ค ์์ผ๋ฉด, ๋งค๋ฒ JOIN ์ํ โ ํผํฌ๋จผ์ค ์ ํ
- ํนํ, VIEW์ ์ธ๋ฑ์ค๊ฐ ์ง์ ๊ฑธ๋ฆฌ์ง ์๋๋ค๋ ์ ๋ ์ค์ โ ์๋ณธ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํด์ผ ์ฑ๋ฅ ๋ฌธ์ ์ํ ๊ฐ๋ฅ!
๐ฏ์ค๋ฌด์์๋ ์์ฃผ ์ฐ๋ ๋ณต์กํ VIEW๋ โMaterialized View๋ก ๋ณํโ + ์ค์ผ์ค๋ง ๊ด๋ฆฌํ๋ ๊ฒ ์ข์ ์ ๋ต!
โ 9. MATERIALIZED VIEW ๊ฐ๋ (MariaDB)
| ๊ตฌ๋ถ | ์ค๋ช |
|---|---|
| MATERIALIZED VIEW๋? | VIEW์ ๋ฌ๋ฆฌ SELECT ๊ฒฐ๊ณผ ์์ฒด๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฅ |
| ๋ฐ์ดํฐ ์ ์ฅ | O โ ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋์คํฌ์ ์ ์ฅ |
| ์กฐํ ์๋ | ๋น ๋ฆ (์บ์ฑ๋ ๋ฐ์ดํฐ ์ฌ์ฉ) |
| ์ ๋ฐ์ดํธ ๋ฐฉ๋ฒ | ์๋์ผ๋ก REFRESH ํ์ |
| MariaDB ๊ณต์ ์ง์ | 2022๋ MariaDB 10.6 ๋ฒ์ ๋ถํฐ Materialized View ๊ธฐ๋ฅ ์ ์ ์ง์! |
โ MATERIALIZED VIEW ๋ฌธ๋ฒ
CREATE MATERIALIZED VIEW ๋ทฐ์ด๋ฆ
AS
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
WITH DATA;
โ REFRESH ๋ฌธ๋ฒ
REFRESH MATERIALIZED VIEW ๋ทฐ์ด๋ฆ;
์ฃผ์: MATERIALIZED VIEW๋ ๋ณ๊ฒฝ๋ ์๋ณธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ฐ์๋์ง ์์ โ REFRESH ํ์
๐น MATERIALIZED VIEW ์ฅ๋จ์
โ ์ฅ์
| ์ฅ์ | ์ค๋ช |
|---|---|
| 1. ์กฐํ ์ฑ๋ฅ ์ฐ์ | ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ ์ ์ฅ โ ์กฐํ ์ ๋น ๋ฆ |
| 2. ๋์ฉ๋ ๋ฐ์ดํฐ ์ต์ ํ | ๋ฐ๋ณต ์กฐํ ์ฟผ๋ฆฌ์ ๋งค์ฐ ์ ๋ฆฌ |
| 3. ๋ณต์กํ ์ฟผ๋ฆฌ ๋จ์ํ | JOIN, ์ง๊ณ ์ฐ์ฐ์ด ๋ณต์กํด๋ ๋น ๋ฅธ ์กฐํ |
โ ๋จ์
| ๋จ์ | ์ค๋ช |
|---|---|
| 1. ๋ฐ์ดํฐ ์ต์ ์ฑ ๊ด๋ฆฌ ํ์ | ์๋ณธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์, ์๋์ผ๋ก REFRESH ํ์ |
| 2. ๋์คํฌ ๊ณต๊ฐ ์ถ๊ฐ ์ฌ์ฉ | ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ฏ๋ก ๊ณต๊ฐ ์๋ชจ |
| 3. ๊ด๋ฆฌ ๋น์ฉ | ์ ๊ธฐ์ ์ผ๋ก ์ค์ผ์ค๋งํ์ฌ REFRESH ๊ด๋ฆฌ ํ์ |
๐น VIEW vs MATERIALIZED VIEW ๋น๊ต
| ๋น๊ต ํญ๋ชฉ | VIEW | MATERIALIZED VIEW |
|---|---|---|
| ๋ฐ์ดํฐ ์ ์ฅ | โ (์ ์ฅ ์ ํจ) | โ (์ ์ฅํจ) |
| ๋ฐ์ดํฐ ์ต์ ์ฑ | ์ค์๊ฐ ๋ฐ์ | REFRESH ํ์ |
| ์กฐํ ์ฑ๋ฅ | ๋๋ฆด ์ ์์ | ๋น ๋ฆ |
| ๋์คํฌ ์ฌ์ฉ | ์ ์ | ํผ |
| ์ฌ์ฉ ๋ชฉ์ | ์ค์๊ฐ ๋ฐ์ดํฐ, ๋ณด์, ์ฟผ๋ฆฌ ๋จ์ํ | ๋ฐ๋ณต ์กฐํ, ์ฑ๋ฅ ๊ฐ์ , ๋์ฉ๋ ์ต์ ํ |
๐น ์ฑ๋ฅ ํ์ฉ๋ฒ & ์ค๋ฌด ์ ์ฉ ํ
| ์ ์ฉ ๋ฐฉ๋ฒ | ์ค๋ช |
|---|---|
| VIEW ์ฌ์ฉ ์ | ๋ณด์ ๊ฐํ, ๋ณต์กํ ์ฟผ๋ฆฌ ์ฌ์ฌ์ฉ ์ฉ๋์ ์ ํฉ |
| MATERIALIZED VIEW ์ฌ์ฉ ์ | ์ง๊ณ, ๋ณต์กํ JOIN ์ฟผ๋ฆฌ ๋ฐ๋ณต ์กฐํ์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ํฅ์ |
| ์ค์ผ์ค๋ง ๊ด๋ฆฌ | MATERIALIZED VIEW๋ ์ค์ผ์ค๋ง ํด(CRON ๋ฑ)๊ณผ ์ฐ๊ณํ์ฌ ์ ๊ธฐ REFRESH ํ์ |
| ๋๋ ๋ฐ์ดํฐ์ผ ๋ | VIEW๋ ์ฃผ์! โ MATERIALIZED VIEW๋ก ์บ์ฑ ์ฒ๋ฆฌ ์ถ์ฒ |
| ์ธ๋ฑ์ค ํ์ฉ | MariaDB๋ Materialized View์ ์ธ๋ฑ์ค ์์ฑ ๊ฐ๋ฅ โ ์กฐํ ์ฑ๋ฅ ๊ทน๋ํ |
๐ฅ ์ค๋ฌด ์์
๐ ์ผ๋ฐ VIEW ์์
CREATE VIEW active_employees AS
SELECT emp_id, emp_name, department
FROM employees
WHERE status = 'ACTIVE';
- ํน์ ์กฐ๊ฑด ํํฐ๋ง & ์ฌ์ฌ์ฉ ์ฟผ๋ฆฌ ๊ฐํธํ
๐ MATERIALIZED VIEW ์์
CREATE MATERIALIZED VIEW sales_summary AS
SELECT product_id, SUM(quantity) AS total_qty, SUM(price) AS total_price
FROM sales
GROUP BY product_id
WITH DATA;
-- ๋ฐ์ดํฐ ์
๋ฐ์ดํธ ํ
REFRESH MATERIALIZED VIEW sales_summary;
- ๋๊ท๋ชจ ๋งค์ถ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ง๊ณ โ ์ฑ๋ฅ ํฅ์
๐ ์ฃผ์ ํฌ์ธํธ
1๏ธโฃ MariaDB์์ MATERIALIZED VIEW์ ์ง์
โ๏ธ MariaDB์์ MATERIALIZED VIEW๋ 10.6 ๋ฒ์ ์ดํ๋ถํฐ ๊ณต์ ์ง์์ ๋ง์ง๋ง, Oracle์ด๋ PostgreSQL์ฒ๋ผ โ์๋ REFRESH ์ต์ โ์ ์์ง ๋ถ์กฑํฉ๋๋ค.
MariaDB์์๋ ์๋์ผ๋ก REFRESH๋ฅผ ํด์ค์ผ ํ๋ค๋ ์ ์ด ํญ์ ์ค์ํ๊ณ , ์ค๋ฌด์์๋ ์ด๋ฅผ ์ค์ผ์ค๋ฌ(CRON)๋ EVENT๋ก ๊ด๋ฆฌํ๋ ์ผ์ด์ค๊ฐ ๋ง์ต๋๋ค.
- ๐ก์ถ๊ฐ ํ
-
CREATE MATERIALIZED VIEW ๋ ์์ง ์ผ๋ถ MariaDB์์๋
CREATE TABLE + INSERT + ํธ๋ฆฌ๊ฑฐ
์กฐํฉ์ผ๋ก ๋์ฒดํ๋ ๊ฒฝ์ฐ๋ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
MariaDB์์์ Materialized View ์ฌ์ฉ ์
์ฃผ์ํ ์ ์ผ๋ก ๋ณ๋ ํธ๋ฆฌ๊ฑฐ ์๋ํ๊ฐ ์์ง ๋ถ์กฑ
ํ๋ค๋ ๊ฒ, ์ค๋ฌด์์๋ ์ค์ผ์ค๋ง ์ค์ ํ์!
โ ์ถ๊ฐ์ ์ผ๋ก ์ถ์ฒํ๋ ์ฌํ ๊ฐ๋
๐ WITH CHECK OPTION & SECURITY ์ต์
์ค๋ฌด์์ ๋ทฐ์ ๋ณด์์ฑ ๊ฐํํ ๋, MariaDB์์๋ ๋ค์ ๋ ๊ฐ์ง ์ต์ ๋ ์์ฃผ ํ์ฉํฉ๋๋ค:
| ์ต์ | ์ค๋ช |
|---|---|
| WITH CHECK OPTION | ๋ทฐ์ ์ ์๋ WHERE ์กฐ๊ฑด์ ๋ฐ๋์ ์งํค๋๋ก ํจ (๋ฌด๊ฒฐ์ฑ ์ ์ง) |
| SQL SECURITY DEFINER/INVOKER | ๋ทฐ ์คํ ์ ๊ถํ์ ๋ทฐ ์์ ์ ๊ธฐ์ค(Definer) or ์คํ์ ๊ธฐ์ค(Invoker)์ผ๋ก ๊ฒฐ์ ๊ฐ๋ฅ โ ๋ฏผ๊ฐ ์ ๋ณด ๋ณดํธ ์ ์ ์ฉ |
โ 9. ๊ธฐ์ ์ง๋ฌธ & ๋ต๋ณ
๊ธฐ์ ๋ฉด์ ์์๋ ์๋ ์ง๋ฌธ์ด ๋์ฌ ์ ์์ด!
๋ฉด์ ์์ ๋๋ตํ ์ ์๋๋ก ์ฐ์ตํด ๋ณด์!
Q1. VIEW๋ ๋ฌด์์ธ๊ฐ์?
๐ ๋ทฐ(View)๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์๊ณ , SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๊ฐ์์ ํ ์ด๋ธ์ ๋๋ค.
์ฆ, ์๋ณธ ํ ์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์กฐํํ ์ ์๋๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ๋๋ค.
Q2. VIEW์ ์ฅ์ ์ ๋ฌด์์ธ๊ฐ์?
๐ 1๏ธโฃ ๋ณด์ ๊ฐํ (๋ฏผ๊ฐํ ์ ๋ณด ๋ณดํธ)
๐ 2๏ธโฃ ๋ณต์กํ ์ฟผ๋ฆฌ ๋จ์ํ (JOIN, WHERE ์กฐ๊ฑด ๋ฏธ๋ฆฌ ์ ์)
๐ 3๏ธโฃ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ํฅ์ (๊ฐ์ง ํ ์ด๋ธ์ฒ๋ผ ํ์ฉ)
๐ 4๏ธโฃ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ง (์๋ณธ ํ ์ด๋ธ ๋ณ๊ฒฝ ์์ด ๋ฐ์ดํฐ ๊ด๋ฆฌ)
Q3. VIEW์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์๋์?
๐ ๋จ์ํ ๋ทฐ์์๋ INSERT, UPDATE, DELETE๊ฐ ๊ฐ๋ฅํ์ง๋ง,
JOIN,GROUP BY,HAVING,DISTINCT์ด ํฌํจ๋ ๊ฒฝ์ฐ์๋ ์ฝ๊ธฐ ์ ์ฉ์ด ๋ฉ๋๋ค.
๐ฏ ์ต์ข ์ ๋ฆฌ
| ๊ฐ๋ | ์ค๋ช |
|---|---|
VIEW๋? |
๊ฐ์์ ํ ์ด๋ธ (์ค์ ๋ฐ์ดํฐ ์ ์ฅ X) |
CREATE VIEW |
๋ทฐ ์์ฑ |
SELECT FROM VIEW |
๋ทฐ ๋ฐ์ดํฐ ์กฐํ |
UPDATE VIEW |
์ผ๋ถ ๋ทฐ์์ ๊ฐ๋ฅ (๋จ์ํ ๋ทฐ๋ง) |
DROP VIEW |
๋ทฐ ์ญ์ |