์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.


1. ๊ฐœ์š”2. ์ƒ์„ธ3. ๋ฌธ๋ฒ•4. ์™ธ๋ถ€ ๋งํฌ

1. ๊ฐœ์š”[ํŽธ์ง‘]

begin
    dbms_output.put_line('hello world'); 
end;

Structured Query Language: SQL


๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์—์„œ ์ž๋ฃŒ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ์กฐ์  ๋ฐ์ดํ„ฐ ์งˆ์˜ ์–ธ์–ด. ์—์Šคํ์—˜, ํ˜น์€ ์‹œํ€„์ด๋ผ๊ณ  ์ฝ๋Š”๋‹ค.

๋กœ๊ณ ๋Š” SQL์„ ์‚ฌ์šฉํ•˜๋Š” ํšŒ์‚ฌ๋ณ„๋กœ ์ƒ‰์ƒ์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด ํ‘œํ˜„ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ฌ๋ณผ ์ž์ฒด๋Š” ์›ํ†ต์„ ์Œ“์€ ๋ชจ์–‘์ด ๊ณต์šฉ์œผ๋กœ ์“ฐ์ธ๋‹ค.

2. ์ƒ์„ธ[ํŽธ์ง‘]

์–ด๋А ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋‚˜ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์›Œ๋‘๋ฉด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์“ธ๋ฐ๊ฐ€ ๋งŽ๋‹ค. ๋‹ค๋งŒ, NoSQL ๊ณ„์—ด์—์„œ๋Š” SQL ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ DBMS ๋ฒค๋”[1]์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” SQL์—๋Š” ๋‹ค์†Œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ANSI SQL์ด๋ผ๊ณ  ํ•˜๋Š” ํ‘œ์ค€ SQL ๊ตฌ๋ฌธ์ด ์žˆ์œผ๋‚˜ DBMS ์‹œ์žฅ์„ ๋…์‹ํ•˜๊ณ  ์žˆ๋Š” ์˜ค๋ผํด์ด ์ž˜ ์ง€ํ‚ค์ง€ ์•Š์•„์„œ ๊ฑฐ๊ธฐ๋‹ค๊ฐ€ ์˜คํ”ˆ์†Œ์Šค DBMS์ธ MySQL๋„ ํ‘œ์ค€ ๋”ฐ์œ„๋Š” ์ง€ํ‚ค์งˆ ์•Š๋Š”๋‹ค. ํ˜„์‹ค์€ ์‹œ๊ถ์ฐฝ. ์ตœ๊ทผ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ๋Š” PostgreSQL์€ ํ‘œ์ค€ SQL์„ ์ž˜ ์ง€ํ‚ค๊ณ  ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” RDB(๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)์ด๋ฉฐ, RDB์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๋ชจ์Œ์ธ ํ…Œ์ด๋ธ”[2]์„ ๊ธฐ์ค€์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— SQL ์—ญ์‹œ ํ…Œ์ด๋ธ”์„ ์—ผ๋‘์— ๋‘๊ณ  ์ฝ์œผ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

์•„๋ž˜ ๊ตฌ๋ฌธ ์„ค๋ช… ๋ฐ ์˜ˆ์ œ๋Š” ๊ณตํ†ต์ ์œผ๋กœ ๋Œ€๋ฌธ์ž๋Š” ํ‚ค์›Œ๋“œ, ์†Œ๋ฌธ์ž๋Š” ์ด๋ฆ„์ด๋‚˜ ๊ฐ’ ๋“ฑ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ , ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” WHERE ์˜ต์…˜์€ ์ค‘๊ด„ํ˜ธ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.[3] SQL์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ SELECT์™€ select๋Š” ๊ฐ™์€ ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ๋”ฐ์˜ดํ‘œ๋กœ ์ธ์šฉ๋œ '๊ฐ’'์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. ๋ฌธ์ž์—ด์„ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด ๋ช…๋ น ๋งจ ๋’ค์— COLLATE NOCASE๋ฅผ ๋ถ™์ธ๋‹ค. ๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ DBMS๋Š” ์„ธ๋ฏธ์ฝœ๋ก (;)์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ๋ช…๋ น์–ด๋ฅผ ๊ณ„์† ์ž…๋ ฅํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•œ๋‹ค. GUI๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ GUIํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์•Œ์•„์„œ ์„ธ๋ฏธ์ฝœ๋ก ์„ ๋ถ™์—ฌ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ๋ชจ๋ฅด๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”๋ฐ ํ„ฐ๋ฏธ๋„๋กœ ์ž‘์—…ํ•  ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ ๋•Œ๋ฌธ์— ์…ธ์ด ๋จนํ†ต์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์—ฐ์Šตํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์ด ํ•œ ๊ฐ€์ง€ ์žˆ๋Š”๋ฐ SQL ๊ตฌ๋ฌธ์€ ํƒ์š•์Šค๋Ÿฝ๋‹ค(Greedy). SQL์€ ๊ฐ€๋Šฅํ•œ ๋„“์€ ๋ฒ”์œ„์— ๊ฑธ์ฒ˜ ์ž‘์—…ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ WHERE์ ˆ์ด๋‚˜ LIMIT ๊ตฌ๋ฌธ์„ ์ƒ๋žตํ•˜๋ฉด SELECT์˜ ๊ฒฝ์šฐ ๋๋„ ์—†์ด ์ถœ๋ ฅํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์—ด์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๊ณ  UPDATE์™€ DELETE์˜ ๊ฒฝ์šฐ ์‚ฌ๋ณดํƒ€์ฃผ์— ๊ฐ€๊นŒ์šด ๊ด‘์—ญ ๋ณ€์กฐ(ํŒŒ๊ดด)๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. ๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ DBMS์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ BEGIN์„ ๋จผ์ € ๊ฑธ๊ณ  ์ž‘์—…ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ž‘์—…์„ ์ทจ์†Œ(UNDO)ํ•  ์ˆ˜ ์—†๋‹ค. ๋‹ค์‹œ ๋งํ•ด BEGIN์„ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  DELETE from table; ์„ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ ROLLBACK ๋ช…๋ น์„ ์ž…๋ ฅํ•ด๋„ ์†Œ์šฉ์ด ์—†๋‹ค. ๊ฐ€์žฅ ์น˜๋ช…์ ์ธ ์˜คํƒ€๋กœ WHERE์ ˆ ์ž…๋ ฅ ์ง์ „์— ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‹ซ๋Š”๋‹ค๋Š”๊ฒŒ ๋ฐ”๋กœ ์˜†์˜ ์„ธ๋ฏธ์ฝœ๋ก ์„ ์ž˜๋ชป ์ณ์„œ ์˜คํƒ€๋ฅผ ๋‚ธ ๊ฒฝ์šฐ. ์ด ๊ฒฝ์šฐ ์•ž์˜ ๋ช…๋ น์–ด๋ฅผ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์„œ ํ…Œ์ด๋ธ”์„ ํŒŒ๊ดดํ•ด ๋ฒ„๋ฆฐ ๋’ค์— ๋’ค์ชฝ ๋ช…๋ น์–ด๋ฅผ '๋ฌธ๋ฒ• ์˜ค๋ฅ˜'๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

๋”ฐ๋ผ์„œ UPDATE, DELETE๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ธฐ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ BEGIN์„ ์ž…๋ ฅํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ ๋’ค์— ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ์ธ์ง€๋ฅผ SELECT๋กœ ๊ฒ€์ฆํ•œ ๋’ค์— ์˜๋„ํ•œ ๊ฒฐ๊ณผ๋Œ€๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋˜์—ˆ์Œ์„ ํ™•์ธํ•˜๊ณ  ๋‚˜์„œ, COMMIT์„ ์ž…๋ ฅํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ '์ ์šฉ'ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด๋Š” ๊ฒŒ ์ข‹๋‹ค. ๋งŒ์•ฝ ๋ญ”๊ฐ€๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๊ฒฝ์šฐ ์ฆ‰์‹œ ROLLBACK ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด BEGIN์„ ์ž…๋ ฅํ•œ ๋’ค์— ํ–‰ํ•œ ๋ชจ๋“  ์ž‘์—…์ด ์ทจ์†Œ๋œ๋‹ค. GUI์˜ ๊ฒฝ์šฐ์—๋Š” ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ SELECT์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋˜์–ด ์žˆ๋‹ค๋Š” ์ „์ œ ์•„๋ž˜(๊ทธ๋ ‡์ง€ ์•Š์€ GUI ํ”„๋ก ํŠธ์—”๋“œ๋„ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ทธ๋ƒฅ OK ํ•œ ์ค„ ๋ณด์—ฌ์ฃผ๊ณ  ๋์ด๋‹ค) ์ฒ˜์Œ๋ถ€ํ„ฐ BEGIN; ~ ROLLBACK; ๋ธ”๋Ÿญ์„ ๋ฏธ๋ฆฌ ์ž…๋ ฅํ•ด ๋‘๊ณ  ์ž‘์—…์„ ํ•˜๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๋‹ค.

์ผ๋‹จ SQL์„ ์ž…๋ ฅํ•  ๋•Œ์—๋Š” ์ ˆ๋Œ€ ํ•จ๋ถ€๋กœ ์—”ํ„ฐํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ์„  ์•ˆ ๋œ๋‹ค. ์ง€์ ํ™•์ธ์„ ํ•˜๋Š” ๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ํŠนํžˆ WHERE์ ˆ ์•ž๋’ค๋ฅผ ๋งค์šฐ ๊ผผ๊ผผํ•˜๊ฒŒ ์‚ดํŽด์•ผ ํ•˜๊ณ  WHERE์ ˆ์ด ์—†๋Š” ์ฟผ๋ฆฌ๋Š” ๋ฌด์กฐ๊ฑด ํ‹€๋ ธ๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜์ž. SQL์€ ๊ธฐ๋ณธ๊ฐ’์ด rm -rf /๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒŒ ํŽธํ•˜๋‹ค. ์•„์˜ˆ ๋‚ ์ฟผ๋ฆฌ๋ฅผ ํ•จ๋ถ€๋กœ ๋„ฃ์ง€ ๋ง๋ผ๊ณ  ํ”„๋กœ์‹œ์ €(Procedure)๋ผ๋Š” ์ฟผ๋ฆฌ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ SQL๊ณผ PL/SQL์€ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค. PL/SQL์ด SQL์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ SQL์„ ์ž์œ ์ž์žฌ๋กœ ์“ธ ์ •๋„์˜ ์‹ค๋ ฅ์ด ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ PL/SQL์„ ๊ณต๋ถ€ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๊ธˆ์œต๊ณ„์—์„œ๋Š” PL/SQL์„ ๋„๋ฆฌ ์“ฐ๋‹ˆ๊นŒ ์€ํ–‰์— ๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…ํ•˜๋ ค๋ฉด ๊ผญ ๋ฐฐ์›Œ์•ผ ํ•˜์ง€๋งŒ ๋ฐฐ์šธ ๋•Œ ๋ฐฐ์šฐ๋”๋ผ๋„ SQL์„ ์ž์‹ ์žˆ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๋‹ค์Œ์˜ ์ผ์ด๋‹ค. ์ง„๋„๋ฅผ ๋นจ๋ฆฌ ๋นผ๊ณ  ์‹ถ์€ ์š•์‹ฌ์— SQL๋„ ๋ชจ๋ฅด๋Š” ์ฑ„๋กœ PL/SQL์— ๋„์ „ํ–ˆ๋‹ค๊ฐ„ ๊ธฐ์กด์— ๊ณต๋ถ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ก ์ฒด๊ณ„์— ํ˜ผ๋™์„ ์ผ์œผ์ผœ ์˜คํžˆ๋ ค ์ง„๋„๊ฐ€ ๋’ค๋กœ ํ›„ํ‡ดํ•œ๋‹ค. ๋ ˆ์•Œ ์ฃผํ™”์ž…๋งˆ

3. ๋ฌธ๋ฒ•[ํŽธ์ง‘]

4. ์™ธ๋ถ€ ๋งํฌ[ํŽธ์ง‘]

  • Oracle Live SQL: ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜ ์—†์ด ์›น๋ธŒ๋ผ์šฐ์ € ์ƒ์—์„œ ์ฝ”๋“œ๋ฅผ ํ•™์Šตํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ.
[1] ๋Œ€ํ‘œ์ ์œผ๋กœ Oracle DB, MySQL, MariaDB, MSS QL ๋“ฑ์ด ์žˆ๋‹ค.
[2] ๋‹จ์ผ ์ฃผ์ œ์— ๋Œ€ํ•ด ํ–‰๊ณผ ์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์ด๋‹ค. ์ฃผ๋กœ ํ–‰์€ ๋ฐ์ดํ„ฐ ์›์†Œ(entity)์ด๋ฉฐ ์—ด์€ ๋ฐ์ดํ„ฐ ์›์†Œ๊ฐ€ ๊ฐ€์ง€๋Š” ์†์„ฑ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. ํ‘œ๋‚˜ ์—‘์…€ ์‹œํŠธ ํ•˜๋‚˜๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด๋ฐ ์˜ˆ๋ฅผ ๋“ค์–ด '๊ณ ๊ฐ'์ด๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๊ณ ๊ฐ ํ•œ๋ช…์€ ID, ์ด๋ฆ„, ์ฃผ์†Œ, ์ „ํ™”๋ฒˆํ˜ธ ๋“ฑ์˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ๊ฐ๊ฐ์˜ ๊ณ ๊ฐ์€ ํ•˜๋‚˜์˜ ํ–‰์„ ์ฐจ์ง€ํ•˜์—ฌ ์ฒซ๋ฒˆ์งธ ์—ด์—๋Š” ๊ณ ๊ฐ์˜ ID๊ฐ€, ๋‘๋ฒˆ์งธ ์—ด์—๋Š” ๊ณ ๊ฐ์˜ ์ด๋ฆ„์ด, ์„ธ๋ฒˆ์งธ ์—ด์—๋Š” ๊ณ ๊ฐ์˜ ์ฃผ์†Œ๊ฐ€...์™€ ๊ฐ™์ด ์ง€์ •๋˜์–ด ์ €์žฅ๋œ๋‹ค. ํ…Œ์ด๋ธ”์—์„œ ์—ด์˜ ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž…์ถœ๋ ฅ์‹œ ์—ด์˜ ์ด๋ฆ„์„ ์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•˜์—ฌ ์ค€๋‹ค.
[3] ๋ฌผ๋ก  ์˜ต์…˜์€ WHERE ๋ง๊ณ ๋„ GROUP BY, COUNT ๋“ฑ ๋ชฉ์ ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ตฌ๋ฌธ ์„ค๋ช…์„ ์œ„ํ•ด WHERE์ ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ WHERE์ ˆ๋งŒ ํ‘œ๊ธฐํ•œ๋‹ค.