๐ ๋ทฐ๋ ๊ฐ์์ ํ ์ด๋ธ์ด๋ค!
๐ก ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, 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 |
๋ทฐ ์ญ์ |