Database/SQL

SQL ๊ธฐ์ดˆ ์š”์•ฝ๋ณธ

์ฑ”๐Ÿป 2024. 1. 24. 19:55

์ž‘์„ฑ์ผ์ž: 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 JoinJoin ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์•„๋„ ๋ชจ๋“  ํ–‰์„ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ.

๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ€์กฑํ•œ ๊ณณ์— (+) ๋ถ™์ธ๋‹ค.
์˜ˆ์ œ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 NULLNULL๊ฐ’ ํ—ˆ์šฉ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