TIL

[TIL/SQL] 2025/03/06

Pitfall ๐Ÿšจ60์  ๋งž๋Š” ์‹œํ—˜์ด๊ธฐ์—, ์ข๊ณ  ๊นŠ๊ฒŒ ์•„๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋„“๊ณ  ์–•๊ฒŒ ์•„๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”. ๋„“๊ณ  ์–•๊ฒŒ ์•Œ์•„์•ผ ์ฐ์–ด์„œ๋ผ๋„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ... <์œ ํŠœ๋ธŒ ๊ฐ•์˜ + SQLD ๋ชจ๋“  ๊ฒƒ + ํด๋กœ๋“œ> ํ•ฉ์ž‘์œผ๋กœ ๋งŒ๋“  ์š”์•ฝ๋ณธ์ž…๋‹ˆ๋‹ค. ์ง€๋‚˜๊ฐ€๋Š” ๊ตฌ๊ธ€ ๋‚˜๊ทธ๋„ค๋“ค์—๊ฒŒ ๋„

2025๋…„ 3์›” 6์ผ18min read

Pitfall ๐Ÿšจ

60์  ๋งž๋Š” ์‹œํ—˜์ด๊ธฐ์—, ์ข๊ณ  ๊นŠ๊ฒŒ ์•„๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋„“๊ณ  ์–•๊ฒŒ ์•„๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”. ๋„“๊ณ  ์–•๊ฒŒ ์•Œ์•„์•ผ ์ฐ์–ด์„œ๋ผ๋„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ... <์œ ํŠœ๋ธŒ ๊ฐ•์˜ + SQLD ๋ชจ๋“  ๊ฒƒ + ํด๋กœ๋“œ> ํ•ฉ์ž‘์œผ๋กœ ๋งŒ๋“  ์š”์•ฝ๋ณธ์ž…๋‹ˆ๋‹ค. ์ง€๋‚˜๊ฐ€๋Š” ๊ตฌ๊ธ€ ๋‚˜๊ทธ๋„ค๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ์œ ๊ฐ€ ๋œ๋‹ค๋ฉด ํด๋กœ๋“œ ๊ฒฐ์ œํ•˜์„ธ์š”. ๋ˆ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

SQLD ์‹œํ—˜ ํ•ต์‹ฌ ์•”๊ธฐ์‚ฌํ•ญ

[1๊ณผ๋ชฉ] ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์˜ ์ดํ•ด ๐Ÿ“Š

Chapter 1 ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์˜ ์ดํ•ด ๐ŸŽฏ

#### 1.1 ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์˜ ์ดํ•ด

##### 1.1.1 ๋ชจ๋ธ๋ง์˜ ๊ฐœ๋… - ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง: ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒํ™” ๊ณผ์ • - ๋ชฉ์ : ์„ฑ๋Šฅ, ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ, ๊ทธ๋ฆฌ๊ณ  ์—…๋ฌด ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ - ํŠน์ง•: ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ

##### 1.1.2 ๋ชจ๋ธ๋ง์˜ ํŠน์ง• - ์ถ”์ƒํ™”(Abstraction): ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ํ‘œํ˜„ - ๋‹จ์ˆœํ™”(Simplification): ๋ณต์žกํ•œ ํ˜„์‹ค์„ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ถ•์†Œ - ๋ช…ํ™•ํ™”(Clarification): ๋ถˆ๋ถ„๋ช…ํ•œ ์š”์†Œ๋“ค์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ ์ •์˜

##### 1.1.3 ๋ชจ๋ธ๋ง์˜ ์„ธ ๊ฐ€์ง€ ๊ด€์  - ๋ฐ์ดํ„ฐ ๊ด€์ (Data): ์—…๋ฌด๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ๋˜๋Š”์ง€ ํ‘œํ˜„ - ํ”„๋กœ์„ธ์Šค ๊ด€์ (Process): ์—…๋ฌด๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ‘œํ˜„ - ์ƒ๊ด€ ๊ด€์ (Interaction): ๋ฐ์ดํ„ฐ์™€ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํ˜ธ์ž‘์šฉ ํ‘œํ˜„

##### 1.1.4 ๋ชจ๋ธ๋ง์˜ ์„ธ ๊ฐ€์ง€ ๋‹จ๊ณ„ - ๊ฐœ๋…์  ๋ชจ๋ธ๋ง: ์ถ”์ƒ์  ์ˆ˜์ค€์˜ ๋ชจ๋ธ๋ง, ์ „์ฒด ๋ชจ์Šต ์กฐ๋ง, ์—”ํ„ฐํ‹ฐ(Entity)์™€ ๊ด€๊ณ„(Relationship) ๋„์ถœ - ๋…ผ๋ฆฌ์  ๋ชจ๋ธ๋ง: ์—…๋ฌด ์ค‘์‹ฌ์˜ ๋ชจ๋ธ๋ง, ์ •๊ทœํ™” ์ˆ˜ํ–‰, DBMS์— ๋…๋ฆฝ์  - ๋ฌผ๋ฆฌ์  ๋ชจ๋ธ๋ง: ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ•์„ ์œ„ํ•œ ๋ชจ๋ธ๋ง, DBMS์— ์ข…์†์ , ์„ฑ๋Šฅ/์ €์žฅ ๊ณต๊ฐ„ ๊ณ ๋ ค

##### 1.1.5 ANSI-SPARC์—์„œ ์ •์˜ํ•œ 3๋‹จ๊ณ„ ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ - ์™ธ๋ถ€ ์Šคํ‚ค๋งˆ(External Schema): ์‚ฌ์šฉ์ž ๊ด€์ , ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ ‘๊ทผํ•˜๋Š” ๋ทฐ - ๊ฐœ๋…์  ์Šคํ‚ค๋งˆ(Conceptual Schema): ํ†ตํ•ฉ ๊ด€์ , ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ - ๋‚ด๋ถ€ ์Šคํ‚ค๋งˆ(Internal Schema): ๋ฌผ๋ฆฌ์  ๊ด€์ , ์‹ค์ œ ์ €์žฅ ๊ตฌ์กฐ

##### 1.1.6 ERD - ์ •์˜: Entity-Relationship Diagram - ๊ตฌ์„ฑ์š”์†Œ: ์—”ํ„ฐํ‹ฐ(์‚ฌ๊ฐํ˜•), ๊ด€๊ณ„(๋งˆ๋ฆ„๋ชจ), ์†์„ฑ(ํƒ€์›) - ์ž‘์„ฑ์ ˆ์ฐจ: ์—”ํ„ฐํ‹ฐ ๋„์ถœ โ†’ ์—”ํ„ฐํ‹ฐ ๋ฐฐ์น˜ โ†’ ๊ด€๊ณ„ ์„ค์ • โ†’ ๊ด€๊ณ„๋ช… ๊ธฐ์ˆ  โ†’ ๊ด€๊ณ„์ฐจ์ˆ˜ ํ‘œํ˜„

#### 1.2 ์—”ํ„ฐํ‹ฐ

##### 1.2.1 ์—”ํ„ฐํ‹ฐ์˜ ๊ฐœ๋… - ์ •์˜: ์—…๋ฌด์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์ •๋ณด์˜ ์ง‘ํ•ฉ, ์ €์žฅํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์ค‘์š” ๋ฐ์ดํ„ฐ - ์˜ˆ์‹œ: ์‚ฌ์›, ๋ถ€์„œ, ์ƒํ’ˆ, ๊ณ ๊ฐ

##### 1.2.2 ์—”ํ„ฐํ‹ฐ์˜ ํŠน์ง• - ์‹๋ณ„์ž: ๊ฐ ์—”ํ„ฐํ‹ฐ๋Š” ์œ ์ผํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง - ์ธ์Šคํ„ด์Šค ์ง‘ํ•ฉ: ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•จ - ์†์„ฑ: ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์†์„ฑ์ด ์žˆ์–ด์•ผ ํ•จ - ๊ด€๊ณ„: ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€ ์ตœ์†Œ ํ•œ ๊ฐœ ์ด์ƒ์˜ ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•จ - ์—…๋ฌด์  ๊ด€๋ จ์„ฑ: ์—…๋ฌดํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•จ

##### 1.2.3 ์—”ํ„ฐํ‹ฐ์˜ ๋ถ„๋ฅ˜ - ์œ ํ˜•์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜: - ๊ธฐ๋ณธ ์—”ํ„ฐํ‹ฐ: ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ - ์ค‘์‹ฌ ์—”ํ„ฐํ‹ฐ: ์—…๋ฌด์˜ ์ค‘์‹ฌ์ด ๋˜๋Š” ์—”ํ„ฐํ‹ฐ - ํ–‰์œ„ ์—”ํ„ฐํ‹ฐ: ๋‘ ์—”ํ„ฐํ‹ฐ์˜ ๊ด€๊ณ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—”ํ„ฐํ‹ฐ(๊ต์ฐจ ์—”ํ„ฐํ‹ฐ) - ๋ฐœ์ƒ์‹œ์ ์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜: - ๊ธฐ๋ณธ ์—”ํ„ฐํ‹ฐ: ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ - ์ƒ์† ์—”ํ„ฐํ‹ฐ: ์ƒ์œ„ ์—”ํ„ฐํ‹ฐ์˜ ํŠน์„ฑ์„ ์ƒ์†๋ฐ›์Œ - ๋ฐœ์ƒ ์—”ํ„ฐํ‹ฐ: ํŠน์ • ์ด๋ฒคํŠธ์— ์˜ํ•ด ๋ฐœ์ƒ

#### 1.3 ์†์„ฑ

##### 1.3.1 ์†์„ฑ์˜ ๊ฐœ๋… - ์ •์˜: ์—…๋ฌด์—์„œ ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ •๋ณด์˜ ์ตœ์†Œ ๋‹จ์œ„ - ํŠน์ง•: ๋” ์ด์ƒ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๋Š” ๋‹จ์ผ ๊ฐ’

##### 1.3.2 ์†์„ฑ๊ฐ’ - ์ •์˜: ์†์„ฑ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฐ’ - ํŠน์ง•: ํ•˜๋‚˜์˜ ์†์„ฑ์€ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๊ฐ€์ ธ์•ผ ํ•จ(์›์ž์„ฑ)

##### 1.3.3 ์—”ํ„ฐํ‹ฐ, ์ธ์Šคํ„ด์Šค, ์†์„ฑ๊ฐ’ - ์—”ํ„ฐํ‹ฐ: ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ฒด(ํ…Œ์ด๋ธ”) - ์ธ์Šคํ„ด์Šค: ์—”ํ„ฐํ‹ฐ์˜ ๊ตฌ์ฒด์ ์ธ ์‹คํ˜„์ฒด(๋กœ์šฐ) - ์†์„ฑ๊ฐ’: ์ธ์Šคํ„ด์Šค์˜ ๊ตฌ์ฒด์ ์ธ ๊ฐ’(์…€)

##### 1.3.4 ์†์„ฑ์˜ ๋ถ„๋ฅ˜ - ํŠน์„ฑ์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜ - ๊ธฐ๋ณธ ์†์„ฑ: ์—…๋ฌด ํ”„๋กœ์„ธ์Šค์—์„œ ๋„์ถœํ•œ ์ผ๋ฐ˜์ ์ธ ์†์„ฑ - ์„ค๊ณ„ ์†์„ฑ: ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ํ•„์š”ํ•œ ์†์„ฑ (์ผ๋ จ๋ฒˆํ˜ธ ๋“ฑ) - ํŒŒ์ƒ ์†์„ฑ: ๋‹ค๋ฅธ ์†์„ฑ์—์„œ ๊ณ„์‚ฐ๋˜์–ด ๋„์ถœ๋˜๋Š” ์†์„ฑ (ํ•ฉ๊ณ„, ํ‰๊ท  ๋“ฑ) - ๊ตฌ์กฐ์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜ - ๋‹จ์ผ ์†์„ฑ: ํ•˜๋‚˜์˜ ์˜๋ฏธ๋กœ ๊ตฌ์„ฑ๋œ ์†์„ฑ - ๋ณตํ•ฉ ์†์„ฑ: ์—ฌ๋Ÿฌ ๋‹จ์ผ ์†์„ฑ์ด ๋ชจ์—ฌ์„œ ๊ตฌ์„ฑ๋œ ์†์„ฑ - ๋‹ค์ค‘๊ฐ’ ์†์„ฑ: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์†์„ฑ

##### 1.3.5 ๋„๋ฉ”์ธ - ์ •์˜: ์†์„ฑ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ๋ฒ”์œ„ - ํŠน์ง•: ๋ฐ์ดํ„ฐ ํƒ€์ž…, ํฌ๊ธฐ, ์ œ์•ฝ์กฐ๊ฑด ๋“ฑ

#### 1.4 ๊ด€๊ณ„

##### 1.4.1 ๊ด€๊ณ„์˜ ๊ฐœ๋… - ์ •์˜: ๋‘ ๊ฐœ ์ด์ƒ ์—”ํ„ฐํ‹ฐ ๊ฐ„์˜ ์—…๋ฌด์  ์—ฐ๊ด€์„ฑ - ๊ด€๊ณ„์ฐจ์ˆ˜(Cardinality): ๋‘ ์—”ํ„ฐํ‹ฐ ๊ฐ„์˜ ๊ด€๊ณ„์—์„œ ์ฐธ์—ฌํ•˜๋Š” ์ˆ˜ - 1:1 ๊ด€๊ณ„: ํ•œ ์—”ํ„ฐํ‹ฐ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์˜ ์ธ์Šคํ„ด์Šค์™€ ์ตœ๋Œ€ ํ•œ ๊ฐœ๋งŒ ์—ฐ๊ด€ - 1:N ๊ด€๊ณ„: ํ•œ ์—”ํ„ฐํ‹ฐ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ด€ - M:N ๊ด€๊ณ„: ์–‘์ชฝ ์—”ํ„ฐํ‹ฐ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์„œ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์™€ ์—ฐ๊ด€ - ์ฐธ์—ฌ๋„(Optionality): ๊ด€๊ณ„์— ์ฐธ์—ฌํ•˜๋Š” ํ•„์ˆ˜ ์—ฌ๋ถ€ - ํ•„์ˆ˜์ฐธ์—ฌ(Mandatory): ๋ฐ˜๋“œ์‹œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง - ์„ ํƒ์ฐธ์—ฌ(Optional): ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๊ณ  ๊ฐ€์ง€์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ

##### 1.4.2 ํ‘œ๊ธฐ๋ฒ• - IE ํ‘œ๊ธฐ๋ฒ•: ๊นŒ๋งˆ๊ท€๋ฐœ(Crow's Foot) ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ๋„ ์•Œ๋ ค์ง - ์„ : ๊ด€๊ณ„ ์—ฐ๊ฒฐ - ๊นŒ๋งˆ๊ท€๋ฐœ(|ใ€ˆ): ๋‹ค์ˆ˜(N) - ๋‹จ์ผ์„ (|): ๋‹จ์ผ(1) - ์›(โ—‹): ์„ ํƒ์ฐธ์—ฌ - ์‹ค์„ : ํ•„์ˆ˜์ฐธ์—ฌ

#### 1.5 ์‹๋ณ„์ž

##### 1.5.1 ์‹๋ณ„์ž์˜ ๊ฐœ๋… - ์ •์˜: ์—”ํ„ฐํ‹ฐ ๋‚ด์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ถ„์ž - ํŠน์ง•: ์œ ์ผ์„ฑ, ์ตœ์†Œ์„ฑ, ๋ถˆ๋ณ€์„ฑ, ์กด์žฌ์„ฑ

##### 1.5.2 ์ฃผ์‹๋ณ„์ž - ์ •์˜: ์—”ํ„ฐํ‹ฐ ๋‚ด์—์„œ ๊ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ตฌ๋ถ„์ž - ํŠน์ง•: ๋ฐ˜๋“œ์‹œ ๊ฐ’์ด ์กด์žฌํ•ด์•ผ ํ•จ(NULL ๋ถˆ๊ฐ€), ์ค‘๋ณต ๋ถˆ๊ฐ€

##### 1.5.3 ์‹๋ณ„์ž์˜ ๋ถ„๋ฅ˜ - ๊ตฌ์„ฑ์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜ - ๋‹จ์ผ ์‹๋ณ„์ž: ํ•˜๋‚˜์˜ ์†์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์‹๋ณ„์ž - ๋ณตํ•ฉ ์‹๋ณ„์ž: ์—ฌ๋Ÿฌ ์†์„ฑ์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์‹๋ณ„์ž - ๋Œ€์ฒด ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜ - ๋ณธ์งˆ ์‹๋ณ„์ž: ์—…๋ฌด์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์‹๋ณ„์ž - ์ธ์กฐ ์‹๋ณ„์ž: ์ธ์œ„์ ์œผ๋กœ ๋งŒ๋“  ์‹๋ณ„์ž(์ผ๋ จ๋ฒˆํ˜ธ ๋“ฑ) - ์—”ํ„ฐํ‹ฐ ๋‚ด์—์„œ์˜ ์—ญํ• ์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜ - ์ฃผ์‹๋ณ„์ž(PK): ์—”ํ„ฐํ‹ฐ ๋‚ด ๊ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์‹๋ณ„์ž - ๋ณด์กฐ ์‹๋ณ„์ž(AK): ์œ ์ผ์„ฑ์„ ๊ฐ€์ง€์ง€๋งŒ ์ฃผ์‹๋ณ„์ž๊ฐ€ ์•„๋‹Œ ์†์„ฑ - ์™ธ๋ถ€ ์‹๋ณ„์ž(FK): ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ

##### 1.5.4 ์‹๋ณ„์ž ๊ด€๊ณ„, ๋น„์‹๋ณ„์ž ๊ด€๊ณ„ - ์‹๋ณ„์ž ๊ด€๊ณ„(Identifying Relationship) - ์ •์˜: ๋ถ€๋ชจ ์—”ํ„ฐํ‹ฐ์˜ ์ฃผ์‹๋ณ„์ž๊ฐ€ ์ž์‹ ์—”ํ„ฐํ‹ฐ์˜ ์ฃผ์‹๋ณ„์ž๊ฐ€ ๋˜๋Š” ๊ด€๊ณ„ - ํ‘œ๊ธฐ๋ฒ•: ์‹ค์„  - ๋น„์‹๋ณ„์ž ๊ด€๊ณ„(Non-Identifying Relationship) - ์ •์˜: ๋ถ€๋ชจ ์—”ํ„ฐํ‹ฐ์˜ ์ฃผ์‹๋ณ„์ž๊ฐ€ ์ž์‹ ์—”ํ„ฐํ‹ฐ์˜ ์ผ๋ฐ˜ ์†์„ฑ์ด ๋˜๋Š” ๊ด€๊ณ„ - ํ‘œ๊ธฐ๋ฒ•: ์ ์„  - ํ•„์ˆ˜์  ๋น„์‹๋ณ„์ž ๊ด€๊ณ„: ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ๊ฐ’์ด ์กด์žฌํ•ด์•ผ ํ•จ(NULL ๋ถˆ๊ฐ€) - ์„ ํƒ์  ๋น„์‹๋ณ„์ž ๊ด€๊ณ„: ๋ถ€๋ชจ ๊ฐ’์ด ์—†์„ ์ˆ˜ ์žˆ์Œ(NULL ๊ฐ€๋Šฅ)

Chapter 2 ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ SQL ๐ŸŽฏ

#### 2.1 ์ •๊ทœํ™”

##### 2.1.1 ์ œ1์ •๊ทœํ˜•(1NF) - ์ •์˜: ๋ชจ๋“  ์†์„ฑ์€ ์›์ž๊ฐ’๋งŒ ๊ฐ€์ ธ์•ผ ํ•จ - ์˜ˆ์‹œ: ํ•œ ์†์„ฑ์— ์—ฌ๋Ÿฌ ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ ๋ถ„ํ•ด - ๋ชฉ์ : ๋ฐ˜๋ณต ๊ทธ๋ฃน ์ œ๊ฑฐ

##### 2.1.2 ์ œ2์ •๊ทœํ˜•(2NF) - ์ •์˜: 1NF๋ฅผ ๋งŒ์กฑํ•˜๋ฉด์„œ, ๋ถ€๋ถ„ ํ•จ์ˆ˜์  ์ข…์† ์ œ๊ฑฐ - ์กฐ๊ฑด: ๋ชจ๋“  ๋น„์ฃผ์š” ์†์„ฑ์ด ์ฃผํ‚ค์— ์™„์ „ ํ•จ์ˆ˜์  ์ข…์†์ด์–ด์•ผ ํ•จ - ๋ฌธ์ œ์ : ์ฃผํ‚ค์˜ ์ผ๋ถ€์—๋งŒ ์ข…์†๋˜๋Š” ์†์„ฑ์ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒ

##### 2.1.3 ์ œ3์ •๊ทœํ˜•(3NF) - ์ •์˜: 2NF๋ฅผ ๋งŒ์กฑํ•˜๋ฉด์„œ, ์ดํ–‰์  ํ•จ์ˆ˜์  ์ข…์† ์ œ๊ฑฐ - ์กฐ๊ฑด: ๋น„์ฃผ์š” ์†์„ฑ์ด ๋น„์ฃผ์š” ์†์„ฑ์— ์ข…์†๋˜์ง€ ์•Š์•„์•ผ ํ•จ - ์˜ˆ์‹œ: Aโ†’B, Bโ†’C์ผ ๋•Œ Aโ†’C ๊ด€๊ณ„ ์ œ๊ฑฐ

#### 2.2 ๊ด€๊ณ„์™€ ์กฐ์ธ์˜ ์ดํ•ด

##### 2.2.1 ๋ฐ˜์ •๊ทœํ™”๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ - ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ - ์กฐํšŒ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ ์„ ๋•Œ - ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ - ํ•˜๋“œ์›จ์–ด ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์  ํšจ์œจ์„ฑ์ด ์ค‘์š”ํ•  ๋•Œ

##### 2.2.2 ํ…Œ์ด๋ธ” ๋ฐ˜์ •๊ทœํ™” - ํ…Œ์ด๋ธ” ๋ณ‘ํ•ฉ: 1:1, 1:N ๊ด€๊ณ„์˜ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜๋กœ ํ•ฉ์นจ - ํ…Œ์ด๋ธ” ๋ถ„ํ•  - ์ˆ˜ํ‰๋ถ„ํ• : ์ธ์Šคํ„ด์Šค ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ” - ์ˆ˜์ง๋ถ„ํ• : ์†์„ฑ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ” - ํ…Œ์ด๋ธ” ๋ณต์ œ: ๋™์ผํ•œ ํ…Œ์ด๋ธ”์„ ์—ฌ๋Ÿฌ ๊ณณ์— ์œ„์น˜

##### 2.2.3 ์นผ๋Ÿผ ๋ฐ˜์ •๊ทœํ™” - ์ค‘๋ณต ์นผ๋Ÿผ ์ถ”๊ฐ€: ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ์„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ - ํŒŒ์ƒ ์นผ๋Ÿผ ์ถ”๊ฐ€: ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฏธ๋ฆฌ - ์ด๋ ฅ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ์ถ”๊ฐ€: ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ์ปฌ๋Ÿผ ์ถ”๊ฐ€ - PK์— ์˜ํ•œ ์ปฌ๋Ÿผ ์ถ”๊ฐ€: ์ฃผ ์‹๋ณ„์ž๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ ์ถ”๊ฐ€

##### 2.2.4 ๊ด€๊ณ„ ๋ฐ˜์ •๊ทœํ™” - ์ค‘๋ณต๊ด€๊ณ„ ์ถ”๊ฐ€: ์กฐ์ธ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ค‘๋ณต ๊ด€๊ณ„ ์„ค์ •

#### 2.3 ๋ชจ๋ธ์ด ํ‘œํ˜„ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์˜ ์ดํ•ด

##### 2.3.1 ํŠธ๋žœ์žญ์…˜์˜ ๊ฐœ๋… - ์ •์˜: ๋…ผ๋ฆฌ์  ์ž‘์—… ๋‹จ์œ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๊ด€๋œ ์ƒํƒœ ๋ณ€ํ™” - ACID ํŠน์„ฑ - ์›์ž์„ฑ(Atomicity): ๋ชจ๋‘ ๋ฐ˜์˜๋˜๊ฑฐ๋‚˜ ์ „ํ˜€ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ - ์ผ๊ด€์„ฑ(Consistency): ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์ „ํ›„์— ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€ - ๊ณ ๋ฆฝ์„ฑ(Isolation): ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์ค‘ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ - ์ง€์†์„ฑ(Durability): ์™„๋ฃŒ๋œ ํŠธ๋žœ์žญ์…˜ ๊ฒฐ๊ณผ๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ˜์˜

#### 2.4 Null ์†์„ฑ์˜ ์ดํ•ด

##### 2.4.1 Null์˜ ๊ฐœ๋… - ์ •์˜: ์•„์ง ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์Œ, ์•Œ ์ˆ˜ ์—†์Œ, ํ•ด๋‹น์‚ฌํ•ญ ์—†์Œ - ํŠน์ง• - ๋น„๊ต์—ฐ์‚ฐ ๋ถˆ๊ฐ€(=, <, > ๋“ฑ) - ์‚ฐ์ˆ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” Null - ์ง‘๊ณ„ํ•จ์ˆ˜์—์„œ ์ œ์™ธ๋จ(SUM, AVG, COUNT ๋“ฑ) - IS NULL, IS NOT NULL๋กœ ๋น„๊ตํ•ด์•ผ ํ•จ

#### 2.5 ๋ณธ์งˆ์‹๋ณ„์ž vs ์ธ์กฐ์‹๋ณ„์ž - ๋ณธ์งˆ์‹๋ณ„์ž - ์ •์˜: ์—…๋ฌด์  ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์‹๋ณ„์ž - ์žฅ์ : ์—…๋ฌด์  ์˜๋ฏธ ํŒŒ์•… ์šฉ์ด - ๋‹จ์ : ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ, ๊ธธ์ด๊ฐ€ ๊ธธ ์ˆ˜ ์žˆ์Œ - ์ธ์กฐ์‹๋ณ„์ž - ์ •์˜: ์‹œ์Šคํ…œ์—์„œ ์ƒ์„ฑํ•œ ์ž„์˜์˜ ์‹๋ณ„์ž(์ผ๋ จ๋ฒˆํ˜ธ ๋“ฑ) - ์žฅ์ : ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ์—†์Œ, ๋ณดํ†ต ์ˆซ์ž๋กœ ์งง์Œ, ์„ฑ๋Šฅ ํ–ฅ์ƒ - ๋‹จ์ : ์—…๋ฌด์  ์˜๋ฏธ ์—†์Œ

[2๊ณผ๋ชฉ] SQL ๊ธฐ๋ณธ ๋ฐ ํ™œ์šฉ ๐Ÿ“Š

Chapter 3 SQL ๊ธฐ๋ณธ ๐ŸŽฏ

#### 3.1 ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ์š”

##### 3.1.1 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค - ์ •์˜: ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ฒด - ํŠน์ง•: ํ†ตํ•ฉ, ์ €์žฅ, ๊ณต์œ , ์šด์˜

##### 3.1.2 ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค - ์ •์˜: ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค - ํŠน์ง•: ๋ฆด๋ ˆ์ด์…˜(ํ…Œ์ด๋ธ”) ๊ธฐ๋ฐ˜, ์ •๊ทœํ™”, SQL ์‚ฌ์šฉ

##### 3.1.3 TABLE - ๊ตฌ์„ฑ: ํ–‰(Row), ์—ด(Column) - ํŠน์ง•: ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์—†์Œ, ๊ฐ ํ–‰์€ ์œ ์ผํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง

##### 3.1.4 SQL - ์ •์˜: ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์–ธ์–ด - ์ข…๋ฅ˜ - DML(Data Manipulation Language): SELECT, INSERT, UPDATE, DELETE - DDL(Data Definition Language): CREATE, ALTER, DROP, RENAME, TRUNCATE - DCL(Data Control Language): GRANT, REVOKE - TCL(Transaction Control Language): COMMIT, ROLLBACK, SAVEPOINT

#### 3.2 SELECT๋ฌธ

##### 3.2.1 SELECT

sql
SELECT [DISTINCT] ์ปฌ๋Ÿผ๋ช… [AS ๋ณ„์นญ] FROM ํ…Œ์ด๋ธ”๋ช… [WHERE ์กฐ๊ฑด];

- DISTINCT: ์ค‘๋ณต ์ œ๊ฑฐ - ๋ณ„์นญ: ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ

##### 3.2.2 ์‚ฐ์ˆ ์—ฐ์‚ฐ์ž - +: ๋ง์…ˆ - -: ๋บ„์…ˆ - \: ๊ณฑ์…ˆ - /: ๋‚˜๋ˆ—์…ˆ

##### 3.2.3 ํ•ฉ์„ฑ์—ฐ์‚ฐ์ž - ||: ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ (Oracle) - +: ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ (SQL Server) - CONCAT(str1, str2): ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ ํ•จ์ˆ˜

#### 3.3 ํ•จ์ˆ˜

##### 3.3.1 ๋ฌธ์žํ•จ์ˆ˜ - LOWER(๋ฌธ์ž์—ด): ์†Œ๋ฌธ์ž ๋ณ€ํ™˜ - UPPER(๋ฌธ์ž์—ด): ๋Œ€๋ฌธ์ž ๋ณ€ํ™˜ - SUBSTR(๋ฌธ์ž์—ด, ์‹œ์ž‘์œ„์น˜, ๊ธธ์ด): ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ - LENGTH/LEN(๋ฌธ์ž์—ด): ๋ฌธ์ž์—ด ๊ธธ์ด - TRIM/LTRIM/RTRIM(๋ฌธ์ž์—ด): ๊ณต๋ฐฑ ์ œ๊ฑฐ

##### 3.3.2 ์ˆซ์žํ•จ์ˆ˜ - ROUND(์ˆซ์ž, ์ž๋ฆฟ์ˆ˜): ๋ฐ˜์˜ฌ๋ฆผ - TRUNC/TRUNCATE(์ˆซ์ž, ์ž๋ฆฟ์ˆ˜): ๋ฒ„๋ฆผ - CEIL/CEILING(์ˆซ์ž): ์˜ฌ๋ฆผ(์ •์ˆ˜) - FLOOR(์ˆซ์ž): ๋‚ด๋ฆผ(์ •์ˆ˜) - MOD(์ˆซ์ž1, ์ˆซ์ž2): ๋‚˜๋จธ์ง€

##### 3.3.3 ๋‚ ์งœํ•จ์ˆ˜ - SYSDATE/GETDATE(): ํ˜„์žฌ ๋‚ ์งœ - EXTRACT/DATEPART(๋‹จ์œ„ FROM ๋‚ ์งœ): ๋‚ ์งœ์—์„œ ํŠน์ • ๋ถ€๋ถ„ ์ถ”์ถœ - TO_CHAR/CONVERT(๋‚ ์งœ, ํฌ๋งท): ๋‚ ์งœ๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ - ๋‚ ์งœ ์—ฐ์‚ฐ: ๋‚ ์งœ + ์ˆซ์ž = ๋‚ ์งœ์— ์ผ์ˆ˜ ๋”ํ•จ

##### 3.3.4 ๋ณ€ํ™˜ํ•จ์ˆ˜ - TO_CHAR/CONVERT(๊ฐ’, ํฌ๋งท): ์ˆซ์ž/๋‚ ์งœ๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ - TO_NUMBER/CAST(๋ฌธ์ž์—ด AS ์ˆซ์ž): ๋ฌธ์ž๋ฅผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ - TO_DATE/CAST(๋ฌธ์ž์—ด AS ๋‚ ์งœ): ๋ฌธ์ž๋ฅผ ๋‚ ์งœ๋กœ ๋ณ€ํ™˜

##### 3.3.5 NULL ๊ด€๋ จ ํ•จ์ˆ˜ - NVL/ISNULL(์ปฌ๋Ÿผ๋ช…, ๋Œ€์ฒด๊ฐ’): NULL์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด - NULLIF(๊ฐ’1, ๊ฐ’2): ๋‘ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด NULL, ๋‹ค๋ฅด๋ฉด ๊ฐ’1 ๋ฐ˜ํ™˜ - COALESCE(๊ฐ’1, ๊ฐ’2, ...): NULL์ด ์•„๋‹Œ ์ฒซ ๋ฒˆ์งธ ๊ฐ’ ๋ฐ˜ํ™˜

##### 3.3.6 CASE

sql
CASE
  WHEN ์กฐ๊ฑด1 THEN ๊ฒฐ๊ณผ1
  WHEN ์กฐ๊ฑด2 THEN ๊ฒฐ๊ณผ2
  ...
  ELSE ๊ธฐ๋ณธ๊ฒฐ๊ณผ
END

- DECODE(Oracle)

sql
DECODE(์ปฌ๋Ÿผ, ๊ฐ’1, ๊ฒฐ๊ณผ1, ๊ฐ’2, ๊ฒฐ๊ณผ2, ..., ๊ธฐ๋ณธ๊ฒฐ๊ณผ)

#### 3.4 WHERE์ ˆ

##### 3.4.1 ๋น„๊ต์—ฐ์‚ฐ์ž - =: ๊ฐ™์Œ - <>, !=: ๊ฐ™์ง€ ์•Š์Œ - >, <, >=, <=: ํฌ๊ธฐ ๋น„๊ต

##### 3.4.2 ๋ถ€์ • ๋น„๊ต์—ฐ์‚ฐ์ž - !=, <>: ๊ฐ™์ง€ ์•Š์Œ - NOT ์ปฌ๋Ÿผ๋ช… =: ๊ฐ™์ง€ ์•Š์Œ - NOT ์ปฌ๋Ÿผ๋ช… >: ํฌ์ง€ ์•Š์Œ

##### 3.4.3 SQL ์—ฐ์‚ฐ์ž - BETWEEN A AND B: A์™€ B ์‚ฌ์ด - IN (๊ฐ’1, ๊ฐ’2, ...): ๊ฐ’ ๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜ - LIKE 'ํŒจํ„ด': ํŒจํ„ด ๋งค์นญ - %: 0๊ฐœ ์ด์ƒ์˜ ๋ฌธ์ž - _: ์ •ํ™•ํžˆ ํ•œ ๊ฐœ์˜ ๋ฌธ์ž - IS NULL: NULL์ธ ๊ฒฝ์šฐ

##### 3.4.4 ๋ถ€์ • SQL ์—ฐ์‚ฐ์ž - NOT BETWEEN A AND B: A์™€ B ์‚ฌ์ด๊ฐ€ ์•„๋‹˜ - NOT IN (๊ฐ’1, ๊ฐ’2, ...): ๊ฐ’ ๋ชฉ๋ก๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ - NOT LIKE 'ํŒจํ„ด': ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ - IS NOT NULL: NULL์ด ์•„๋‹Œ ๊ฒฝ์šฐ

##### 3.4.5 ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž - AND: ๋ชจ๋“  ์กฐ๊ฑด์ด ์ฐธ - OR: ํ•˜๋‚˜ ์ด์ƒ์˜ ์กฐ๊ฑด์ด ์ฐธ - NOT: ์กฐ๊ฑด์˜ ๋ฐ˜๋Œ€

#### 3.5 GROUP BY, HAVING์ ˆ

##### 3.5.1 GROUP BY

sql
SELECT ์ปฌ๋Ÿผ๋ช…, ์ง‘๊ณ„ํ•จ์ˆ˜
FROM ํ…Œ์ด๋ธ”๋ช…
[WHERE ์กฐ๊ฑด]
GROUP BY ์ปฌ๋Ÿผ๋ช… [, ์ปฌ๋Ÿผ๋ช…, ...]
[HAVING ๊ทธ๋ฃน์กฐ๊ฑด];

- ํŠน์ง•: SELECT์ ˆ์— ์žˆ๋Š” ์ปฌ๋Ÿผ ์ค‘ ์ง‘๊ณ„ํ•จ์ˆ˜๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์ปฌ๋Ÿผ์€ GROUP BY์— ๋ช…์‹œ

##### 3.5.2 ์ง‘๊ณ„ํ•จ์ˆ˜ - COUNT(์ปฌ๋Ÿผ/): ํ–‰ ์ˆ˜ ์นด์šดํŠธ - SUM(์ปฌ๋Ÿผ): ํ•ฉ๊ณ„ - AVG(์ปฌ๋Ÿผ): ํ‰๊ท  - MAX(์ปฌ๋Ÿผ): ์ตœ๋Œ“๊ฐ’ - MIN(์ปฌ๋Ÿผ): ์ตœ์†Ÿ๊ฐ’ - STDDEV(์ปฌ๋Ÿผ): ํ‘œ์ค€ํŽธ์ฐจ - VARIANCE(์ปฌ๋Ÿผ): ๋ถ„์‚ฐ

##### 3.5.3 HAVING - ์ •์˜: GROUP BY ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์กฐ๊ฑด - ํŠน์ง•: WHERE๋Š” ๊ฐœ๋ณ„ ํ–‰ ํ•„ํ„ฐ๋ง, HAVING์€ ๊ทธ๋ฃน ํ•„ํ„ฐ๋ง

#### 3.6 ORDER BY์ ˆ

##### 3.6.1 ORDER BY

sql
SELECT ์ปฌ๋Ÿผ๋ช…
FROM ํ…Œ์ด๋ธ”๋ช…
[WHERE ์กฐ๊ฑด]
[GROUP BY ๊ทธ๋ฃน์ปฌ๋Ÿผ]
[HAVING ๊ทธ๋ฃน์กฐ๊ฑด]
ORDER BY ์ •๋ ฌ์ปฌ๋Ÿผ [ASC|DESC] [, ์ •๋ ฌ์ปฌ๋Ÿผ [ASC|DESC], ...];

- ASC: ์˜ค๋ฆ„์ฐจ์ˆœ(๊ธฐ๋ณธ๊ฐ’) - DESC: ๋‚ด๋ฆผ์ฐจ์ˆœ - NULL ์ •๋ ฌ: ์˜ค๋ผํด์€ NULL์ด ๊ฐ€์žฅ ํฐ ๊ฐ’, SQL Server๋Š” ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ - NULLS FIRST/LAST: NULL ์œ„์น˜ ์ง€์ •(Oracle)

#### 3.7 ์กฐ์ธ

##### 3.7.1 ์กฐ์ธ์˜ ๊ฐœ๋… - ์ •์˜: ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• - ์ข…๋ฅ˜: EQUI JOIN, Non EQUI JOIN, OUTER JOIN, SELF JOIN

##### 3.7.2 EQUI JOIN - ์ •์˜: ๋™๋“ฑ ์—ฐ์‚ฐ์ž(=)๋ฅผ ์‚ฌ์šฉํ•œ ์กฐ์ธ - ์˜ˆ์‹œ:

sql
SELECT e.empno, e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;

##### 3.7.3 Non EQUI JOIN - ์ •์˜: ๋™๋“ฑ ์—ฐ์‚ฐ์ž ์™ธ์˜ ์—ฐ์‚ฐ์ž(BETWEEN, >, < ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•œ ์กฐ์ธ - ์˜ˆ์‹œ:

sql
SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;

##### 3.7.4 3๊ฐœ ์ด์ƒ TABLE JOIN - ์˜ˆ์‹œ:

sql
SELECT e.ename, d.dname, l.city
FROM emp e, dept d, locations l
WHERE e.deptno = d.deptno AND d.loc_id = l.loc_id;

##### 3.7.5 OUTER JOIN - ์ •์˜: ์กฐ์ธ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ํ–‰๋„ ๊ฒฐ๊ณผ์— ํฌํ•จ - ์ข…๋ฅ˜: LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN - Oracle ๊ตฌ๋ฌธ:

sql
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno(+); -- LEFT OUTER JOIN

#### 3.8 ํ‘œ์ค€ ์กฐ์ธ

##### 3.8.1 INNER JOIN

sql
SELECT e.ename, d.dname
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno;

- USING ์ ˆ: ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ปฌ๋Ÿผ ์ง€์ •

sql
SELECT e.ename, deptno, d.dname -- USING์ ˆ ์‚ฌ์šฉ์‹œ ์ปฌ๋Ÿผ๋ช…์— ํ…Œ์ด๋ธ”๋ช… ๋ถ™์ด๋ฉด ์•ˆ๋จ
FROM emp e INNER JOIN dept d
USING (deptno);

##### 3.8.2 OUTER JOIN

sql
-- LEFT OUTER JOIN
SELECT e.ename, d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno;

-- RIGHT OUTER JOIN
SELECT e.ename, d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno;

-- FULL OUTER JOIN
SELECT e.ename, d.dname
FROM emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno;

##### 3.8.3 NATURAL JOIN - ์ •์˜: ๋‘ ํ…Œ์ด๋ธ”์˜ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ชจ๋“  ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ์ž๋™ ์กฐ์ธ

sql
SELECT e.ename, deptno, d.dname -- ์กฐ์ธ ์ปฌ๋Ÿผ์— ํ…Œ์ด๋ธ”๋ช… ์ ‘๋‘์–ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€
FROM emp e NATURAL JOIN dept d;

##### 3.8.4 CROSS JOIN - ์ •์˜: ์นดํ…Œ์‹œ์•ˆ ๊ณฑ(Cartesian Product), ๋ชจ๋“  ์กฐํ•ฉ ์ƒ์„ฑ

sql
SELECT e.ename, d.dname
FROM emp e CROSS JOIN dept d;

Chapter 4 SQL ํ™œ์šฉ ๐ŸŽฏ

#### 4.1 ์„œ๋ธŒ์ฟผ๋ฆฌ

##### 4.1.1 ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ - ์ •์˜: SELECT ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ, ๋‹จ์ผ ๊ฐ’ ๋ฐ˜ํ™˜

sql
SELECT ename, (SELECT dname FROM dept WHERE dept.deptno = emp.deptno) as dname
FROM emp;

##### 4.1.2 ์ธ๋ผ์ธ ๋ทฐ - ์ •์˜: FROM ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ, ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์‚ฌ์šฉ

sql
SELECT e.ename, d.dname
FROM emp e, (SELECT deptno, dname FROM dept) d
WHERE e.deptno = d.deptno;

##### 4.1.3 ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ - ์ •์˜: WHERE ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ - ๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ: = ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ, ํ•œ ํ–‰ ๋ฐ˜ํ™˜

sql
SELECT ename FROM emp
WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'SALES');

- ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ: IN, ANY, ALL ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ, ์—ฌ๋Ÿฌ ํ–‰ ๋ฐ˜ํ™˜

- IN: ๊ฐ’์ด ๋ฆฌ์ŠคํŠธ(๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ) ์•ˆ์— ์žˆ๋Š”์ง€ ํ™•์ธ``` ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”

code

SELECT ename FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc = 'NEW YORK');

code
- **ANY, SOME**: ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด TRUE

SELECT ename, sal FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE deptno = 10);

code
- **ALL**: ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ชจ๋‘๋ฅผ ๋งŒ์กฑํ•ด์•ผ TRUE

SELECT ename, sal FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 10);

code
- **EXISTS**: ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋ฉด TRUE

SELECT dname FROM dept d WHERE EXISTS (SELECT 1 FROM emp e WHERE e.deptno = d.deptno);

code

#### 4.2 ์ง‘ํ•ฉ์—ฐ์‚ฐ์ž

##### 4.2.1 UNION ALL / UNION
- **UNION ALL**: ๋‘ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ๋ฐ˜ํ™˜(์ค‘๋ณต ํฌํ•จ)

SELECT empno, ename FROM emp_korea UNION ALL SELECT empno, ename FROM emp_japan;

code
- **UNION**: ๋‘ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ๋ฐ˜ํ™˜(์ค‘๋ณต ์ œ๊ฑฐ, ์ •๋ ฌ)

SELECT empno, ename FROM emp_korea UNION SELECT empno, ename FROM emp_japan;

code

##### 4.2.2 INTERSECT
- **์ •์˜**: ๋‘ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ๊ต์ง‘ํ•ฉ

SELECT empno, ename FROM emp_korea INTERSECT SELECT empno, ename FROM emp_global;

code

##### 4.2.3 MINUS / EXCEPT
- **์ •์˜**: ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์—์„œ ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋บ€ ์ฐจ์ง‘ํ•ฉ
- **MINUS**: Oracle
- **EXCEPT**: SQL Server

SELECT empno, ename FROM emp_global MINUS SELECT empno, ename FROM emp_retired;

code

#### 4.3 ๊ทธ๋ฃนํ•จ์ˆ˜

##### 4.3.1 ROLLUP
- **์ •์˜**: ์ง€์ •๋œ ์ปฌ๋Ÿผ์˜ ์†Œ๊ณ„์™€ ์ด๊ณ„๋ฅผ ์ƒ์„ฑ
- **ํŠน์ง•**: ๊ณ„์ธต์  ์ง‘๊ณ„๋ฅผ ์ƒ์„ฑํ•จ

SELECT deptno, job, SUM(sal) FROM emp GROUP BY ROLLUP(deptno, job);

code

##### 4.3.2 CUBE
- **์ •์˜**: ์ง€์ •๋œ ์ปฌ๋Ÿผ์˜ ๋ชจ๋“  ์กฐํ•ฉ์— ๋Œ€ํ•œ ์†Œ๊ณ„์™€ ์ด๊ณ„ ์ƒ์„ฑ

SELECT deptno, job, SUM(sal) FROM emp GROUP BY CUBE(deptno, job);

code

##### 4.3.3 GROUPING SET
- **์ •์˜**: ์ง€์ •ํ•œ ์—ฌ๋Ÿฌ ๊ทธ๋ฃนํ™” ์กฐํ•ฉ์˜ ๊ฒฐ๊ณผ๋ฅผ UNION ALL๋กœ ํ•ฉ์นœ ๊ฒฐ๊ณผ

SELECT deptno, job, SUM(sal) FROM emp GROUP BY GROUPING SETS((deptno), (job), ());

code

##### 4.3.4 GROUPING
- **์ •์˜**: ํ•ด๋‹น ์ปฌ๋Ÿผ์ด ์ง‘๊ณ„์— ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜(0: ์‚ฌ์šฉ๋จ, 1: ์‚ฌ์šฉ์•ˆ๋จ)

SELECT deptno, GROUPING(deptno), SUM(sal) FROM emp GROUP BY ROLLUP(deptno);

code

#### 4.4 ์œˆ๋„์šฐํ•จ์ˆ˜

##### 4.4.1 ์ˆœ์œ„ํ•จ์ˆ˜
- **RANK()**: ๋™์ผํ•œ ๊ฐ’์€ ๋™์ผํ•œ ์ˆœ์œ„, ๋‹ค์Œ ์ˆœ์œ„๋Š” ๊ฑด๋„ˆ๋œ€
- **DENSE_RANK()**: ๋™์ผํ•œ ๊ฐ’์€ ๋™์ผํ•œ ์ˆœ์œ„, ๋‹ค์Œ ์ˆœ์œ„๋Š” ์ด์–ด์„œ
- **ROW_NUMBER()**: ๋™์ผํ•œ ๊ฐ’์ด๋ผ๋„ ๊ณ ์œ ํ•œ ์ˆœ์œ„ ๋ถ€์—ฌ

SELECT ename, sal, RANK() OVER (ORDER BY sal DESC) rank, DENSE_RANK() OVER (ORDER BY sal DESC) dense_rank, ROW_NUMBER() OVER (ORDER BY sal DESC) row_number FROM emp;

code

##### 4.4.2 ์ง‘๊ณ„ํ•จ์ˆ˜
- **SUM/AVG/MAX/MIN OVER()**: ์œˆ๋„์šฐ๋ณ„ ์ง‘๊ณ„

SELECT ename, deptno, sal, SUM(sal) OVER (PARTITION BY deptno) dept_sum, AVG(sal) OVER (PARTITION BY deptno) dept_avg FROM emp;

code

##### 4.4.3 ํ–‰ ์ˆœ์„œํ•จ์ˆ˜
- **FIRST_VALUE**: ์œˆ๋„์šฐ์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’
- **LAST_VALUE**: ์œˆ๋„์šฐ์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’
- **LAG(expr, offset)**: ์ด์ „ ํ–‰์˜ ๊ฐ’
- **LEAD(expr, offset)**: ๋‹ค์Œ ํ–‰์˜ ๊ฐ’

SELECT ename, sal, LAG(sal, 1, 0) OVER (ORDER BY sal) prev_sal, LEAD(sal, 1, 0) OVER (ORDER BY sal) next_sal FROM emp;

code

##### 4.4.4 ๋น„์œจํ•จ์ˆ˜
- **PERCENT_RANK()**: ๋ฐฑ๋ถ„์œจ ์ˆœ์œ„(0~1)
- **CUME_DIST()**: ๋ˆ„์  ๋ถ„ํฌ(0~1)
- **NTILE(n)**: n๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ”
- **RATIO_TO_REPORT()**: ์ดํ•ฉ์— ๋Œ€ํ•œ ๋น„์œจ

SELECT ename, sal, PERCENT_RANK() OVER (ORDER BY sal) percent, CUME_DIST() OVER (ORDER BY sal) cume, NTILE(4) OVER (ORDER BY sal) ntile FROM emp;

code

#### 4.5 Top N ์ฟผ๋ฆฌ

##### 4.5.1 ROWNUM ํ•จ์ˆ˜
- **Oracle**:

SELECT FROM ( SELECT ename, sal FROM emp ORDER BY sal DESC ) WHERE ROWNUM <= 5;

code

##### 4.5.2 ์œˆ๋„์šฐํ•จ์ˆ˜์˜ ์ˆœ์œ„ํ•จ์ˆ˜

SELECT FROM ( SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) rn FROM emp ) WHERE rn <= 5;

code
- **SQL Server**: TOP ์ ˆ ์‚ฌ์šฉ

SELECT TOP 5 ename, sal FROM emp ORDER BY sal DESC;

code

#### 4.6 ๊ณ„์ธตํ˜• ์งˆ์˜์™€ ์…€ํ”„ ์กฐ์ธ

##### 4.6.1 ๊ณ„์ธตํ˜• ์งˆ์˜
- **Oracle**:

SELECT LEVEL, LPAD(' ', (LEVEL-1)2) || ename FROM emp START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr;

code
- **์ฃผ์š” ํ‚ค์›Œ๋“œ**:
  - **START WITH**: ์‹œ์ž‘ ์กฐ๊ฑด
  - **CONNECT BY PRIOR**: ์—ฐ๊ฒฐ ์กฐ๊ฑด
  - **LEVEL**: ๊ณ„์ธต ๋ ˆ๋ฒจ
  - **SYS_CONNECT_BY_PATH**: ๊ฒฝ๋กœ ํ‘œ์‹œ
  - **CONNECT_BY_ROOT**: ์ตœ์ƒ์œ„ ๋…ธ๋“œ
  - **CONNECT_BY_ISLEAF**: ๋ฆฌํ”„ ๋…ธ๋“œ ์—ฌ๋ถ€

##### 4.6.2 ์…€ํ”„ ์กฐ์ธ
- **์ •์˜**: ๋™์ผ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์กฐ์ธ

SELECT e.ename employee, m.ename manager FROM emp e, emp m WHERE e.mgr = m.empno;

code

#### 4.7 PIVOT์ ˆ๊ณผ UNPIVOT์ ˆ

##### 4.7.1 PIVOT์ ˆ
- **์ •์˜**: ํ–‰์„ ์—ด๋กœ ์ „ํ™˜

SELECT FROM (SELECT deptno, job, sal FROM emp) PIVOT (SUM(sal) FOR job IN ('CLERK', 'MANAGER', 'ANALYST'));

code

##### 4.7.2 UNPIVOT์ ˆ
- **์ •์˜**: ์—ด์„ ํ–‰์œผ๋กœ ์ „ํ™˜

SELECT FROM dept_job_pivot UNPIVOT (sal FOR job IN (CLERK, MANAGER, ANALYST));

code

#### 4.8 ์ •๊ทœํ‘œํ˜„์‹
- **Oracle**: REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR, REGEXP_INSTR

SELECT ename FROM emp WHERE REGEXP_LIKE(ename, '^[A-C].');

code
- **์ฃผ์š” ํŒจํ„ด**:
  - **^**: ํ–‰์˜ ์‹œ์ž‘
  - **$**: ํ–‰์˜ ๋
  - **.**: ์ž„์˜์˜ ํ•œ ๋ฌธ์ž
  - **\***: 0ํšŒ ์ด์ƒ ๋ฐ˜๋ณต
  - **+**: 1ํšŒ ์ด์ƒ ๋ฐ˜๋ณต
  - **?**: 0ํšŒ ๋˜๋Š” 1ํšŒ
  - **|**: ๋Œ€์ฒด(OR)
  - **[ ]**: ๋ฌธ์ž ์ง‘ํ•ฉ, ๋ฒ”์œ„
  - **[^ ]**: ๋ถ€์ • ๋ฌธ์ž ์ง‘ํ•ฉ

### Chapter 5 ๊ด€๋ฆฌ๊ตฌ๋ฌธ  ๐ŸŽฏ

#### 5.1 DML

##### 5.1.1 INSERT

INSERT INTO ํ…Œ์ด๋ธ”๋ช… [(์ปฌ๋Ÿผ๋ช…1, ์ปฌ๋Ÿผ๋ช…2, ...)] VALUES (๊ฐ’1, ๊ฐ’2, ...);

-- ๋‹ค์ค‘ ํ–‰ ์‚ฝ์ž… INSERT INTO ํ…Œ์ด๋ธ”๋ช… [(์ปฌ๋Ÿผ๋ช…1, ์ปฌ๋Ÿผ๋ช…2, ...)] SELECT ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ... FROM ์†Œ์Šคํ…Œ์ด๋ธ” WHERE ์กฐ๊ฑด;

code

##### 5.1.2 UPDATE

UPDATE ํ…Œ์ด๋ธ”๋ช… SET ์ปฌ๋Ÿผ๋ช…1 = ๊ฐ’1, ์ปฌ๋Ÿผ๋ช…2 = ๊ฐ’2, ... [WHERE ์กฐ๊ฑด];

code

##### 5.1.3 DELETE

DELETE FROM ํ…Œ์ด๋ธ”๋ช… [WHERE ์กฐ๊ฑด];

-- TRUNCATE (DDL) TRUNCATE TABLE ํ…Œ์ด๋ธ”๋ช…;

code
- **DELETE vs TRUNCATE**:
  - DELETE: DML, ์กฐ๊ฑด์ง€์ • ๊ฐ€๋Šฅ, ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ ๊ธฐ๋ก, ROLLBACK ๊ฐ€๋Šฅ
  - TRUNCATE: DDL, ํ…Œ์ด๋ธ” ์ „์ฒด ์‚ญ์ œ, ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ ์ตœ์†Œํ™”, ROLLBACK ๋ถˆ๊ฐ€

##### 5.1.4 MERGE

MERGE INTO ๋Œ€์ƒํ…Œ์ด๋ธ” t USING ์†Œ์Šคํ…Œ์ด๋ธ” s ON (t.ํ‚ค์ปฌ๋Ÿผ = s.ํ‚ค์ปฌ๋Ÿผ) WHEN MATCHED THEN UPDATE SET t.์ปฌ๋Ÿผ1 = s.์ปฌ๋Ÿผ1, ... WHEN NOT MATCHED THEN INSERT (์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2, ...) VALUES (s.์ปฌ๋Ÿผ1, s.์ปฌ๋Ÿผ2, ...);

code

#### 5.2 TCL

##### 5.2.1 ํŠธ๋žœ์žญ์…˜์˜ ํŠน์ง•
- **์›์ž์„ฑ(Atomicity)**: ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ์ „ํ˜€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ
- **์ผ๊ด€์„ฑ(Consistency)**: ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์ „ํ›„์— ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€
- **๊ณ ๋ฆฝ์„ฑ(Isolation)**: ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์ค‘ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ
- **์ง€์†์„ฑ(Durability)**: ์™„๋ฃŒ๋œ ํŠธ๋žœ์žญ์…˜ ๊ฒฐ๊ณผ๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ˜์˜

##### 5.2.2 COMMIT
- **์ •์˜**: ํŠธ๋žœ์žญ์…˜ ์™„๋ฃŒ, ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜

COMMIT;

code

##### 5.2.3 ROLLBACK
- **์ •์˜**: ํŠธ๋žœ์žญ์…˜ ์ทจ์†Œ, ๋งˆ์ง€๋ง‰ COMMIT ์‹œ์ ์œผ๋กœ ๋ณต์›

ROLLBACK;

code

##### 5.2.4 SAVEPOINT
- **์ •์˜**: ํŠธ๋žœ์žญ์…˜ ๋‚ด ์ €์žฅ์  ์„ค์ •, ๋ถ€๋ถ„ ๋กค๋ฐฑ ๊ฐ€๋Šฅ

SAVEPOINT ํฌ์ธํŠธ๋ช…; ROLLBACK TO ํฌ์ธํŠธ๋ช…;

code

#### 5.3 DDL

##### 5.3.1 CREATE

-- ํ…Œ์ด๋ธ” ์ƒ์„ฑ CREATE TABLE ํ…Œ์ด๋ธ”๋ช… ( ์ปฌ๋Ÿผ๋ช…1 ๋ฐ์ดํ„ฐํƒ€์ž… [์ œ์•ฝ์กฐ๊ฑด], ์ปฌ๋Ÿผ๋ช…2 ๋ฐ์ดํ„ฐํƒ€์ž… [์ œ์•ฝ์กฐ๊ฑด], ... [ํ…Œ์ด๋ธ” ์ œ์•ฝ์กฐ๊ฑด] );

-- ์ œ์•ฝ์กฐ๊ฑด PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL

-- ์ธ๋ฑ์Šค ์ƒ์„ฑ CREATE [UNIQUE] INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช… (์ปฌ๋Ÿผ๋ช… [ASC|DESC], ...);

-- ๋ทฐ ์ƒ์„ฑ CREATE [OR REPLACE] VIEW ๋ทฐ์ด๋ฆ„ AS SELECT ๋ฌธ;

-- ์‹œํ€€์Šค ์ƒ์„ฑ (Oracle) CREATE SEQUENCE ์‹œํ€€์Šค๋ช… [INCREMENT BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE n | NOCACHE];

code

##### 5.3.2 ALTER

-- ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ALTER TABLE ํ…Œ์ด๋ธ”๋ช… ADD (์ปฌ๋Ÿผ๋ช… ๋ฐ์ดํ„ฐํƒ€์ž… [์ œ์•ฝ์กฐ๊ฑด]);

-- ์ปฌ๋Ÿผ ์ˆ˜์ • ALTER TABLE ํ…Œ์ด๋ธ”๋ช… MODIFY (์ปฌ๋Ÿผ๋ช… ๋ฐ์ดํ„ฐํƒ€์ž… [์ œ์•ฝ์กฐ๊ฑด]);

-- ์ปฌ๋Ÿผ ์‚ญ์ œ ALTER TABLE ํ…Œ์ด๋ธ”๋ช… DROP COLUMN ์ปฌ๋Ÿผ๋ช…;

-- ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€ ALTER TABLE ํ…Œ์ด๋ธ”๋ช… ADD CONSTRAINT ์ œ์•ฝ์กฐ๊ฑด๋ช… ์ œ์•ฝ์กฐ๊ฑด (์ปฌ๋Ÿผ๋ช…);

-- ์ œ์•ฝ์กฐ๊ฑด ์‚ญ์ œ ALTER TABLE ํ…Œ์ด๋ธ”๋ช… DROP CONSTRAINT ์ œ์•ฝ์กฐ๊ฑด๋ช…;

code

#### 5.4 DCL

##### 5.4.1 USER ๊ด€๋ จ ๋ช…๋ น์–ด

-- ์‚ฌ์šฉ์ž ์ƒ์„ฑ CREATE USER ์‚ฌ์šฉ์ž๋ช… IDENTIFIED BY ๋น„๋ฐ€๋ฒˆํ˜ธ;

-- ์‚ฌ์šฉ์ž ๋ณ€๊ฒฝ ALTER USER ์‚ฌ์šฉ์ž๋ช… IDENTIFIED BY ์ƒˆ๋น„๋ฐ€๋ฒˆํ˜ธ;

-- ์‚ฌ์šฉ์ž ์‚ญ์ œ DROP USER ์‚ฌ์šฉ์ž๋ช… [CASCADE];

code

##### 5.4.2 ๊ถŒํ•œ ๊ด€๋ จ ๋ช…๋ น์–ด

-- ๊ถŒํ•œ ๋ถ€์—ฌ GRANT ๊ถŒํ•œ [, ๊ถŒํ•œ...] ON ๊ฐ์ฒด TO ์‚ฌ์šฉ์ž [WITH GRANT OPTION];

-- ๊ถŒํ•œ ์ทจ์†Œ REVOKE [GRANT OPTION FOR] ๊ถŒํ•œ ON ๊ฐ์ฒด FROM ์‚ฌ์šฉ์ž;

code
- **์ฃผ์š” ๊ถŒํ•œ**:
  - **SELECT**: ๋ฐ์ดํ„ฐ ์กฐํšŒ
  - **INSERT**: ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
  - **UPDATE**: ๋ฐ์ดํ„ฐ ์ˆ˜์ •
  - **DELETE**: ๋ฐ์ดํ„ฐ ์‚ญ์ œ
  - **REFERENCES**: ์ฐธ์กฐ ์ œ์•ฝ์กฐ๊ฑด ์ƒ์„ฑ
  - **ALTER**: ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณ€๊ฒฝ
  - **INDEX**: ์ธ๋ฑ์Šค ์ƒ์„ฑ
  - **ALL**: ๋ชจ๋“  ๊ถŒํ•œ

##### 5.4.3 ROLE ๊ด€๋ จ ๋ช…๋ น์–ด

-- ๋กค ์ƒ์„ฑ CREATE ROLE ๋กค์ด๋ฆ„;

-- ๋กค์— ๊ถŒํ•œ ๋ถ€์—ฌ GRANT ๊ถŒํ•œ [, ๊ถŒํ•œ...] ON ๊ฐ์ฒด TO ๋กค์ด๋ฆ„;

-- ์‚ฌ์šฉ์ž์—๊ฒŒ ๋กค ๋ถ€์—ฌ GRANT ๋กค์ด๋ฆ„ TO ์‚ฌ์šฉ์ž;

-- ๋กค ์‚ญ์ œ DROP ROLE ๋กค์ด๋ฆ„;

More to read

Amazon VPC

Amazon VPC Architecture ์ดํ•ดํ•˜๊ธฐ

์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์—์„œ ๋ฌด์—‡์„ ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ฏผํ•ด์•ผ ํ•˜๋Š”์ง€ ๋‹ค์‹œ ๋Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.ํ•œ๋•Œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๋ชจ๋“  ์„ค๊ณ„์˜ ์ถœ๋ฐœ์ ์ด๋ผ๊ณ  ๋ฏฟ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ €๊ฐ€ ๋ฌด์—‡์„ ๋ณด๊ณ , ์–ด๋–ค ํ๋ฆ„์—์„œ ๋จธ๋ฌด๋ฅด๊ณ  ์ดํƒˆํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด ์—†์ด ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ

'์›์‚ฌ์ดํŠธ'

ํ”„๋ก ํŠธ์—”๋“œ ๊ด€์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ดํ•˜๊ธฐ

์˜ค๋žœ๋งŒ์— ๋ฐฉ๋ฒ•๋ก ์— ๊ด€ํ•œ ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ ์ƒํ™ฉ์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค. SSAFY์—์„œ๋Š” ํ•˜๋ฃจ์— ์—„์ฒญ๋‚œ ์–‘์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋“ค์„ ๊ณผ์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ, '๊ตฌํ˜„๋ ฅ'์ด ๋งค์šฐ ๋–จ์–ด์ง„๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์–ด๋ ค์šด ๋ฌธ์ œ๋ผ๋ฉด '์•„์‰ฌ์›€'์ด๋ผ๋Š” ๊ฐ์ •์กฐ์ฐจ ๋А๋ผ์ง€

Subnet

VPC ์„ค๊ณ„์˜ ์‹œ์ž‘: IP์™€ Subnet

๋ฐ˜๋ณต๋˜๋Š” ๋ฃจํ‹ด ์†์—์„œ ์–ป์€ ์•ˆ์ •๊ฐ์„ ๋ฐœํŒ ์‚ผ์•„, ์ด์ œ๋Š” ๊ธฐ์ˆ ์  ์ŠคํŽ™ํŠธ๋Ÿผ์„ ๋„“ํžˆ๊ธฐ ์œ„ํ•œ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— ์ฐฉ์ˆ˜ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ๋‹จ์ˆœํ•œ ํฌํŠธํด๋ฆฌ์˜ค ๊ตฌ์ถ•์„ ๋„˜์–ด, ์‹ค์ œ ์„œ๋น„์Šค ์ˆ˜์ค€์˜ ๋ธ”๋กœ๊ทธ ์‹œ์Šคํ…œ ๊ตฌํ˜„๊ณผ ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ ์ ์šฉ ๋“ฑ ์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด ์—ญ๋Ÿ‰์„ ํ•œ ๋‹จ๊ณ„