์์ฑ์ผ์: 2023๋ 4์ 16์ผ
1. SQL ์๊ฐ
SQL ๋ช ๋ น์ด ๊ธฐ๋ณธ ๋ถ๋ฅ
๋ถ๋ฅ | ๋ช ๋ น์ด |
---|---|
DDL(์ ์์ด) | CREATE ALTER DROP TRUNCATE RENAME COMMENT |
DML(์กฐ์์ด) | SELECT INSERT UPDATE DELETE |
DCL(์ ์ด์ด) | GRANT REVOKE |
TCL(ํธ๋์ญ์ ) | COMMIT ROLLBACK SAVEPOINT |
4. STORED FUNCTION
๋ฌธ์ํ ํจ์
ํจ์ | ์ค๋ช |
---|---|
UPPER | ๋๋ฌธ์ |
LOWER | ์๋ฌธ์ |
INITCAP | ๋จ์ด์ ์ฒซ ๊ธ์๋ง ๋๋ฌธ์, ๋๋จธ์ง๋ ์๋ฌธ์ |
CONCAT | ๋ ๋ฌธ์ ์ด์ด๋ถ์ด๊ธฐ |
SUBSTR | ๋ฌธ์์ด ์๋ฅด๊ธฐ |
LENGTH | ๊ธธ์ด |
LAPD | ์ผ์ชฝ ์ฑ์ฐ๊ธฐ |
RPAD | ์ค๋ฅธ์ชฝ ์ฑ์ฐ๊ธฐ |
LTRIM | (char, [, set]) - char์ ์ข์ธก๋ถํฐ set์ ํฌํจ๋ ๋ฌธ์ ์ ๊ฑฐ |
RTRIM | |
TRANSLATE | ํ ๊ธ์์ฉ ์นํ |
REPLACE | ๋ฌธ์์ด ์นํ |
๊ทธ๋ฃน ํจ์
โป COUNT(*)๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ทธ๋ฃนํจ์๋ NULL๊ฐ์ ๊ณ ๋ คํ์ง ์๋๋ค.
ํจ์ | ์ฌ์ฉ ๋ชฉ์ |
---|---|
COUNT(a) | a์ ํ์ ๊ฐ์๋ฅผ ๊ตฌํจ |
AVG(a) | a์ ํ๊ท ์ ๊ตฌํจ |
SUM(a) | a์ ํฉ๊ณ๋ฅผ ๊ตฌํจ |
MIN(a) | a์ ์ต์๊ฐ์ ๊ตฌํจ |
MAX(a) | a์ ์ต๋๊ฐ์ ๊ตฌํจ |
STDDEV(a) | a์ ํ์ค ํธ์ฐจ๋ฅผ ๊ตฌํจ |
VARIANCE(a) | a์ ๋ถ์ฐ์ ๊ตฌํจ |
5. GROUP BY & HAVING
<SQL ์ฟผ๋ฆฌ ์งํ ์์>
from โ where โ group by โ having โ select โ order by
GROUP BY
โป GROUP BY๋ฅผ ์ฌ์ฉํ๋ฉด, GROUP BY์ ์ ํํ์์ด๋ ์ง๊ณ ํจ์๋ง SELECT์ ์ ๊ธฐ์ ๋ ์ ์๋ค.
/*
* ๊ฐ ์ง์ญ(region_id)๋ณ๋ก ๋ช ๊ฐ์ ๋ถ์๊ฐ ์๋์ง๋ฅผ ๋ํ๋ด์์ค.
* dept ํ
์ด๋ธ์์ ์ง์ญ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ๋ค.
* */
SELECT d.REGION_ID, r.NAME, COUNT(*)
FROM S_DEPT d
, S_REGION r
WHERE d.REGION_ID = r.ID
GROUP BY d.REGION_ID, r.NAME;
GROUP BY ์์
-- 5.2 GROUP BY - ์์ 5
/* ๊ฐ ๋ถ์(dept_id)๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ณ์ฐํด์ ๋ณด์ฌ์ฃผ์์ค. */
SELECT DEPT_ID, AVG(SALARY)
FROM S_EMP
GROUP BY DEPT_ID;
/*
* ๊ฐ ๋ถ์๋ณ๋ก ์ง์ฑ
์ด ์ฌ์์ธ ์ง์๋ค์ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ณ์ฐํด์ ๋ณด์ฌ์ฃผ์์ค
* 1. ๋ถ์๋ณ๋ก ๊ทธ๋ฃนํ group by dept_id
* 2. ์ง์ฑ
์ด ์ฌ์์ธ ์ง์๋ค๋ง ๋ณด์ฌ์ค๋ค. where title = '์ฌ์'
* 3. ํ๊ท ๊ธ์ฌ๋ฅผ ๊ณ์ฐํ๋ค. AVG(SALARY)
* */
SELECT DEPT_ID, SUM(SALARY)
FROM S_EMP
WHERE TITLE = '์ฌ์'
GROUP BY DEPT_ID;
-- 5.3 SELECT ์ ์์์ GROUP ํจ์์ ์๋ชป๋ ์ฌ์ฉ
/*
* ๊ฐ ์ง์ญ(region_id)๋ณ๋ก ๋ช ๊ฐ์ ๋ถ์๊ฐ ์๋์ง๋ฅผ ๋ํ๋ด์์ค.
* dept ํ
์ด๋ธ์์ ์ง์ญ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ๋ค.
* */
SELECT d.REGION_ID, r.NAME, COUNT(*)
FROM S_DEPT d
, S_REGION r
WHERE d.REGION_ID = r.ID
GROUP BY d.REGION_ID, r.NAME;
/*
* ๊ฐ ๋ถ์๋ณ๋ก ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ๋ ํ๊ท ๊ธ์ฌ๊ฐ 2000์ด์์ธ ๋ถ์๋ง ๋ํ๋ด์์ค.
* 1. ๊ฐ ๋ถ์๋ณ๋ก ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ๋ค. (๋ถ์๋ณ๋ก groupํ๋ค. select์ ์ avg(salary))
* 2. ํ๊ท ๊ธ์ฌ๊ฐ 2000์ด์์ธ ๋ถ์๋ง ๋ํ๋ธ๋ค.
* */
SELECT AVG(SALARY)
FROM S_EMP
GROUP BY DEPT_ID
HAVING AVG(SALARY) >= 2000; -- ํ๊ท ๊ธ์ฌ๊ฐ 2000 ์ด์์ธ ๋ถ์๋ง ๋ํ๋ธ๋ค. ๊ทธ๋ฃน์ ๋ํ ์กฐ๊ฑด์ WHERE์ ๊ธฐ์ ํ ์ ์๊ณ having์ ๋ค์ด๊ฐ์ผ ํ๋ค.
HAVING ์
โป GROUP์ ๋ํ ์กฐ๊ฑด์ WHERE ์ ์์ ๊ธฐ์ ํ ์ ์๊ณ , HAVING์ ์์ ๊ธฐ์ ํด์ผ ํ๋ค.
HAVING ์์
-- 5.5 HAVING์ - ์์ 7
/*
* ๊ฐ ์ง์ฑ
๋ณ๋ก ๊ธ์ฌ์ ์ดํฉ์ ๊ตฌํ๋ ์ง์ฑ
์ด ๋ถ์ฅ์ธ ์ฌ๋์ ์ ์ธํ์์ค.
* ๋จ, ๊ธ์ฌ ์ดํฉ์ด 8000(๋ง์)์ด์์ธ ์ง์ฑ
๋ง ๋ํ๋ด๋ฉฐ, ๊ธ์ฌ ์ดํฉ์ ๋ํ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์์ค.
*
* 1. ์ง์ฑ
๋ณ๋ก ๊ทธ๋ฃนํ group by title
* 2. select ์ ์๋ ๊ธ์ฌ์ ์ดํฉ sum(salary)
* 3. ์ง์ฑ
์ด ๋ถ์ฅ์ธ ์ฌ๋์ ์ ์ธํ๋ค. where title not like '%๋ถ์ฅ'
* 4. ๊ธ์ฌ ์ดํฉ์ด(sum(salary)) 8000๋ง์ ์ด์์ธ ์ง์ฑ
๋ง ๋ํ๋ธ๋ค. - ๊ทธ๋ฃน์ ๋ํ ์กฐ๊ฑด์ด๋ฏ๋ก having์ ์ ๊ธฐ์ ํ๋ค.
* 5. ๊ธ์ฌ ์ดํฉ(sum(salary))์ ๋ํ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
* */
SELECT TITLE, SUM(SALARY) sum_sal
FROM S_EMP
WHERE TITLE NOT LIKE '%๋ถ์ฅ'
GROUP BY TITLE
HAVING SUM(SALARY) >= 8000
ORDER BY sum_sal;
/*
* ๊ฐ ๋ถ์๋ณ๋ก ์ง์ฑ
์ด ์ฌ์์ธ ์ง์๋ค์ ๋ํด์๋ง ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ์์ค.
* 1. ๋ถ์๋ณ๋ก ๊ทธ๋ฃนํ group by dept_id
* 2. ์ง์ฑ
์ด ์ฌ์์ธ ์ง์๋ง ๋ณด์ฌ์ค๋ค. where title = '์ฌ์'
* 3. select ์ ์๋ ํ๊ท ๊ธ์ฌ => avg(salary)
* */
SELECT dept_id
, (SELECT NAME FROM S_DEPT WHERE ID = e.DEPT_ID) AS dept_name
, AVG(SALARY)
FROM S_EMP e
WHERE TITLE = '์ฌ์'
GROUP BY dept_id;
SELECT s_emp.SALARY, s_emp.TITLE, s_emp.DEPT_ID, S_EMP.*
FROM S_EMP$
WHERE TITLE = '์ฌ์'
ORDER BY s_emp.DEPT_ID;
-- 5.6 GROUP์ SUBGROUP์ผ๋ก ์ธ๋ถํ ํ๊ธฐ
/*
* ๊ฐ ๋ถ์๋ด์์ ๊ฐ ์ง์ฑ
๋ณ๋ก ๋ช ๋ช
์ ์ธ์์ด ์๋์ง ๋ํ๋ด์์ค.
* 1. ๋ถ์์ ์ง์ฑ
๋ณ๋ก ๊ทธ๋ฃนํ
* */
SELECT DEPT_ID, TITLE, COUNT(*)
FROM S_EMP
GROUP BY DEPT_ID, TITLE
/*
* ๊ฐ ๋ถ์๋ด์์ ๋ช ๋ช
์ ์ง์์ด ๊ทผ๋ฌดํ๋์ง ๋ํ๋ด์์ค.
* 1. ๋ถ์๋ก ๊ทธ๋ฃนํํ๊ณ countํ๋ฉด ๋ ๊ฒ ๊ฐ์๋ฐ..?
* */
SELECT DEPT_ID, COUNT(*)
FROM S_EMP
GROUP BY DEPT_ID;
/*
* ๊ฐ ๋ถ์๋ณ๋ก ๊ธ์ฌ์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๋ํ๋ด์์ค. ๋จ, ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ด ๊ฐ์ ๋ถ์๋ ์ถ๋ ฅํ์ง ๋ง์์ค.
* 1. ๋ถ์๋ณ๋ก ๊ทธ๋ฃนํํ๋ค. group by dept_id
* 2. ๊ธ์ฌ์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๊ตฌํ๋ค. min(salary), max(salary)
* */
SELECT DEPT_ID, min(salary), max(salary)
FROM S_EMP
GROUP BY DEPT_ID
HAVING min(salary) != max(salary)
ORDER BY DEPT_ID;
6. JOIN
JOIN์ด๋?
- 1๊ฐ ์ด์์ ํ ์ด๋ธ๋ก๋ถํฐ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํด์ค๋ ๋ฐฉ๋ฒ.
- PK์ FK๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋ค์ ์ฐ๊ด์ผ๋ก ์ฑ๋ฆฝ๋ ๊ฐ๋ฅํจ(์ฐ๊ด๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ)
- ํ ์ด๋ธ๊ฐ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ ์์ ๋ ํฉ์ณ์ ์๋ก์ด ํ ์ด๋ธ์ ๋ณด์ฌ์ค๋ค.
JOIN์ ์ข ๋ฅ
JOIN ๋ฐฉ๋ฒ | ์๋ฏธ | ์์ |
---|---|---|
Equijoin | ์ปฌ๋ผ ๊ฐ์ ๊ฐ๋ค์ด ์๋ก ์ ํํ ์ผ์นํ ๋(์ผ๋ฐ์ ์ผ๋ก PK, FK๋ก ์ฎ๋๋ค.) | ์์ 9, 10 |
Non-Equijoin | ์ปฌ๋ผ ๊ฐ์ ๊ฐ์ด ์ ํํ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ โ=โ ์ฐ์ฐ์๋ ์ฌ์ฉ๋ถ๊ฐ. BETWEEN ๋ฑ์ ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์กฐ๊ฑด ๊ฒฐ๊ณผ๊ฐ ์ฐธ์ธ ๋ฐ์ดํฐ ํ์ธํจ | ๊ธ์ฌ์ ๋ฑ๊ธ์ ๋งค๊ธธ ๋(์์ 11) |
Outer Join | Join ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์๋ ๋ชจ๋ ํ์ ๋ณด๊ณ ์ถ์ ๋.๋ฐ์ดํฐ๊ฐ ๋ถ์กฑํ ๊ณณ์ (+) ๋ถ์ธ๋ค. | ์์ 12 - ๊ณ ๊ฐ ๊ธฐ์ค์ผ๋ก ์ถ๋ ฅํ๋ ๊ฒ ์๊ตฌ์ฌํญ์ด๊ณ ์ง์์ด ๋ถ์กฑํ๋ ์ง์ ์ชฝ์ (+) ๋ถ์ |
Self Join | ๊ฐ์ ํ
์ด๋ธ์ ์๋ ํ๋ค์ JOINํ ๋. ํ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์์ ๊ณ์ธต์ด ์์ด์ผ ํ๋ค.(์์ฌ - ๋ถํ, ๋๋ถ๋ฅ-์ค๋ถ๋ฅ-์๋ถ๋ฅ) | ์์ 13 - ์๊ธฐ ์์ฌ๊ฐ ๋๊ตฌ์ธ์ง ์์๋ผ ๋ |
JOIN ์์
-- 6.4 EQUIJOIN - ์์ 9
/* ์ง์(S_EMP) ํ
์ด๋ธ๊ณผ ๋ถ์(S_DEPT) ํ
์ด๋ธ์ JOINํ์ฌ, ์ฌ์์ ์ด๋ฆ๊ณผ ๋ถ์, ๋ถ์๋ช
์ ๋ํ๋ด์์ค */
SELECT e.NAME, d.NAME
FROM S_EMP e
, S_DEPT d
WHERE e.DEPT_ID = d.ID;
-- 6.5 ์ปฌ๋ผ๊ณผ ํ
์ด๋ธ์ ALIAS ์ฌ์ฉ - ์์ 10
/*
* ์์ธ ์ง์ญ์ ๊ทผ๋ฌดํ๋ ์ฌ์์ ๋ํด ๊ฐ ์ฌ์์ ์ด๋ฆ๊ณผ ๊ทผ๋ฌดํ๋ ๋ถ์๋ช
์ ๋ํ๋ด์์ค.
* 1. ์์ธ ์ง์ญ(S_REGION.ID = 1), title = '์ฌ์'
* */
SELECT r.NAME, e.NAME, d.NAME
FROM S_EMP e
, S_DEPT d
, S_REGION r
WHERE e.DEPT_ID = d.ID
AND d.REGION_ID = r.ID
AND d.REGION_ID = 1
AND e.TITLE = '์ฌ์';
-- NON-EQUIJOIN - ์์ 11
/*
* ์ง์ ํ
์ด๋ธ(S_EMP)๊ณผ ๊ธ์ฌ ํ
์ด๋ธ(SALGRADE)์ JOINํ์ฌ ์ฌ์์ ์ด๋ฆ๊ณผ, ๊ธ์ฌ, ๊ทธ๋ฆฌ๊ทธ ํด๋น ๊ธ์ฌ๋ฑ๊ธ์ ๋ํ๋ด์์ค.
* 1.
* */
SELECT emp.NAME, emp.SALARY, grade.GRADE
FROM S_EMP emp
, SALGRADE grade
WHERE emp.SALARY BETWEEN grade.LOSAL AND grade.HISAL;
-- 6.7 OUTER JOIN - ์์ 12
/*
* ์ง์(S_EMP) ํ
์ด๋ธ๊ณผ ๊ณ ๊ฐ(S_CUSTOMER) ํ
์ด๋ธ์์ ์ฌ์์ ์ด๋ฆ๊ณผ ์ฌ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ฌ์์ ๋ด๋น ๊ณ ๊ฐ ์ด๋ฆ์ ๋ํ๋ด์์ค.
* ๋จ, ๊ณ ๊ฐ์ ๋ํ์ฌ ๋ด๋น ์์
์ฌ์์ด ์๋๋ผ๋ ๋ชจ๋ ๊ณ ๊ฐ์ ์ด๋ฆ์ ๋ํ๋ด๊ณ , ์ฌ๋ฒ ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์์ค.
* */
SELECT e.NAME AS "์ด๋ฆ", e.ID AS "์ฌ๋ฒ", c.NAME AS "๋ด๋น๊ณ ๊ฐ์ด๋ฆ", c.ID
FROM S_EMP e -- ์กฐ์ธํ ๋ฐ์ดํฐ๊ฐ ๋ถ์กฑํ ๊ณณ์ + ๋ถ์ธ๋ค. ๊ณ ๊ฐ ๊ธฐ์ค์ผ๋ก ์ถ๋ ฅํ๋๋ฐ ์์
์ฌ์์ด ๋ถ์กฑํ๋๊น s_emp์ชฝ์ +๋ถ์ธ๋ค.
, S_CUSTOMER c
WHERE e.ID(+) = c.SALES_REP_ID
ORDER BY e.ID;
-- 6.8 SELF JOIN - ์์ 13
/*
* ์ง์ ์ค์ '๊น์ ๋ฏธ'์ ๊ฐ์ ์ง์ฑ
(title)์ ๊ฐ์ง๋ ์ฌ์์ ์ด๋ฆ๊ณผ ์ง์ฑ
, ๊ธ์ฌ, ๋ถ์๋ฒํธ๋ฅผ ๋ํ๋ด์์ค(SELF JOIN์ ์ฌ์ฉํ ๊ฒ)
* */
SELECT e1.NAME, e1.TITLE, e1.SALARY, e1.DEPT_ID
FROM S_EMP e1
, S_EMP e2
WHERE e2.NAME = '๊น์ ๋ฏธ'
AND e2.TITLE = e1.TITLE;
SET ์ฐ์ฐ์
- ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ select์ ์ปฌ๋ผ ๊ฐ์&ํ์ ์ด ๊ฐ์์ผํจ
- ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ, ๊ฐ์ ํ ์ด๋ธ SET ๊ฐ๋ฅํ๋ค.
- ORDER BY๋ ๋ง์ง๋ง์ ํ ๋ฒ๋ง ๊ธฐ์ ํ๋ค.
์ข ๋ฅ | ์ค๋ช |
---|---|
Union | ๊ฐ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ํฉ์งํฉ |
Union All | ๊ฐ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ํฉ์งํฉ + ์ค๋ณต ๋ฐ์ดํฐ |
Intersect | ๊ฐ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๊ต์งํฉ |
Minus | ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ฐจ์งํฉ |
SET ์ฐ์ฐ์ ์์ - UNION ALL
โป ๊ต์งํฉ์ด ์์ผ๋ฉด UNION ALL๋ก ํด์ผ ํ๋ค. โ ๊ทธ๋์ผ ์๋ ๋ ๋น ๋ฆ
-- SET ์ฐ์ฐ์ UNION ALL
SELECT NAME, DEPT_ID, TITLE
FROM S_EMP
WHERE DEPT_ID = 110
UNION ALL
SELECT NAME, DEPT_ID, TITLE
FROM S_EMP
WHERE DEPT_ID = 113
ORDER BY 2 desc;
7. ์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ๋?
- ํ๋์ SELECT๋ฌธ ์์ ํฌํจ๋์ด ์๋ ๋ ๋ค๋ฅธ SELECT ๋ฌธ์ฅ
- ๋ณดํต โ ์๋ธ์ฟผ๋ฆฌ โ โก๋ฉ์ธ์ฟผ๋ฆฌ ์์๋ก ๊ณ์ฐํจ
์๋ธ์ฟผ๋ฆฌ ์ข ๋ฅ

Single Row SubQuery
- ๋ฉ์ธ ์ฟผ๋ฆฌ๋ก ์ ๋ฌ๋๋ ํ์ด ๋จ ํ๋์ธ ๊ฒฝ์ฐ
- ๋จ์ผํ ์ฐ์ฐ์ โ=โ ์ฌ์ฉ
/* Single Row SubQUERY */
SELECT NAME, TITLE, DEPT_ID
FROM S_EMP
WHERE DEPT_ID = (
SELECT DEPT_ID
FROM S_EMP
WHERE NAME = '๊น์ ๋ฏธ'
);
Multi Row SubQuery
- ๋ฉ์ธ ์ฟผ๋ฆฌ๋ก ์ ๋ฌ๋๋ ํ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ
- ๋ค์ค ํ ์ฐ์ฐ์ ์ฌ์ฉ(IN, NOT IN, ANY, ALL, EXISTS, NOT EXISTS)
/* Multi Row SubQUERY */
SELECT NAME, DEPT_ID -- ์ถฉ์ฒญ/๊ฐ์์ ์๋ ๋ถ์์์ ๊ทผ๋ฌดํ๋ ์ง์
FROM S_EMP
WHERE DEPT_ID IN (
SELECT ID
FROM S_DEPT
WHERE region_id = 3
);
-- 14.9 Multi Row Comparison Operator - ANY
/*
* ๋ณธ์ธ์ ๊ธ์ฌ๊ฐ ๊ฐ ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ ์ค ์ด๋ ํ ๋ถ์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ์ ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ๋ํด ์ด๋ฆ, ๊ธ์ฌ, ๋ถ์๋ฒํธ๋ฅผ ์ถ๋ ฅํ์์ค.
* 1. ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ๋ค.
* 2.
* */
SELECT NAME, SALARY, DEPT_ID
FROM S_EMP
WHERE SALARY < ANY (
SELECT AVG(SALARY)
FROM S_EMP
GROUP BY DEPT_ID
);
Multi Column SubQuery
- ์ฌ๋ฌ ๊ฐ์ ์ปฌ๋ผ์ ๋์์ ๋น๊ตํ๋ ๊ฒฝ์ฐ(pair-wise)
/* Multi-column SubQUERY */
SELECT *
FROM S_EMP
WHERE (SALARY, DEPT_ID) IN
(SELECT MIN(SALARY), DEPT_ID
FROM S_EMP
GROUP BY DEPT_ID);
FROM์ ์ SubQuery
- ํ ํ ์ด๋ธ์ ๋ฐ์ดํฐ์ ์์ด ๋ง์ ๊ฒฝ์ฐ์๋ FROM์ ์ ํ ์ด๋ธ ์ ์ฒด๋ฅผ ๊ธฐ์ ํด ์ฌ์ฉํ๋ฉด ํจ์จ์ด ๋จ์ด์ง ์ ์๋ค.
- ํ ์ด๋ธ์์ ํ์ํ ํ๊ณผ ์ปฌ๋ผ์ ์ ํํ์ฌ ์๋ธ์ฟผ๋ฆฌ๋ก FROM์ ์ ๋ฃ์ ์ ์๋ค.
- ์ด๋ฐ ์๋ธ์ฟผ๋ฆฌ๋ฅผ INLINE VIEW๋ผ๊ณ ๋ถ๋ฅธ๋ค.
SELECT e.name, e.title, d.name
FROM S_DEPT d
, (
SELECT name, title, dept_id
FROM S_EMP
WHERE TITLE = '์ฌ์'
) e
WHERE e.dept_id = d.id;
ํ์ฉ
HAVING์ ์์์ SubQuery
/* HAVGIN์ ์์์ SubQUERY */
SELECT DEPT_ID, AVG(SALARY)
FROM S_EMP
GROUP BY DEPT_ID
HAVING AVG(SALARY) > (SELECT AVG(SALARY) -- 113๋ถ์์ ํ๊ท ์ฐ๋ด์ ๊ตฌํ๋ค. / 113๋ถ์์ ํ๊ท ์ฐ๋ด๋ณด๋ค ๋ ๋์ ํ๊ท ์ฐ๋ด์ ๋ฐ๋ ๋ถ์ ๊ตฌํ๊ฐใ
ฃ
FROM S_EMP
WHERE DEPT_ID = 113);
-- 7.7 HAVING ์ ์์์ SubQUERY - ์์ 14
/*
* ๊ฐ์ฅ ์ ์ ํ๊ท ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์ฑ
์ ๋ํด ๊ทธ ์ง์ฑ
๊ณผ ํ๊ท ๊ธ์ฌ๋ฅผ ๋ํ๋ด์์ค.
* 1. ์ง์ฑ
๊ธฐ์ค์ผ๋ก group by ํด์ ์ง์ฑ
๋ณ๋ก ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ๋ค.
* 2. ๊ฐ์ฅ ์ ์ ํ๊ท ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์ฑ
์ ๊ตฌํ๋ค.
* */
SELECT TITLE, AVG(SALARY)
FROM S_EMP
GROUP BY TITLE
HAVING AVG(SALARY) = (
SELECT MIN(AVG(SALARY))
FROM S_EMP
GROUP BY TITLE
);
CREATE์ ์์์ SubQuery(ํ ์ด๋ธ ๋ณต์ฌ, ํ ์ด๋ธ ๊ตฌ์กฐ๋ง ๋ณต์ฌ)
-- 7.8 CREATE ์ ์์์ SubQUERY
CREATE TABLE emp_test (id, name, mailid, start_date)
AS SELECT ID, NAME, MAILID, START_DATE
FROM S_EMP
-- WHERE DEPT_ID = 113;
WHERE 1 != 1; -- ํ
์ด๋ธ ๊ตฌ์กฐ๋ง ๋ณต์ฌ(data๋ ๋ณต์ฌํ๊ณ ์ถ์ง ์์ ๋)
DML(INSERT, UPDATE)๋ฌธ์์์ SubQUERY
-- 7.9 DML๋ฌธ์์์ SubQUERY
INSERT INTO emp_test (ID, NAME, MAILID, START_DATE) -- ์กฐํํ ๋ฐ์ดํฐ๋ฅผ insert
SELECT ID, NAME, MAILID, START_DATE
FROM S_EMP
WHERE START_DATE < '16/01/01';
UPDATE S_EMP
SET DEPT_ID = (
SELECT DEPT_ID
FROM S_EMP
WHERE TITLE = '์ฌ์ฅ'
)
WHERE NAME = '์์ฐฝํ'; -- ์ด๋ฆ์ด ์์ฐฝํ์ธ ์ง์์ ์ฌ์ฅ์ ๋ถ์๋ก ๋ณ๊ฒฝ
8. Constraint ์ ์ฝ์กฐ๊ฑด
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ ์ ์ง, DB ๋ณดํธ(์๋ชป๋ ๋ฐ์ดํฐ ์ ๋ ฅ์ด๋ ์ค์ ๋ฑ์ ๋ฐฉ์งํจ)๋ฅผ ์ํ์ฌ ์ฌ์ฉํจ
์ ์ฝ์กฐ๊ฑด์ ์ข ๋ฅ

์ ์ฝ์กฐ๊ฑด | ์ค๋ช |
---|---|
PRIMARY KEY | - ํ
์ด๋ธ์ ๋จ ํ๋๋ง ํ์ฉ. - ๋จ์ผ์ปฌ๋ผ์ด๊ฑฐ๋ ์ฌ๋ฌ ์ปฌ๋ผ์ ์กฐํฉ๋ ๊ฐ๋ฅ - NULL๊ฐ ํ์ฉX. Java Map์ Key์ ๊ฐ์ ๊ฒ - PK๋ก ์ค์ ๋ ์ปฌ๋ผ์ ๋ํด UNIQUE ์ธ๋ฑ์ค ์๋์ผ๋ก ์์ฑํ๋ค. (์ธ๋ฑ์ค = ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ ๋ ์ค๋ณต ๊ฐ์ด ์๋์ง ํ์ธํ๋ ์๊ฐ์ ์ค์ผ ์ ์์) |
FOREIGN KEY | - ์์ ํ
์ด๋ธ์ ์ ์ํ๋ค. - ๋ถ๋ชจ ํ ์ด๋ธ์ ๊ฐ๊ณผ ์ผ์นํ๊ฑฐ๋ NULL์ด์ด์ผ ํ๋ค. |
NOT NULL | NULL๊ฐ ํ์ฉX |
UNIQUE | ๋ชจ๋ ํ์์ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๋ ๊ฒ(=์ค๋ณตX) |
CHECK | ๊ฐ ํ์ด ๋ง์กฑํด์ผ ํ๋ ์กฐ๊ฑด ์ ์, ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ ๋ฐ์ดํฐ๋ INSERT, UPDATE ๋ถ๊ฐ๋ฅ |
PK : ํ ํ์ ๊ตฌ๋ณ๋๊ฒ ํด์ฃผ๋ ์ปฌ๋ผ
FK : ๋ค๋ฅธ ํ ์ด๋ธ์ PK. PK์ ์๋ ๊ฐ์ ์ ์ฅ ๋ถ๊ฐ. ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ
9. TRANSACTION CONTROL ํธ๋์ญ์ ์ปจํธ๋กค
ํธ๋์ญ์ ์ด๋?
- ๋
ผ๋ฆฌ์ ์ธ ์
๋ฌด์ ์์
๋จ์
(์์ - ๊ณ์ข์ด์ฒด = ์ถ๊ธ + ์ ๊ธ)
ํธ๋์ญ์ ์ ์์ฑ
์ฝ์ | ์ข ๋ฅ | ์ค๋ช |
---|---|---|
A | ์์์ฑ Atomicity | ํ๋์ ์์์ ์ธ ์์
๋จ์๋ก ์ฒ๋ฆฌํจ. ํ๋์ ์์ ์ด๋ผ๋ ์คํจํ๋ฉด ํธ๋์ญ์ ์ ์ฒด๊ฐ ์คํจ. ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ์์ ์ ๋ชจ๋ ์ฑ๊ณต or ๋ชจ๋ ์คํจํด์ ์์ํ๋ก ๋กค๋ฐฑ |
C | ์ผ๊ด์ฑ Consistency | ํธ๋์ญ์
์์์ ๊ณผ ์ข
๋ฃํ DB๋ ํญ์ ์ผ๊ด๋ ์ํ ์ ์ง |
I | ๋
๋ฆฝ์ฑ(๊ฒฉ๋ฆฌ์ฑ) Isolation | ๊ฐ๊ฐ์ ํธ๋์ญ์
์ ๋
๋ฆฝ์ ์ธ ์์ ๋จ์. ํธ๋์ญ์ ๊ฐ์ ๋๊ธฐํ ์ ์ง๋จ. |
D | ์ง์์ฑ Durability | ํธ๋์ญ์
์ฑ๊ณตํ ๊ทธ ๊ฒฐ๊ณผ๋ ์ ๊ตฌ์ ์ผ๋ก DB์ ์ ์ฅ๋์ด์ผ ํจ |
๋ช ์์ ํธ๋์ญ์ ๋ช ๋ น์ด
๋ช ๋ น์ด | ์ค๋ช |
---|---|
COMMIT | ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ DB์ ์์ ํ ๋ฐ์. ํ์ฌ ํธ๋์ญ์ ์ข ๋ฃ. |
SAVEPOINT | ํ์ฌ์ ํธ๋์ญ์ ์ SAVEPOIINT ์ง์ ํจ. |
ROLLBACK [TO ์ธ์ด๋ธ ํฌ์ธํธ ์ด๋ฆ] | ์์ง ์ ์ฅ์๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ์ ์ทจ์ํ๊ณ ํ์ฌ์ ํธ๋์ญ์ ์ข ๋ฃํจ. |
DML โ ์คํ ์ปค๋ฐ ์๋
DDL, DCL โ ์คํ ์ปค๋ฐ
COMMIT๊ณผ ROLLBACK ์ /ํ ๋ฐ์ดํฐ ์ํ
ROLLBACK, COMMIT์
- ๋ฐ์ดํฐ ์ด์ ์ํ ๋ณต๊ตฌ ๊ฐ๋ฅ(๋ฒํผ๋ง ์ํฅ ๋ฐ์์)
- ํ์ฌ ์ฌ์ฉ์ SELECT๋ฌธ์ผ๋ก ์์ ๊ฒฐ๊ณผ ํ์ธ ๊ฐ๋ฅ
- ๋ค๋ฅธ ์ฌ์ฉ์๋ ํ์ฌ ์ฌ์ฉ์์ ์ํ ์์ ๊ฒฐ๊ณผ ๋ชป๋ด
- ๋ณ๊ฒฝ๋ ํ์ LOCK ์ค์ ๋์ด ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ(DB์ ๋ฐ์์ ์ ๋์ด๋ ๋ค๋ฅธ ์ฌ๋์ด ์ ๋ ฅ/์์ ๋ชปํจ)
ROLLBACKํ
- ๋ฐ์ดํฐ์ ๋ํ ๋ณ๊ฒฝ์ฌํญ ์ทจ์
- ์ด์ ๋ฐ์ดํฐ ๋ค์ ์ฌ์ ์ฅ๋จ(DB์์ ์๋ก ๊ฐ์ ธ์จ๋ค)
- ๊ด๋ จ๋ ํ์ ๋ํ LOCK์ด ํ๋ ค์ ๋ค๋ฅธ์ฌ์ฉ์๊ฐ ์กฐ์๊ฐ๋ฅ
COMMMITํ
- ๋ฐ์ดํฐ์ ๋ํ ๋ณ๊ฒฝ์ฌํญ DB์ ๋ฐ์๋จ
- ์ด์ ๋ฐ์ดํฐ๋ ์์ํ ์ฌ๋ผ์ง(๋ฐฑ์ ์ํ์ ๋, ๋๋๋ฆฌ๊ธฐ ๋ฐฑ์ ํ์ผ๋ฉด ๊ฐ๋ฅ์ ํจ..)
- ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ด๊ฐ ์์ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์
- ๊ด๋ จ๋ ํ์ ๋ํ LOCK์ด ํ๋ ค์ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ํ ์กฐ์ ๊ฐ๋ฅํจ
10. DICTIONARY
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง
- ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก๋ง ์ ๊ณต๋๋ ๋ทฐ(VIEW)์ ํ ์ด๋ธ์ ์งํฉ
13. OBJECT
์ค๋ธ์ ํธ | ์ค๋ช |
---|---|
์ํ์ค | ์๋์ผ๋ก ๊ณ ์ ํ ์ซ์๊ฐ์ ์์ฑํด์ฃผ๋ฉฐ ์ฃผ๋ก ๊ธฐ๋ณธํค ๊ฐ์ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ |
์ธ๋ฑ์ค | ์ฟผ๋ฆฌ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํด ์ฌ์ฉ(b*tree๋ก ๋์ด์๋ค. data๋ฅผ ๋นจ๋ฆฌ ์ฐพ๊ฒํ๋ ๊ฒ) |
๋ทฐ | ๊ฐ์ ํ ์ด๋ธ |
ํ ์ด๋ธ(table) | |
์๋ ธ๋ | |
ํ๋ก๊ทธ๋จ ์ ๋ |
์ธ๋ฑ์ค(Index)
- data๋ฅผ ๋นจ๋ฆฌ ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ
- B*Tree๋ก ๋์ด์๋ค.
- ORACLE Server๊ฐ ์ต์ ํ ๋ฐฉ๋ฒ(Optimization method)์ ๋ฐ๋ผ ์ด๋ค Index๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง, ํน์ Index๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ค.
โ ์๋ค๊ณ ๋ฌด์กฐ๊ฑด ์ฌ์ฉ๋๋ ๊ฑฐ X, ์๋ํ ๋๋ก ์ฌ์ฉ๋์ง ์์ผ๋ฉด hint ์ฃผ๋ฉด๋จ(์๋๋ช ๋ น)
- ์๋ ์์ฑ(PK, ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ํด ์๋์ผ๋ก ์์ฑ) or ์ฌ์ฉ์ ์์ฑ
์ธ๋ฑ์ค์ ๊ตฌ์กฐ
- ๊ฐ ํ์ ๋์ํ๋ ์ฃผ์(ROWID)์ ์ธ๋ฑ์ค ์ปฌ๋ผ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ์ค๋ผํด์ B*Tree ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
- ํด๋น ROWID๋ฅผ ๊ฐ๋ ์ปฌ๋ผ๊ฐ์ด ์๋ ๋ ธ๋์ ์ด๋ฅผ ๋๊น์ง ํธ๋ฆฌ๋ฅผ ํ์ํ๋ค.
B*Tree ํน์ง
๊ท ํ์ด์งํ์
๊ตฌ์กฐ์ด๋ค.
- ํ์ด ํ ์ด๋ธ์ ์ด๋์ ์์ด๋ ๊ฑฐ์ ๊ฐ์ ํ์ ๋ด์ ์ง์ ๋ ๊ฐ์ ์ฐพ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ
- ํธ๋ฆฌ์ ์ ๋ ฌ๋ ์ฌ๋ฌ ๊ฐ์ ์ ์ฅ์ฅ์ ํ์ด์ง๋ก ๊ตฌ์ฑ๋๋ค.
- ๊ฐ ํ์ด์ง๋ ํค ๊ฐ์ด ๋ฐ์ดํฐ์ ์์น๋ฅผ ๊ฐ๋ฆฌํฌ ๋๊น์ง ๊ตฌ์กฐ์ ์๋์ชฝ์ผ๋ก ํฅํ๋ ํ์ด์ง์ ๋ํ ํฌ์ธํฐ์ ์ผ๋ จ์ ํค๊ฐ์ ๊ฐ๊ณ ์๋ค.
์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด์ผ ํ ๋
โ where์ ์ ์์ฃผ ๋ค์ด๊ฐ๋ ์ปฌ๋ผ์ด๋ฉด ์ธ๋ฑ์ค ๋ง๋ ๋ค.
- where์ด๋ join์กฐ๊ฑด์์ ์ปฌ๋ผ์ ์์ฃผ ์ธ ๋
- ์ปฌ๋ผ์ด ๋์ ๋ฒ์ ๊ฐ์ ๊ฐ์ง ๋
- ๋ง์ NULL๊ฐ์ ๊ฐ์ ์ปฌ๋ผ์ผ ๋(index์ null ์ ์ฅ ์ํจ)
- ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ง๊ณ ๊ทธ ํ ์ด๋ธ์์ ์กฐํ๋๋ ํ์ ์๊ฐ ์ ์ฒด์ 10-15%์ ๋์ผ ๋
์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ง ์์์ผ ํ ๋
- ํ ์ด๋ธ์ด ์์ ๋
- ์ปฌ๋ผ์ ์กฐํ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ณ๋ก ์์ ๋
- ๋๋ถ๋ถ์ ์กฐํ๊ฐ ํ์ 10-15% ์ด์์ ๊ฒ์ํ๋ค๊ณ ์์๋ ๋
- ํ ์ด๋ธ์ด ์์ฃผ ๋ณ๊ฒฝ๋ ๋
โป ์ธ๋ฑ์ค๊ฐ ํญ์ ๋น ๋ฅธ ๊ฒ์ ์๋๊ณ , ์ธ๋ฑ์ค๋ฅผ ๋ง์ด ๋ง๋ ๋ค๊ณ ํญ์ ์ข์ ๊ฒ์ ์๋๋ค. ์ธ๋ฑ์ค๊ฐ ์ ์ง๋๊ธฐ ์ํด์๋ ๊ทธ๋งํผ ์ ์ฅ๊ณต๊ฐ์ด ํ์ํ๊ณ , ํ ์ด๋ธ์ ์์ ์์ ์ธ๋ฑ์ค๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ฏ๋ก ์๋ฒ์ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์๋ค.
INDEX์ ํจ์จ์ ์ฌ์ฉ - index๊ฐ ์กด์ฌํ์ง๋ง ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ
INDEXED ์ปฌ๋ผ์ ๋ณํ
SELECT ID, NAME, TITLE
FROM S_EMP
WHERE SUBSTR(TITLE, -2, 2) = '๋ถ์ฅ'; -- INDEX ์ฌ์ฉX
SELECT ID, NAME, TITLE
FROM S_EMP
WHERE SUBSTR(TITLE, -2, 2) = '๋ถ์ฅ%'; -- INDEX ์ฌ์ฉ
SELECT
FROM S_EMP
WHERE SALARY * 12 = 24000; -- index๊ฐ ์ฌ์ฉ์๋จ
SELECT
FROM S_EMP
WHERE SALARY = 24000 / 12; -- index๊ฐ ์ฌ์ฉ๋จ
๋ถ์ (NOT, <>)์ผ๋ก ์กฐ๊ฑด์ ๊ธฐ์ ํ ๊ฒฝ์ฐ
SELECT ID, NAME, TITLE
FROM S_EMP
WHERE TITLE <> '์ฌ์'; -- index๊ฐ ์ฌ์ฉ์๋จ
SELECT ID, NAME, TITLE
FROM S_EMP e
WHERE NOT EXISTS (
SELECT 'X' -- ์ซ์๋ณด๋ค ๋ฌธ์๊ฐ ์๋๊ฐ ๋ ๋น ๋ฅด๊ธฐ๋๋ฌธ
FROM S_EMP
WHERE e.TITLE = '์ฌ์' -- index๊ฐ ์ฌ์ฉ๋จ
);
INDEXED ์ปฌ๋ผ์ด NULL๋ก ๋น๊ตํ ๊ฒฝ์ฐ(์ปฌ๋ผ์ ๊ฐ์ด NULL์ธ ํ์ INDEX์ ์ ์ฅ๋์ง ์์)
Optimizer์ ์ทจ์ฌ์ ํ
Uploaded by N2T