[TIL/SQL] 2025/03/06
Pitfall ๐จ60์ ๋ง๋ ์ํ์ด๊ธฐ์, ์ข๊ณ ๊น๊ฒ ์๋ ๊ฒ ์๋๋ผ, ๋๊ณ ์๊ฒ ์๋ ๊ฒ ์ค์ํด์. ๋๊ณ ์๊ฒ ์์์ผ ์ฐ์ด์๋ผ๋ ํต๊ณผํ ์ ์๊ธฐ ๋๋ฌธ... <์ ํ๋ธ ๊ฐ์ + SQLD ๋ชจ๋ ๊ฒ + ํด๋ก๋> ํฉ์์ผ๋ก ๋ง๋ ์์ฝ๋ณธ์ ๋๋ค. ์ง๋๊ฐ๋ ๊ตฌ๊ธ ๋๊ทธ๋ค๋ค์๊ฒ ๋

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
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
CASE
WHEN ์กฐ๊ฑด1 THEN ๊ฒฐ๊ณผ1
WHEN ์กฐ๊ฑด2 THEN ๊ฒฐ๊ณผ2
...
ELSE ๊ธฐ๋ณธ๊ฒฐ๊ณผ
END- DECODE(Oracle)
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
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
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 - ์ ์: ๋๋ฑ ์ฐ์ฐ์(=)๋ฅผ ์ฌ์ฉํ ์กฐ์ธ - ์์:
SELECT e.empno, e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;##### 3.7.3 Non EQUI JOIN - ์ ์: ๋๋ฑ ์ฐ์ฐ์ ์ธ์ ์ฐ์ฐ์(BETWEEN, >, < ๋ฑ)๋ฅผ ์ฌ์ฉํ ์กฐ์ธ - ์์:
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 - ์์:
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 ๊ตฌ๋ฌธ:
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
SELECT e.ename, d.dname
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno;- USING ์ : ๋์ผํ ์ด๋ฆ์ ์ปฌ๋ผ ์ง์
SELECT e.ename, deptno, d.dname -- USING์ ์ฌ์ฉ์ ์ปฌ๋ผ๋ช
์ ํ
์ด๋ธ๋ช
๋ถ์ด๋ฉด ์๋จ
FROM emp e INNER JOIN dept d
USING (deptno);##### 3.8.2 OUTER JOIN
-- 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 - ์ ์: ๋ ํ ์ด๋ธ์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋ชจ๋ ์ปฌ๋ผ์ ๋ํด ์๋ ์กฐ์ธ
SELECT e.ename, deptno, d.dname -- ์กฐ์ธ ์ปฌ๋ผ์ ํ
์ด๋ธ๋ช
์ ๋์ด ์ฌ์ฉ ๋ถ๊ฐ
FROM emp e NATURAL JOIN dept d;##### 3.8.4 CROSS JOIN - ์ ์: ์นดํ ์์ ๊ณฑ(Cartesian Product), ๋ชจ๋ ์กฐํฉ ์์ฑ
SELECT e.ename, d.dname
FROM emp e CROSS JOIN dept d;Chapter 4 SQL ํ์ฉ ๐ฏ
#### 4.1 ์๋ธ์ฟผ๋ฆฌ
##### 4.1.1 ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ - ์ ์: SELECT ์ ์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ, ๋จ์ผ ๊ฐ ๋ฐํ
SELECT ename, (SELECT dname FROM dept WHERE dept.deptno = emp.deptno) as dname
FROM emp;##### 4.1.2 ์ธ๋ผ์ธ ๋ทฐ - ์ ์: FROM ์ ์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ, ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉ
SELECT e.ename, d.dname
FROM emp e, (SELECT deptno, dname FROM dept) d
WHERE e.deptno = d.deptno;##### 4.1.3 ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ - ์ ์: WHERE ์ ์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ - ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ: = ์ฐ์ฐ์ ์ฌ์ฉ, ํ ํ ๋ฐํ
SELECT ename FROM emp
WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'SALES');- ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ: IN, ANY, ALL ์ฐ์ฐ์ ์ฌ์ฉ, ์ฌ๋ฌ ํ ๋ฐํ
- IN: ๊ฐ์ด ๋ฆฌ์คํธ(๋๋ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ) ์์ ์๋์ง ํ์ธ``` ์ฝ๋๋ฅผ ์ ๋ ฅํ์ธ์
SELECT ename FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc = 'NEW YORK');
- **ANY, SOME**: ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด TRUESELECT ename, sal FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE deptno = 10);
- **ALL**: ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ชจ๋๋ฅผ ๋ง์กฑํด์ผ TRUESELECT ename, sal FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 10);
- **EXISTS**: ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉด TRUESELECT dname FROM dept d WHERE EXISTS (SELECT 1 FROM emp e WHERE e.deptno = d.deptno);
#### 4.2 ์งํฉ์ฐ์ฐ์
##### 4.2.1 UNION ALL / UNION
- **UNION ALL**: ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ๋ฐํ(์ค๋ณต ํฌํจ)SELECT empno, ename FROM emp_korea UNION ALL SELECT empno, ename FROM emp_japan;
- **UNION**: ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ๋ฐํ(์ค๋ณต ์ ๊ฑฐ, ์ ๋ ฌ)SELECT empno, ename FROM emp_korea UNION SELECT empno, ename FROM emp_japan;
##### 4.2.2 INTERSECT
- **์ ์**: ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๊ต์งํฉSELECT empno, ename FROM emp_korea INTERSECT SELECT empno, ename FROM emp_global;
##### 4.2.3 MINUS / EXCEPT
- **์ ์**: ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์์ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋บ ์ฐจ์งํฉ
- **MINUS**: Oracle
- **EXCEPT**: SQL ServerSELECT empno, ename FROM emp_global MINUS SELECT empno, ename FROM emp_retired;
#### 4.3 ๊ทธ๋ฃนํจ์
##### 4.3.1 ROLLUP
- **์ ์**: ์ง์ ๋ ์ปฌ๋ผ์ ์๊ณ์ ์ด๊ณ๋ฅผ ์์ฑ
- **ํน์ง**: ๊ณ์ธต์ ์ง๊ณ๋ฅผ ์์ฑํจSELECT deptno, job, SUM(sal) FROM emp GROUP BY ROLLUP(deptno, job);
##### 4.3.2 CUBE
- **์ ์**: ์ง์ ๋ ์ปฌ๋ผ์ ๋ชจ๋ ์กฐํฉ์ ๋ํ ์๊ณ์ ์ด๊ณ ์์ฑSELECT deptno, job, SUM(sal) FROM emp GROUP BY CUBE(deptno, job);
##### 4.3.3 GROUPING SET
- **์ ์**: ์ง์ ํ ์ฌ๋ฌ ๊ทธ๋ฃนํ ์กฐํฉ์ ๊ฒฐ๊ณผ๋ฅผ UNION ALL๋ก ํฉ์น ๊ฒฐ๊ณผSELECT deptno, job, SUM(sal) FROM emp GROUP BY GROUPING SETS((deptno), (job), ());
##### 4.3.4 GROUPING
- **์ ์**: ํด๋น ์ปฌ๋ผ์ด ์ง๊ณ์ ์ฌ์ฉ๋์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํ(0: ์ฌ์ฉ๋จ, 1: ์ฌ์ฉ์๋จ)SELECT deptno, GROUPING(deptno), SUM(sal) FROM emp GROUP BY ROLLUP(deptno);
#### 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;
##### 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;
##### 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;
##### 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;
#### 4.5 Top N ์ฟผ๋ฆฌ
##### 4.5.1 ROWNUM ํจ์
- **Oracle**:SELECT FROM ( SELECT ename, sal FROM emp ORDER BY sal DESC ) WHERE ROWNUM <= 5;
##### 4.5.2 ์๋์ฐํจ์์ ์์ํจ์SELECT FROM ( SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) rn FROM emp ) WHERE rn <= 5;
- **SQL Server**: TOP ์ ์ฌ์ฉSELECT TOP 5 ename, sal FROM emp ORDER BY sal DESC;
#### 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;
- **์ฃผ์ ํค์๋**:
- **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;
#### 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'));
##### 4.7.2 UNPIVOT์
- **์ ์**: ์ด์ ํ์ผ๋ก ์ ํSELECT FROM dept_job_pivot UNPIVOT (sal FOR job IN (CLERK, MANAGER, ANALYST));
#### 4.8 ์ ๊ทํํ์
- **Oracle**: REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR, REGEXP_INSTRSELECT ename FROM emp WHERE REGEXP_LIKE(ename, '^[A-C].');
- **์ฃผ์ ํจํด**:
- **^**: ํ์ ์์
- **$**: ํ์ ๋
- **.**: ์์์ ํ ๋ฌธ์
- **\***: 0ํ ์ด์ ๋ฐ๋ณต
- **+**: 1ํ ์ด์ ๋ฐ๋ณต
- **?**: 0ํ ๋๋ 1ํ
- **|**: ๋์ฒด(OR)
- **[ ]**: ๋ฌธ์ ์งํฉ, ๋ฒ์
- **[^ ]**: ๋ถ์ ๋ฌธ์ ์งํฉ
### Chapter 5 ๊ด๋ฆฌ๊ตฌ๋ฌธ ๐ฏ
#### 5.1 DML
##### 5.1.1 INSERTINSERT INTO ํ ์ด๋ธ๋ช [(์ปฌ๋ผ๋ช 1, ์ปฌ๋ผ๋ช 2, ...)] VALUES (๊ฐ1, ๊ฐ2, ...);
-- ๋ค์ค ํ ์ฝ์ INSERT INTO ํ ์ด๋ธ๋ช [(์ปฌ๋ผ๋ช 1, ์ปฌ๋ผ๋ช 2, ...)] SELECT ์ปฌ๋ผ1, ์ปฌ๋ผ2, ... FROM ์์คํ ์ด๋ธ WHERE ์กฐ๊ฑด;
##### 5.1.2 UPDATEUPDATE ํ ์ด๋ธ๋ช SET ์ปฌ๋ผ๋ช 1 = ๊ฐ1, ์ปฌ๋ผ๋ช 2 = ๊ฐ2, ... [WHERE ์กฐ๊ฑด];
##### 5.1.3 DELETEDELETE FROM ํ ์ด๋ธ๋ช [WHERE ์กฐ๊ฑด];
-- TRUNCATE (DDL) TRUNCATE TABLE ํ ์ด๋ธ๋ช ;
- **DELETE vs TRUNCATE**:
- DELETE: DML, ์กฐ๊ฑด์ง์ ๊ฐ๋ฅ, ํธ๋์ญ์
๋ก๊ทธ ๊ธฐ๋ก, ROLLBACK ๊ฐ๋ฅ
- TRUNCATE: DDL, ํ
์ด๋ธ ์ ์ฒด ์ญ์ , ํธ๋์ญ์
๋ก๊ทธ ์ต์ํ, ROLLBACK ๋ถ๊ฐ
##### 5.1.4 MERGEMERGE 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, ...);
#### 5.2 TCL
##### 5.2.1 ํธ๋์ญ์
์ ํน์ง
- **์์์ฑ(Atomicity)**: ๋ชจ๋ ์ํ๋๊ฑฐ๋ ์ ํ ์ํ๋์ง ์์
- **์ผ๊ด์ฑ(Consistency)**: ํธ๋์ญ์
์ํ ์ ํ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง
- **๊ณ ๋ฆฝ์ฑ(Isolation)**: ํธ๋์ญ์
์ํ ์ค ๋ค๋ฅธ ํธ๋์ญ์
์ ์ํฅ์ ๋ฐ์ง ์์
- **์ง์์ฑ(Durability)**: ์๋ฃ๋ ํธ๋์ญ์
๊ฒฐ๊ณผ๋ ์๊ตฌ์ ์ผ๋ก ๋ฐ์
##### 5.2.2 COMMIT
- **์ ์**: ํธ๋์ญ์
์๋ฃ, ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์COMMIT;
##### 5.2.3 ROLLBACK
- **์ ์**: ํธ๋์ญ์
์ทจ์, ๋ง์ง๋ง COMMIT ์์ ์ผ๋ก ๋ณต์ROLLBACK;
##### 5.2.4 SAVEPOINT
- **์ ์**: ํธ๋์ญ์
๋ด ์ ์ฅ์ ์ค์ , ๋ถ๋ถ ๋กค๋ฐฑ ๊ฐ๋ฅSAVEPOINT ํฌ์ธํธ๋ช ; ROLLBACK TO ํฌ์ธํธ๋ช ;
#### 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];
##### 5.3.2 ALTER-- ์ปฌ๋ผ ์ถ๊ฐ ALTER TABLE ํ ์ด๋ธ๋ช ADD (์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ [์ ์ฝ์กฐ๊ฑด]);
-- ์ปฌ๋ผ ์์ ALTER TABLE ํ ์ด๋ธ๋ช MODIFY (์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ [์ ์ฝ์กฐ๊ฑด]);
-- ์ปฌ๋ผ ์ญ์ ALTER TABLE ํ ์ด๋ธ๋ช DROP COLUMN ์ปฌ๋ผ๋ช ;
-- ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ ALTER TABLE ํ ์ด๋ธ๋ช ADD CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ์ ์ฝ์กฐ๊ฑด (์ปฌ๋ผ๋ช );
-- ์ ์ฝ์กฐ๊ฑด ์ญ์ ALTER TABLE ํ ์ด๋ธ๋ช DROP CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ;
#### 5.4 DCL
##### 5.4.1 USER ๊ด๋ จ ๋ช
๋ น์ด-- ์ฌ์ฉ์ ์์ฑ CREATE USER ์ฌ์ฉ์๋ช IDENTIFIED BY ๋น๋ฐ๋ฒํธ;
-- ์ฌ์ฉ์ ๋ณ๊ฒฝ ALTER USER ์ฌ์ฉ์๋ช IDENTIFIED BY ์๋น๋ฐ๋ฒํธ;
-- ์ฌ์ฉ์ ์ญ์ DROP USER ์ฌ์ฉ์๋ช [CASCADE];
##### 5.4.2 ๊ถํ ๊ด๋ จ ๋ช
๋ น์ด-- ๊ถํ ๋ถ์ฌ GRANT ๊ถํ [, ๊ถํ...] ON ๊ฐ์ฒด TO ์ฌ์ฉ์ [WITH GRANT OPTION];
-- ๊ถํ ์ทจ์ REVOKE [GRANT OPTION FOR] ๊ถํ ON ๊ฐ์ฒด FROM ์ฌ์ฉ์;
- **์ฃผ์ ๊ถํ**:
- **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 Architecture ์ดํดํ๊ธฐ
์๋ก์ด ํ๋ก์ ํธ๋ฅผ ๊ธฐํํ๋ฉฐ, ๊ฐ๋ฐ์์ ๋ฌด์์ ๊ฐ์ฅ ๋จผ์ ๊ณ ๋ฏผํด์ผ ํ๋์ง ๋ค์ ๋์๋ณด๊ฒ ๋์์ต๋๋ค.ํ๋๋ ํ๋ก ํธ์๋๊ฐ ๋ชจ๋ ์ค๊ณ์ ์ถ๋ฐ์ ์ด๋ผ๊ณ ๋ฏฟ์์ต๋๋ค. ์ ์ ๊ฐ ๋ฌด์์ ๋ณด๊ณ , ์ด๋ค ํ๋ฆ์์ ๋จธ๋ฌด๋ฅด๊ณ ์ดํํ๋์ง์ ๋ํ ์ดํด ์์ด ์๋น์ค๋ฅผ ๋ง๋ ๋ค๋ ๊ฑด ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๊ธฐ
'์์ฌ์ดํธ'ํ๋ก ํธ์๋ ๊ด์ ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ ์ดํดํ๊ธฐ
์ค๋๋ง์ ๋ฐฉ๋ฒ๋ก ์ ๊ดํ ๊ธ์ ์ฐ๊ฒ ๋์์ต๋๋ค. ์ต๊ทผ ์ํฉ์ ์ด๋ ์ต๋๋ค. SSAFY์์๋ ํ๋ฃจ์ ์์ฒญ๋ ์์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ค์ ๊ณผ์ ๋ก ์ํํ๊ฒ ๋ฉ๋๋ค. ๊ทธ ๊ณผ์ ์์, '๊ตฌํ๋ ฅ'์ด ๋งค์ฐ ๋จ์ด์ง๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ์์ ํ ์ด๋ ค์ด ๋ฌธ์ ๋ผ๋ฉด '์์ฌ์'์ด๋ผ๋ ๊ฐ์ ์กฐ์ฐจ ๋๋ผ์ง
SubnetVPC ์ค๊ณ์ ์์: IP์ Subnet
๋ฐ๋ณต๋๋ ๋ฃจํด ์์์ ์ป์ ์์ ๊ฐ์ ๋ฐํ ์ผ์, ์ด์ ๋ ๊ธฐ์ ์ ์คํํธ๋ผ์ ๋ํ๊ธฐ ์ํ ๊ฐ์ธ ํ๋ก์ ํธ์ ์ฐฉ์ํ๊ณ ์ ํฉ๋๋ค.์ด๋ฒ ํ๋ก์ ํธ์ ๋ชฉํ๋ ๋จ์ํ ํฌํธํด๋ฆฌ์ค ๊ตฌ์ถ์ ๋์ด, ์ค์ ์๋น์ค ์์ค์ ๋ธ๋ก๊ทธ ์์คํ ๊ตฌํ๊ณผ ๋ค๊ตญ์ด ์ฒ๋ฆฌ ์ ์ฉ ๋ฑ ์ค๋ฌด์ ๊ฐ๊น์ด ์ญ๋์ ํ ๋จ๊ณ