๐ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์กฐ์ธ ์ ๋ต
1. ์กฐ์ธ ์์ ์ต์ ํ
- ์์ ํ ์ด๋ธ์ ๋จผ์ ์กฐ์ธํ์ฌ ๋ฐ์ดํฐ ์์ ์ค์ฌ ๋ถํ์ํ ์ฐ์ฐ ๋ฐฉ์ง
- ์กฐ์ธ ์กฐ๊ฑด์ด ๋ช ํํ๋๋ก ์ธ๋ฑ์ค ์ ์ฉ (customer_id ๊ฐ์ PK, FK ํ์ฉ)
* MariaDB์์๋ `STRAIGHT_JOIN`์ ํตํด ์ง์ ํ ์์๋๋ก ์กฐ์ธ ์ง์ ๊ฐ๋ฅ
์กฐ์ธ ํํธ ์ฌ์ฉ
: SQL ์คํ ์ ์ตํฐ๋ง์ด์ ๊ฐ ์ ํํ๋ ์กฐ์ธ ๋ฐฉ์๊ณผ ์์๋ฅผ ๊ฐ์ ๋ก ์ง์ ํ ์ ์๋ ์๋จ
- Nested Loop Join : ์์ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ํฐ ํ ์ด๋ธ์ ๋ฐ๋ณต ์ ๊ทผ (๋ฃจํ ๋ฐฉ์)
- Sort Merge Join : ์์ชฝ ํ ์ด๋ธ์ ์ ๋ ฌํด์ ๋ณํฉ
- Hash Join : ํ์ชฝ ํ ์ด๋ธ ํด์ ํ ์ด๋ธ ์์ฑ ํ ๋ค๋ฅธ ์ชฝ๊ณผ ์กฐ์ธ
* SELECT ๋ฐ๋ก ๋ค์ ์ฌ์ฉ
2. ์ธ๋ฑ์ค ํ์ฉ
- ON ์ ์ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค ์ค์ ์ ์ฑ๋ฅ ํฅ์
- ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ธ๋ฑ์ค ์ ๊ท ์ค์ = `CREATE INDEX idx_customer ON Customers(customer_id)`
์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์๊ฐ ์ ์๋ค. ๋ง์ฝ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค ์ฝ์ด๋ด์ผ ํจ!
๋ฐ๋ผ์ 2๊ฐ์ง๋ฅผ ์กฐํฉํ์ ๋ SQL ์คํ์ด ๋น ๋ฅธ ์์๋
1. ์กฐ์ธ ์์์ ๋ง๊ฒ ์ธ๋ฑ์ค๊น์ง ์ ํ์ฉํ ๊ฒฝ์ฐ
2. ์กฐ์ธ ์์๋ง ํ๋ํ ๊ฒฝ์ฐ
3. ์กฐ์ธ ์์๊ฐ ์๋ชป๋์ง๋ง ์ธ๋ฑ์ค๋ฅผ ์ด ๊ฒฝ์ฐ
4. ์กฐ์ธ ์์๋ ํ๋ฆฌ๊ณ ์ธ๋ฑ์ค๋ ์ ์ด ๊ฒฝ์ฐ
์์ ๊ฐ๋ค!
ํ ์ด๋ธ ๋ช ์นญ
- ๋๋ผ์ด๋น ํ ์ด๋ธ, ์ธ๋ถ ํ ์ด๋ธ : ์กฐ์ธ ์ ๋จผ์ ์ก์ธ์ค (์ฝ๊ธฐ ์์)๋ผ์ ๊ธฐ์ค์ด ๋๋ ํ ์ด๋ธ
- ๋๋ฆฌ๋ธ ํ ์ด๋ธ, ๋ด๋ถ ํ ์ด๋ธ : ์กฐ์ธ ์ ๋์ค์ ์ก์ธ์ค ๋๋ ํ ์ด๋ธ
์์ ๋ก ์ดํดํ๊ธฐ
์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ํ ๋,
EXPLAIN -- ์ด ์ฟผ๋ฆฌ๋ฅผ ์ค์ ์คํํ์ง ์๊ณ , ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์ค์๋๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ช
๋ น์ด
SELECT EMP.ENAME AS 'EMP ์ง์๋ช
',
DEPT.DNAME AS 'DEPT ๋ถ์๋ช
'
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND DEPT.DEPTNO = '20'
AND EMP.ENAME = 'SCOTT';
`FROM EMP, DEPT`๋ผ๊ณ ์ผ๋ค๊ณ ํด์ ์กฐ์ธ ์์๋ ๋ฌด์กฐ๊ฑด ์ด๋ ๊ฒ ๋๋ ๊ฑด ์๋๋ค
์๋๋ฉด, ์ตํฐ๋ง์ด์ ๊ฐ ํจ์จ์ ์ด๋ผ๊ณ ํ๋จํ๋ ์์๋ก ์๋ ์กฐ์ธํด์ฃผ๊ธฐ ๋๋ฌธ์..!
ํ์ง๋ง ์์ ๋ฌธ์ ์ ๊ฒฝ์ฐ EMP → DEPT ์์๋ก ๊ฐ์ ํ๋ฉด ์ฑ๋ฅ์ ๋ ์ต์ ํํ ์ ์๋ค.
์๋๋ฉด, `EMP.ENAME = 'SCOTT'`๊ฐ `DEPT.DEPNO='20'`๋ณด๋ค ๋ ๊ฐ๋ ฅํ ํํฐ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
(= 20๋ฒ์ด๋ผ๋ ๋ถ์๋ฅผ ๊ฐ์ง ์ง์๋ค๋ณด๋ค SCOTT๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ์ฌ๋์ ์๊ฐ ๋ ์ ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ)
์์ ์์ ํ ์ด๋ธ์ ๋จผ์ ์กฐ์ธํ๋ ๊ฒ์ด ์ข๋ค ํ๋๋ฐ
์จ๋ DEPT๊ฐ EMP๋ณด๋ค ์์ ๋ฐ์ดํฐ๋๊น ๋จผ์ ํ๋ ๊ฒ ๋ง์ง ์๋?
๋ผ๋ ์๋ฌธ์ด ๋ค ์ ์๋ค.
ํ์ง๋ง ์ด ์ด ๋ฌธ์ฅ์์์ ํต์ฌ์ `์์ ํ ์ด๋ธ`์ด ์๋๋ผ `๊ฒฐ๊ณผ ๊ฑด์๊ฐ ์์ ํ ์ด๋ธ`์ด ๋จผ์ ์์ผ ํ๋ค.
๋ฐ๋ผ์ scott์ด๋ผ๋ ๊ฐ๋ ฅํ ํํฐ๋ฅผ ์ ์ฉํ emp ํ ์ด๋ธ์ด dept๋ณด๋ค ๊ฒฐ๊ณผ ๊ฑด์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ๋จผ์ ์ค๋ ๊ฒ์ด ๋ง๋ ๊ฒ์ด๋ค.
์กฐ์ธ ์์๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ธ ์ ์๋ค.
EXPLAIN
SELECT STRAIGHT_JOIN EMP.ENAME AS 'EMP ์ง์๋ช
', DEPT.DNAME AS 'DEPT ๋ถ์๋ช
'
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND DEPT.DEPTNO = '20'
AND EMP.ENAME = 'SCOTT';
์๋ STRAIGHT_JOIN์ ์๋์ ๊ฐ์ด `A STRAIGHT_JOIN B` ์ด๋ฐ ์์ผ๋ก ์ฐ๋ ๊ฒ์ด ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ด์ง๋ง,
์์ ์ฝ๋์ฒ๋ผ SELECT ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ตํฐ๋ง์ด์ ๊ฐ FROM ์ ์์๋ฅผ ๊ทธ๋๋ก ์กฐ์ธํ๋๋ก ๊ฐ์ ํ ์ ์๋ค.
-- ๊ธฐ๋ณธ ๋ฌธ๋ฒ
SELECT ์ปฌ๋ผ๋ค
FROM ํ
์ด๋ธ1
STRAIGHT_JOIN ํ
์ด๋ธ2
ON ํ
์ด๋ธ1.์ปฌ๋ผ = ํ
์ด๋ธ2.์ปฌ๋ผ
WHERE ์กฐ๊ฑด
๐ ์กฐ์ธ์ ํตํ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ
Nested Loop Join
"์์ ์ธ๋ถ → ์ธ๋ฑ์ค ์๋ ๋ด๋ถ" ๊ตฌ์กฐ์์ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์๊ท๋ชจ ์กฐ์ธ์ ์ ํฉ (์ธ๋ฑ์ค ์์ผ๋ฉด ์ฑ๋ฅ ์ ํ)
outer ํ ์ด๋ธ์ ๊ฐ ํ์ ๋ํด inner ํ ์ด๋ธ์ ๋ฐ๋ณตํด์ ๊ฒ์ํ๋ ์กฐ์ธ ๋ฐฉ์
like ์ด์ค ๋ฐ๋ณต๋ฌธ
for each row in OuterTable:
for each row in InnerTable:
if ์กฐ์ธ ์กฐ๊ฑด ๋ง์กฑ:
๊ฒฐ๊ณผ ๋ฐํ
ํน์ง
- ์์ฐจ์ ์ฒ๋ฆฌ
- ๋ถ๋ถ ๋ฒ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ (์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ ์ผ๋ถ ๋ฒ์๋ง ์กฐํ ๊ฐ๋ฅ)
- ์ฒ๋ฆฌ๋์ Outer table ํฌ๊ธฐ์ ๋ฐ๋ผ ์ข์ฐ
- ์ธ๋ฑ์ค ๋ฐ๋ณต ๊ตฌ์กฐ์ด๋ฏ๋ก ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ ๋จ์ด์ง
- ์ผ๋ฐ์ ์ผ๋ก ์๊ท๋ชจ ์กฐ์ธ์ ์ ํฉ
Sort Merge Join
์ธ๋ฑ์ค ์์ด ์กฐ์ธ์ด ๊ฐ๋ฅํ๋ฉฐ, ์์ชฝ ํ ์ด๋ธ ๋ชจ๋ ํด ๋. ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ๋งค์ฐ ์ ๋ฆฌ
์กฐ์ธ ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ชฝ ํ
์ด๋ธ์ ์ ๋ ฌํ ๋ค์, ๋ณํฉํ๋ ๋ฐฉ์์ผ๋ก ์กฐ์ธํ๋ ๊ตฌ์กฐ.
(์์ชฝ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ → ๋๋ํ ๋น๊ต → ์ผ์นํ๋ฉด ๋งค์นญํ๋ ๋ฐฉ์)
- ๋์ ์ฒ๋ฆฌ (๋ ํ ์ด๋ธ ๋์์ ์ ์ฒด ์ค์บ).
- ์ ์ฒด ๋ฒ์ ์ฒ๋ฆฌ
- ์ค์บ ์ก์ธ์ค ์์ฃผ.
- ์กฐ์ธ ํค ์ปฌ๋ผ์ ์ธ๋ฑ์ค ์์ด๋ ๋จ
- ์ผ๋ฐ์ ์ผ๋ก ๋์ฉ๋์ ์ ๋ฆฌ.
* ํ์ง๋ง ์ ๋ ฌ ๋น์ฉ์ด ํฌ๋ฏ๋ก, ์ฌ์ ์ ์ ๋ ฌ๋์ด ์๊ฑฐ๋ ์ธ๋ฑ์ค๊ฐ ์ ์กํ ์์ผ๋ฉด ์ข๋ค
Hash Join
"์์ ํ ์ด๋ธ + ํฐ ํ ์ด๋ธ" ๊ตฌ์กฐ์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ฉฐ,
์ธ๋ฑ์ค์ ์ ๋ ฌ์ด ํ์ ์์
๋ ํ
์ด๋ธ์์ ์กฐ์ธ ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์ (Hash) ๊ฐ์ ๋ง๋ค์ด,
์ด ํด์ ๊ฐ์ ์ด์ฉํด ๋งค์นญ๋๋ ํ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์กฐ์ธํ๋ ๋ฐฉ์
- ๊ฐ ํ ์ด๋ธ์ 1๋ฒ๋ง ์ฝ์
- ์ธ๋ฑ์ค ์ ๋ ฌ ๋ถํ์
๐ ์กฐ์ธ์ด์ธ์ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ
1. ์ฐ์ฐ์
- UNION (ํฉ์งํฉ)
- UNION ALL (ํฉ์งํฉ ์ค๋ณต)
- INTERSECT (๊ต์งํฉ)
- MINUS (์ฐจ์งํฉ)
2. ์๋ธ์ฟผ๋ฆฌ (Sub-query)
: ์๋ธ์ฟผ๋ฆฌ๋, SQL์์ ์ฟผ๋ฆฌ ์์ ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅด ์ฌ์ฉํ๋ ๊ฒ
์๋ธ์ฟผ๋ฆฌ ์ ํ
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ (scalar subquery)
- `select column..., (select)`
- ํ๋์ ์ปฌ๋ผ์ฒ๋ผ ์ฌ์ฉ, ๊ฐ๊ฒฐํ ๋ฐ์ดํฐ ์ฐ๊ฒฐ ํจ๊ณผ
- ์ธ๋ผ์ธ ๋ทฐ (Inline View)
- `from (select ...)`
- ํ๋์ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉ, ๋ชจ๋ธ๋ง ๋์ ์๋ ์์ ํ ์ด๋ธ ๋ฑ
- ์ผ๋ฐ ์๋ธ์ฟผ๋ฆฌ
- `where column = (select ...)`
- ํ๋์ ๋ณ์ (์์)์ฒ๋ผ ์ฌ์ฉ, ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์กฐ๊ฑด์ ๋ณ๊ฒฝ
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ (Scalar SubQuery)
`SELECT` ์ ์ ์ฐ์ด๋ฉฐ, ํ ํ ํ ์ปฌ๋ผ(๋จ์ผ๊ฐ)๋ง ๋ฐํ (๋ณ์์ฒ๋ผ ์ฌ์ฉ),
๋ฐ๋ณต ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก,
JOIN, IN-LINE VIEW๋ก ๋ฐ๊พธ๋ ํ๋ ํ์
- ์๋ ๋ฐฉ์
- 1. ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ์คํ
- 2. ๊ฐ ํ๋ง๋ค ์๋ธ์ฟผ๋ฆฌ ์คํ → ๋ฐ๋ณต ์คํ
- 3. ๋ฐํ๋ ๊ฐ์ ๋ฉ์ธ ํ๊ณผ ์ฐ๊ฒฐ
- ํน์ง ๋ฐ ์ฃผ์์ฌํญ
- 1๊ฐ ์ปฌ๋ผ๋ง ๋ฐํ : SELECT์ ๋๋ ์กฐ๊ฑด์ ์์ ๋จ์ผ ๊ฐ์ฒ๋ผ ์ฌ์ฉ
- ๊ฐ์ด ๊ฐ์ผ๋ฉด ์บ์ฑ๋จ : ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ๋ฉด ๋ค์ ์ก์ธ์ค ์ํจ
- ๋ค๋ฅด๋ฉด ์ฑ๋ฅ ์ํฅ ํผ : ๋ฉ์ธ ์งํฉ์ row ์๋งํผ ๋ฐ๋ณต ์คํ๋จ
- ์๋ต์ด ๋๋ ค์ง ์ ์์ : ๋ฉ์ธ ์งํฉ์ด ํฌ๋ฉด ์ฑ๋ฅ ๊ธ๋ฝ
- ์ฑ๋ฅ ํ๋ ํ
- `LEFT JOIN`, ๋๋ `INLINE VIEW (์ธ๋ผ์ธ ๋ทฐ)`๋ก ๋ฐ๊พธ๋ฉด ํจ์ฌ ๋นจ๋ผ์ง
- ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์์ ๊ฐ์ด ์๋๋ผ ๋งค๋ฒ ๋ฌ๋ผ์ง๋ ๊ฐ์ ์ฐธ์กฐํ ๊ฒฝ์ฐ์๋ ๋ฐ๋ณต ์คํ์ด ๋ฐ์ํ๋ฏ๋ก ์ฃผ์ ํ์
๊ทธ๋ผ ํญ์ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค JOIN์ด๋ VIEW ๋ฐฉ์์ด ๋น ๋ฅผ๊น?
ํญ์ ๊ทธ๋ ์ง ์๋ค!
์ธ๋ฑ์ค๊ฐ ์๊ฑฐ๋ ์๊ท๋ชจ๋ผ๋ฉด, ์ค์นผ๋ฌ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ค ๋ ๋น ๋ฅผ ์ ์๋ค
๋ฐ๋ผ์ ์ค์ ๋ฐ์ดํฐ ๊ตฌ์กฐ, ์ธ๋ฑ์ค, ์งํฉ ํฌ๊ธฐ, ์บ์ ๊ฐ๋ฅ์ฑ ๋ฑ์ ๊ณ ๋ คํ ํ๋์ด ํ์ํ๋ค
๊ทธ๋ ๋ค๋ฉด ์ ํค์ ์ ๋ฌด์ ๋ฐ๋ผ์ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๋ ๊ฒ์ธ์ง?
: SQL ์ฑ๋ฅ ์ต์ ํ์์ ํค(๊ธฐ๋ณธํค PK, ์ธ๋ํค FK)์ ์ญํ
ํค๊ฐ ์๋ค๋ ๊ฒ์ `๋ฐ์ดํฐ์ ๊ด๊ณ๊ฐ ๋ช ํ`ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค
ํค ์ ํ | ์๋ฏธ |
๊ธฐ๋ณธํค(PK) | ์ด ํ ์ด๋ธ์ ํน์ ์ปฌ๋ผ์ ์ ๋ ์ค๋ณต์ด ์๋ค (๊ณ ์ ์ฑ ๋ณด์ฅ) |
์ธ๋ํค(FK) | ๋ค๋ฅธ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค๋ฅผ ์ฐธ์กฐํ๋ค๋ ๊ฒ (๊ด๊ณ ๋ช ์) |
์์ฒ๋ผ ๊ธฐ๋ณธํค์ ์ธ๋ํค๊ฐ ์ ์ ๋ฆฌ๋์ด ์์ ๋,
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํค ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก `์์ธก`๊ณผ `์ต์ ํ`๋ฅผ ์ํํ ์ ์๋ค!
- ํค๊ฐ ์์ ๊ฒฝ์ฐ
- ์ตํฐ๋ง์ด์ ๋ ์กฐ์ธ `EMP.DEPTNO → DEPT.DEPTNO` ์์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ๋ฌด์กฐ๊ฑด 1:1 ๋งค์นญ์์ ์๊ณ ์๋ ๊ฒ
- ํค๊ฐ ์์ ๊ฒฝ์ฐ
- ์กฐ์ธ์ด 1:1์ธ์ง, 1:N์ธ์ง, N:N์ธ์ง ๋ชจ๋ฆ
- ๋ฐ๋ผ์, ์ ํํ ์คํ ๊ณํ์ ์ธ์ฐ๊ธฐ ์ด๋ ค์์ง
PK/FK๋ ๋จ์ํ ์ ์ฝ ์กฐ๊ฑด์ด ์๋๋ผ,
์ตํฐ๋ง์ด์ ๊ฐ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํ ์ ์๋๋ก ์๋ ค์ฃผ๋ ํํธ์ด์ ์ฝ์!
3. ํจ์
- ํจ์๋ ํน์ ์ฐ์ฐ์ด๋ ๋ณํ์ ์ํํ๋ SQL ๋ด์ฅ ๊ธฐ๋ฅ
- ๋ฐ์ดํฐ ๊ฐ์ ๊ฐ๊ณตํ๊ฑฐ๋ ์ง๊ณํ๋ ๋ฐ ์ฌ์ฉ
* ํจ์ ์์
delimiter $$
create function `fn_ename`(v_empno int(4))
returns varchar(10) charset utf8mb4 COLLATE utf8mb4_general_ci
begin
declare v_ename varchar(10);
set v_ename = (select ENAME from EMP where EMPNO = v_empno);
return v_ename;
end $$
delimiter ;
ํธ๋ฆฌ๊ฑฐ์ ํ๋ก์์
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ํ๋ก๊ทธ๋จ
ํธ๋ฆฌ๊ฑฐ (Trigger) | ํ๋ก์์ (Procedure) | |
์ ์ | ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ์๋ ์คํ | ์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ํธ์ถ |
ํธ์ถ ์์ | INSERT, UPDATE, DELETE ๋ฑ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์๋ | CALL ํ๋ก์์ ๋ช (...) ๋ช ๋ น์ผ๋ก ์คํ |
์ฉ๋ | ๋ฌด์กฐ๊ฑด์ฑ ์๋ ์ฒ๋ฆฌ (๊ฐ์/๊ธฐ๋ก/๊ฒ์ฌ ๋ฑ) | ๋ช ๋ น์ด ๋ฌถ์ ์คํ (๋ณต์ก ๋ก์ง ์ฒ๋ฆฌ) |
ํธ์ถ ์ฃผ์ฒด | DBMS ๋ด๋ถ ํธ๋์ญ์ ํ๋ฆ | ์ฌ์ฉ์ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ |
๋ํ ๊ธฐ๋ฅ | ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ง, ์๋ ๋ก๊ทธ, ๊ฐ์ฌ, ์๋ฆผ | ๋ฐ๋ณต ์์ , ๋ฐฐ์น, ์กฐ๊ฑด ๋ถ๊ธฐ, ๋์ ๋ก์ง |
๊ทธ๋ผ ํจ์์ ํ๋ก์์ ์ ์ฐจ์ด?
- ํจ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ
- ํ๋ก์์ ๋ ์์ ์ง์์์ฒ๋ผ ๋ช ๋ น์ด ๋ฌถ์์ ์คํ (๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๊ธฐ๋ณด๋ค๋ ์ผ์ ์ฒ๋ฆฌํ๋ค!)
์ธ๋ฑ์ค์ PK, FK์ ์ฐจ์ด๊ฐ ๋๋์ฒด ๋ญ์ผ~!?
3๊ฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฑ๋ฅ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ํต์ฌ ์์
- PK = ์ ์ฝ ์กฐ๊ฑด + ์ธ๋ฑ์ค (์๋)
- FK = ์ ์ฝ ์กฐ๊ฑด (์ฐธ์กฐ ๊ด๊ณ), ์ฑ๋ฅ ์ํด ์ธ๋ฑ์ค ๋ฐ๋ก ์์ฑ ํ์
- INDEX = ์ ์ฝ ์์, ์์ ์ฑ๋ฅ ์ต์ ํ ๋๊ตฌ
๊ทธ๋ผ ID์ Index์ ์ฐจ์ด๊ฐ ๋ญ์ผ~!?
- ID๋ ์ฌ์ฉ์๊ฐ ์ค์ ์ ์ํ ์นผ๋ผ์ผ๋ก, ๋ ์ฝ๋ ์๋ณ์ฉ (PK ํ๋ณด)
- Index๋ ์ฌ์ฉ์๊ฐ ์ง์ ๋ณผ ์ ์๋ ์ปฌ๋ผ์ด ์๋๋ฉฐ, DB ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ
๐ SQL ํ๋ (SQL Optimization)
SQL ์ฑ์ฆ์ ๋ฏธ์น๋ ์ํฅ ์์ (SQL ์ต์ ํ ๋์)
- ๋ฐ์ดํฐ ํฌ๊ธฐ
- ๋ฐ์ดํฐ๊ฐ ๋ง์์๋ก ์กฐํ ์๋๊ฐ ๋๋ ค์ง
- ์กฐ์ธ์ ํจ์จ์ฑ
- ๋ถํ์ํ JOIN์ ์ค์ด๊ณ , ์ ์ ํจ INDEX๋ฅผ ์ฌ์ฉ
- ์ธ๋ฑ์ค (Index) ํ์ฉ
- ์ธ๋ฑ์ค๋ฅผ ์ ํ์ฉํ๋ฉด ๊ฒ์ ์๋๋ฅผ ํฌ๊ฒ ํฅ์
- ํ์ํ ๋ฐ์ดํฐ๋ง ์กฐํ
- SELECT * ๋์ ํ์ํ ์นผ๋ผ๋ง ์กฐํ
- ์๋ธ์ฟผ๋ฆฌ vs ์กฐ์ธ
- ์๋ธ์ฟผ๋ฆฌ๋ ๋๋ฆด ์ ์์ผ๋ฏ๋ก ์กฐ์ธ์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ ๊ถ์ฅ
SQL ํ๋ ์ฒดํฌ๋ฆฌ์คํธ
1. `SELECT *` ๋์ ํ์ํ ์ปฌ๋ผ๋ง ์กฐํ
2. ์๋ธ์ฟผ๋ฆฌ ๋์ `JOIN` ์ฌ์ฉ
3. OR ๋์ `UNION` ํ์ฉ
4. `์ธ๋ฑ์ค`๋ฅผ ํ์ฉํด ๊ฒ์ ์๋ ์ต์ ํ
5. COUNT(*) ๋์ `COUNT(์ปฌ๋ผ)` ์ฌ์ฉ
'IT > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL] ๊ธฐ๋ณธ SQL ๋ฌธ๋ฒ ์ด์ ๋ฆฌ & ๋ชจ์ (0) | 2025.03.23 |
---|