β‘ μ€μκ° μ κ·Όμ± (Real-time Accessibility)
μ¬μ©μκ° μμ²νλ μ 보λ₯Ό μ€μκ°μΌλ‘ μ¦μ μ κ·Όν μ μλ κΈ°λ₯μ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ λΉ λ₯΄κ³ ν¨μ¨μ μΈ λ°μ΄ν° μ²λ¦¬ λ° μλ΅μ΄ κ°λ₯ν©λλ€.
π₯ λμ 곡μ κ°λ₯μ± (Concurrent Sharing)
μ¬λ¬ μ¬μ©μκ° λμμ λ°μ΄ν°λ₯Ό μ‘°ννκ±°λ μμ ν μ μλ νκ²½μ μ 곡ν©λλ€. μ΄λ₯Ό μν΄ λ°μ΄ν°λ² μ΄μ€λ νΈλμμ
κ΄λ¦¬μ λμμ± μ μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°μ μΌκ΄μ±μ 보μ₯ν©λλ€.
β»οΈ μ°μμ μΈ λ³ν (Continuous Evolution)
λ°μ΄ν°λ μκ°μ΄ μ§λ¨μ λ°λΌ μ§μμ μΌλ‘ λ³λνλ©° μΆκ°, μμ , μμ κ° μ΄λ£¨μ΄μ§λλ€. λ°μ΄ν°λ² μ΄μ€λ μ΄λ¬ν λ³νλ₯Ό μ€μκ°μΌλ‘ λ°μνμ¬ μ΅μ λ°μ΄ν°λ₯Ό μ μ§ν©λλ€.
π λ°μ΄ν° λ¬΄κ²°μ± (Data Integrity)
λ°μ΄ν°μ μ νμ±, μΌκ΄μ±, μ λ’°μ±μ 보μ₯ν©λλ€. μ μ½ μ‘°κ±΄(Constraints)μ ν΅ν΄ λΆνμν μ€λ³΅ λ°μ΄ν°λ λΉμ μμ μΈ λ°μ΄ν°λ₯Ό λ°©μ§νλ©°, λ°μ΄ν°μ 무결μ±μ μ μ§ν©λλ€.
π λ°μ΄ν° λ
λ¦½μ± (Data Independence)
λ°μ΄ν°μ 물리μ ꡬ쑰μ λ
Όλ¦¬μ κ΅¬μ‘°κ° λ
립μ μ
λλ€. 물리μ μΈ μ μ₯ λ°©μμ΄ λ³κ²½λλλΌλ λ
Όλ¦¬μ μΈ λ°μ΄ν° λͺ¨λΈμ μν₯μ λ―ΈμΉμ§ μλλ‘ μ€κ³λμ΄ μμ΅λλ€.
π λ°μ΄ν° μ€λ³΅ μ΅μν (Minimized Redundancy)
λμΌν λ°μ΄ν°κ° μ¬λ¬ λ² μ μ₯λμ§ μλλ‘ μ€λ³΅μ μ΅μννμ¬ μ μ₯ 곡κ°μ μ μ½νκ³ , λ°μ΄ν°μ μΌκ΄μ±μ μ μ§ν©λλ€.
π‘οΈ λ³΄μμ± (Security)
λ°μ΄ν°λ² μ΄μ€λ μ¬μ©μ κΆνμ ν΅ν΄ λ°μ΄ν°μ λν μ κ·Όμ μ μ΄νλ©°, λΉμΈκ°λ μ¬μ©μμ μ κ·Όμ μ°¨λ¨νμ¬ λ³΄μμ κ°νν©λλ€.
μ΄λ¬ν νΉμ§λ€μ΄ κ²°ν©λμ΄ λ°μ΄ν°λ² μ΄μ€λ ν¨μ¨μ μΈ λ°μ΄ν° κ΄λ¦¬μ μ²λ¦¬λ₯Ό κ°λ₯νκ² λ§λλλ€! π
κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬ μμ€ν (RDMS, Relational Database Management System)μ λ°μ΄ν°λ₯Ό ν μ΄λΈ(Table) ννλ‘ κ΅¬μ‘°ννμ¬ μ μ₯νκ³ κ΄λ¦¬νλ λ°μ΄ν°λ² μ΄μ€ μμ€ν μ΄μμ. κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ κ° ν μ΄λΈ κ°μ κ΄κ³(Relationship) λ₯Ό μ€μ νμ¬, λ€μν λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό κ²μνκ³ κ΄λ¦¬ν μ μλ΅λλ€! ποΈπ
RDMSλ λ°μ΄ν°λ₯Ό ν μ΄λΈ λ¨μλ‘ κ΄λ¦¬ν΄μ.
μλ₯Ό λ€μ΄, κ³ κ° μ 보 ν μ΄λΈμμλ κ³ κ°μ μ΄λ¦, μ£Όμ, μ νλ²νΈ λ±μ΄ κ° μ»¬λΌμ μ μ₯λκ³ , νλμ κ³ κ° μ 보λ νμΌλ‘ κ΄λ¦¬λΌμ! π
RDMSμμλ λ°μ΄ν°λ₯Ό μ κ·ν(Normalization) κΈ°λ²μ ν΅ν΄ μ€λ³΅μ μ΅μνν΄μ.
μλ₯Ό λ€μ΄, κ³ κ° μ 보λ₯Ό κ΄λ¦¬νλ ν μ΄λΈμμ κ³ κ°μ μ£Όμλ₯Ό μ¬λ¬ ν μ΄λΈμ μ μ₯νμ§ μκ³ νλμ ν μ΄λΈλ‘ λΆλ¦¬νκ³ , λ€λ₯Έ ν μ΄λΈμμ μΈλ ν€(Foreign Key) λ‘ μ°Έμ‘°νκ² ν΄μ. ποΈ
RDMSλ μ¬λ¬ ν μ΄λΈμ λΆμ°λ λ°μ΄ν°λ₯Ό Join μ°μ°μ ν΅ν΄ κ²μν μ μμ΄μ.
μλ₯Ό λ€μ΄, μ£Όλ¬Έ ν μ΄λΈκ³Ό κ³ κ° ν μ΄λΈμ΄ κ°κ°μ λ°μ΄ν°λ₯Ό κ΄λ¦¬νκ³ μμ λ, λ ν μ΄λΈ κ°μ κ΄κ³λ₯Ό μ€μ ν΄ κ³ κ°λ³ μ£Όλ¬Έ λ΄μμ μ½κ² κ²μν μ μμ£ ! ποΈ
λ°μ΄ν°λ² μ΄μ€ μ€κ³λ₯Ό ν λ, λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μ μ₯νκ³ μ€λ³΅μ μ΅μννκΈ° μν΄ μ κ·ν(Normalization) κ³Όμ μ κ±°μΉκ² λ©λλ€. μ€λμ κ³ κ°κ³Ό μ£Όλ¬Έ λ°μ΄ν°λ₯Ό μμλ‘ λ€μ΄, μ κ·νμ κ° λ¨κ³λ₯Ό μ€λͺ ν΄ λ릴κ²μ! π
μ κ·νμ κ° κ³Όμ μ μ€λͺ νλ©΄μ λ°μ΄ν°λ₯Ό μμλ‘ λ€μ΄λ³Όκ²μ. κ° λ¨κ³μμ μ΄λ»κ² ν μ΄λΈμ΄ λ°λλμ§ μμΈν μ€λͺ ν ν λ λ°λΌμ μ£ΌμΈμ! π
μ΄κΈ° ν μ΄λΈ (λΉμ κ·νλ μν)
μ£Όλ¬Έλ²νΈ | κ³ κ°μ΄λ¦ | κ³ κ°μ£Όμ | μνλͺ | μνκ°κ²© | μλ |
---|---|---|---|---|---|
1001 | νκΈΈλ | μμΈ κ°λ¨κ΅¬ 123 | μ€λ§νΈν° | 500,000 | 1 |
1002 | μ΄λͺ½λ£‘ | μμΈ κ°λꡬ 456 | λ ΈνΈλΆ | 1,200,000 | 1 |
1003 | νκΈΈλ | μμΈ κ°λ¨κ΅¬ 123 | νλΈλ¦Ώ | 300,000 | 2 |
쑰건: κ° μ»¬λΌμ΄ νλμ κ°(μμκ°)λ§μ κ°μ ΈμΌ ν©λλ€. μ¦, κ° μ μ λ μ΄μ λλ μ μλ μμ κ°μ κ°μ ΈμΌ νμ£ .
λΉμ κ·νλ λ°μ΄ν°μμλ κ° μ μ΄ νλμ κ°μ κ°μ‘μΌλ―λ‘ 1NF 쑰건μ μΆ©μ‘±νκ³ μμ§λ§, νΉμ μ€λ³΅λ 컬λΌμ΄ μλ€λ©΄ λΆλ¦¬ν΄μΌ ν©λλ€. μ¬κΈ°μλ μ€λ³΅λ 컬λΌμ΄ μκΈ° λλ¬Έμ μλμ κ°μ ν μ΄λΈλ‘ λ³νλ©λλ€:
μ£Όλ¬Έλ²νΈ | κ³ κ°μ΄λ¦ | κ³ κ°μ£Όμ | μνλͺ | μνκ°κ²© | μλ |
---|---|---|---|---|---|
1001 | νκΈΈλ | μμΈ κ°λ¨κ΅¬ 123 | μ€λ§νΈν° | 500,000 | 1 |
1002 | μ΄λͺ½λ£‘ | μμΈ κ°λꡬ 456 | λ ΈνΈλΆ | 1,200,000 | 1 |
1003 | νκΈΈλ | μμΈ κ°λ¨κ΅¬ 123 | νλΈλ¦Ώ | 300,000 | 2 |
μ¬κΈ°μλ 1NF μ μ© μ κ³Ό λμΌνκ² μ μ§λμ§λ§, ν μ΄λΈ λ΄ κ° μ μ΄ μμ κ°μ κ°μ§λλ‘ λμ΄ μλ κ²μ΄ μ€μν ν¬μΈνΈμ λλ€! β¨
쑰건: κΈ°λ³Έ ν€μ μΌλΆμλ§ μ’ μλ μμ±μ μ κ±°νκ³ , κ° μμ±μ κΈ°λ³Έ ν€μ μμ μ’ μλλλ‘ ν΄μΌ ν©λλ€.
μ΄ ν
μ΄λΈμμ κΈ°λ³Έ ν€κ° 'μ£Όλ¬Έλ²νΈ'λΌκ³ κ°μ νλ©΄, κ³ κ°μ΄λ¦
, κ³ κ°μ£Όμ
λ μ£Όλ¬Έκ³Ό κ΄κ³μμ΄ κ³ κ°μ κ³ μ ν μ 보μ
λλ€. λ°λΌμ κ³ κ° μ 보λ₯Ό λ°λ‘ λΆλ¦¬νμ¬ κ³ κ° ν
μ΄λΈμ λ§λ€μ΄μΌ ν©λλ€. π
μ¦, κΈ°λ³Έν€μ λΆλΆμ§ν©μ΄ κ²°μ μκ° λμ΄μλ μλλ€. μ¦, μ 2μ κ·ν μ μ ν
μ΄λΈμμ κΈ°λ³Έν€μ μν΄ μμμ§λ λͺ¨λ₯΄λ κ³ κ°μ΄λ¦
μ λ°λΌ κ³ κ°μ£Όμ
κ° κ²°μ λμ΄ κ²°μ μκ° λλ€. κ·Έλ κΈ° λλ¬Έμ μ΄λ₯Ό λ³λλ‘ κ΄λ¦¬ν΄μΌ νλ€.
κ³ κ°ID | κ³ κ°μ΄λ¦ | κ³ κ°μ£Όμ |
---|---|---|
C001 | νκΈΈλ | μμΈ κ°λ¨κ΅¬ 123 |
C002 | μ΄λͺ½λ£‘ | μμΈ κ°λꡬ 456 |
μ£Όλ¬Έλ²νΈ | κ³ κ°ID | μνλͺ | μνκ°κ²© | μλ |
---|---|---|---|---|
1001 | C001 | μ€λ§νΈν° | 500,000 | 1 |
1002 | C002 | λ ΈνΈλΆ | 1,200,000 | 1 |
1003 | C001 | νλΈλ¦Ώ | 300,000 | 2 |
μ΄μ
κ³ κ°μ΄λ¦
κ³Όκ³ κ°μ£Όμ
κ° λ μ΄μ μ£Όλ¬Έ ν μ΄λΈμ μ€λ³΅ μ μ₯λμ§ μκ³ ,κ³ κ°ID
λ‘ μ°Έμ‘°νμ¬ κ΄λ¦¬λ©λλ€ π
쑰건: κΈ°λ³Έ ν€κ° μλ μμ± κ° μ’ μμ±μ΄ μμ΄μΌ ν©λλ€. μ¦, κΈ°λ³Έ ν€κ° μλ 컬λΌμ΄ λ€λ₯Έ λΉκΈ°λ³Έ ν€ μ»¬λΌμ μ’ μλμ΄ μμΌλ©΄ μ λ©λλ€.
μ¬κΈ°μ μνλͺ
κ³Ό μνκ°κ²©
μ μλ‘ μ’
μ κ΄κ³μ μμ΄μ. μ¦, μνμ΄ μ ν΄μ§λ©΄ κ°κ²©λ μλμΌλ‘ κ²°μ λμ£ . λ°λΌμ μν μ 보λ₯Ό λ°λ‘ λΆλ¦¬νμ¬ μν ν
μ΄λΈλ‘ κ΄λ¦¬ν΄μΌ ν©λλ€. π
μ 2 μ κ·νλ₯Ό μ μ©ν ν
μ΄λΈμμ A->B, B->Cκ° μ±λ¦½ν λ, A->Cκ° μ±λ¦½νλ κ²μ μ΄νμ μ’
μμ΄λΌκ³ νλλ° μ΄λ€ μ£Όλ¬Έμ΄ μ΄λ€ μνκ³Ό μ΄λ€ κ³ κ°μ΄ μλμ§λ₯Ό μ’
μμ±μΌλ‘ κ°μ§κ³ μλλ° μ¬κΈ°μ μνλͺ
κ³Ό μνκ°κ²©
μ΄ μ’
μκ΄κ³μ μμΌλ―λ‘ μ΄λ₯Ό λΆλ¦¬ν΄μΌ νλ€.
κ³ κ°ID | κ³ κ°μ΄λ¦ | κ³ κ°μ£Όμ |
---|---|---|
C001 | νκΈΈλ | μμΈ κ°λ¨κ΅¬ 123 |
C002 | μ΄λͺ½λ£‘ | μμΈ κ°λꡬ 456 |
μνID | μνλͺ | μνκ°κ²© |
---|---|---|
P001 | μ€λ§νΈν° | 500,000 |
P002 | λ ΈνΈλΆ | 1,200,000 |
P003 | νλΈλ¦Ώ | 300,000 |
μ£Όλ¬Έλ²νΈ | κ³ κ°ID | μνID | μλ |
---|---|---|---|
1001 | C001 | P001 | 1 |
1002 | C002 | P002 | 1 |
1003 | C001 | P003 | 2 |
μ΄μ
μνλͺ
κ³Όμνκ°κ²©
μ μν ν μ΄λΈμμ κ΄λ¦¬λκ³ , μ£Όλ¬Έ ν μ΄λΈμμνID
λ₯Ό μ°Έμ‘°νκ² λ©λλ€. μ΄λ κ² ν¨μΌλ‘μ¨ μ΄νμ μ’ μμ±μ΄ μ κ±°λμμ΄μ π―
쑰건: λͺ¨λ κ²°μ μκ° ν보 ν€μ¬μΌ ν©λλ€. μ 3μ κ·νμμλ μ΄νμ μ’ μμ±μ μ κ±°νμ§λ§, BCNFλ ν보 ν€μ μ μ½μ λ κ°νν©λλ€. μ¦, μ 3μ κ·νλ₯Ό μ§νν ν μ΄λΈμ λν΄ λͺ¨λ κ²°μ μκ° ν보ν€κ° λλλ‘ ν©λλ€.
μλ₯Ό λ€μ΄, λ§μ½ ν μ£Όλ¬Έμμ ν κ³ κ°μ΄ νΉμ μμ
μ¬μμ λ΄λΉνλ€κ³ κ°μ ν κ²½μ°, μ£Όλ¬Έλ²νΈ
μ κ³ κ°ID
μΈμλ μμ
μ¬μ IDκ° ν¨κ» ν¬ν¨λ μ μμ΅λλ€. μ΄λ, κ³ κ°ID
κ° μμ
μ¬μμ κ²°μ νλ λΉμ κ·μ κ΄κ³κ° μ‘΄μ¬ν μ μμ΅λλ€.
κ³ κ°ID | κ³ κ°μ΄λ¦ | κ³ κ°μ£Όμ |
---|---|---|
C001 | νκΈΈλ | μμΈ κ°λ¨κ΅¬ 123 |
C002 | μ΄λͺ½λ£‘ | μμΈ κ°λꡬ 456 |
μνID | μνλͺ | μνκ°κ²© |
---|---|---|
P001 | μ€λ§νΈν° | 500,000 |
P002 | λ ΈνΈλΆ | 1,200,000 |
P003 | νλΈλ¦Ώ | 300,000 |
μ£Όλ¬Έλ²νΈ | κ³ κ°ID | μνID | μλ |
---|---|---|---|
1001 | C001 | P001 | 1 |
1002 | C002 | P002 | 1 |
1003 | C001 | P003 | 2 |
κ³ κ°ID | μμ μ¬μID |
---|---|
C001 | S001 |
C002 | S002 |
μ¬κΈ°μλ
κ³ κ°ID
κ° μμ μ¬μμ κ²°μ νλ λΉμ κ·μ μΈ κ΄κ³λ₯Ό μ κ±°νμ¬, κ³ κ°κ³Ό μμ μ¬μμ μ 보λ₯Ό λ³λλ‘ κ΄λ¦¬νκ² λ©λλ€ π
SQLμ λ°μ΄ν°λ² μ΄μ€(Database)μ μ μ₯λ λ°μ΄ν°λ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νκ³ μ¬μ©ν μ μλλ‘ μ§μνλ νμ€ μΈμ΄μ λλ€. λ°μ΄ν°μ κ²μ, μ½μ , μμ , μμ λ±μ μμ μ μνν μ μμΌλ©°, λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬ μμ€ν (DBMS)κ³Ό μνΈμμ©νλ λ° νμμ μ΄μμ! π»β¨
λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©: SQLμ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ λ°μ΄ν°λ₯Ό κ΄λ¦¬ν μ μλ λͺ λ Ήμ΄λ€μ μ§ν©μ λλ€. μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μΆμΆνκ±°λ μ‘°μνκ³ , μ μνκ±°λ μ μ΄ν μ μμ΄μ. ππ
λ²μ©μ±: SQLμ λͺ¨λ DBMS(MySQL, Oracle, PostgreSQL, SQL Server λ±)μμ μ¬μ© κ°λ₯ν΄μ. κ° DBMSλ§λ€ μ½κ°μ μ°¨μ΄λ μμ§λ§, SQLμ κΈ°λ³Έ ꡬ쑰λ κ±°μ λͺ¨λ μμ€ν μμ λμΌνκ² μ¬μ©λ©λλ€! ππ οΈ
MySQLμ κΈ°λ³Έ μ€μ μμ λμλ¬Έμ κ΅¬λΆ μμ:
SELECT * FROM table WHERE name = 'John';
μ΄λΌλ 쿼리λ₯Ό μ€νν λ, 'John', 'john', 'JOHN' λͺ¨λ κ°μ κ°μΌλ‘ μΈμλ©λλ€. π―λμλ¬Έμ ꡬλΆμ΄ νμν κ²½μ° BINARY
ν¨μ μ¬μ©:
λμλ¬Έμλ₯Ό ꡬλΆνμ¬ κ²μνκ±°λ λΉκ΅νκ³ μΆλ€λ©΄ BINARY
ν¨μλ₯Ό μ¬μ©ν μ μμ΅λλ€. BINARY
λ₯Ό μ¬μ©νλ©΄ MySQLμ΄ ν΄λΉ κ°μ μ΄μ§(binary) κ°μΌλ‘ μ²λ¦¬ν΄, λμλ¬Έμλ₯Ό μ격ν ꡬλΆνκ² λΌμ. βοΈπ
μμ:
SELECT * FROM table WHERE BINARY name = 'John';
μ΄ κ²½μ° 'John' λ§ κ²μλκ³ , 'john'μ΄λ 'JOHN' κ°μ λ€λ₯Έ ννμ κ°μ κ²μλμ§ μμμ. β
DDLμ λ°μ΄ν°λ² μ΄μ€μμ κ°μ²΄μ ꡬ쑰λ₯Ό μ μνλ λͺ λ Ήμ΄λ‘, ν μ΄λΈ, λ·°, μΈλ±μ€ λ± λ°μ΄ν°λ² μ΄μ€ κ°μ²΄μ μμ±, μμ , μμ μμ μ μνν μ μμ΄μ. π οΈ
CREATE
: λ°μ΄ν°λ² μ΄μ€ κ°μ²΄λ₯Ό μμ±ALTER
: κΈ°μ‘΄μ μ‘΄μ¬νλ λ°μ΄ν°λ² μ΄μ€ κ°μ²΄λ₯Ό μμ DROP
: λ°μ΄ν°λ² μ΄μ€ κ°μ²΄λ₯Ό μμ RENAME
: λ°μ΄ν°λ² μ΄μ€ κ°μ²΄μ μ΄λ¦μ λ³κ²½TRUNCATE
: ν
μ΄λΈμ λ°μ΄ν°λ₯Ό μμ νκ³ ν
μ΄λΈμ μ΄κΈ°ν-- ν
μ΄λΈ μμ±
CREATE TABLE table_name (
column_name datatype constraints
);
-- ν
μ΄λΈ μμ
ALTER TABLE table_name
ADD column_name datatype;
-- ν
μ΄λΈ μμ
DROP TABLE table_name;
-- ν
μ΄λΈ μ΄λ¦ λ³κ²½
RENAME TABLE old_table_name TO new_table_name;
-- ν
μ΄λΈ λ°μ΄ν° μ΄κΈ°ν
TRUNCATE TABLE table_name;
Character set
: λ¬Έμκ° μ»΄ν¨ν°μ μ μ₯λ λ μ΄λ ν 'μ½λ'λ‘ μ μ₯λ μ§μ λν κ·μΉμ μ§ν©μ μλ―Έν΄μ. (μ: UTF-8, ASCII λ±) πΎCollation
: νΉμ λ¬Έμ μ
μ μ μ₯λ κ°μ λΉκ΅νκ±°λ μ λ ¬ν λ μ¬μ©λλ κ·μΉλ€μ μ§ν©μ μλ―Έν©λλ€. (μ: utf8_general_ci, utf8_bin λ±) π€πCREATE DATABASE database_name;
-- Character set λ° Collation μ§μ
CREATE DATABASE database_name
DEFAULT CHARACTER SET char_value
COLLATE col_value;
CREATE DATABASE dbtest
DEFAULT CHARACTER SET utf8mb3
COLLATE utf8mb3_general_ci;
CREATE DATABASE dbtest
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
ALTER DATABASE database_name
DEFAULT CHARACTER SET char_value
COLLATE col_value;
ALTER DATABASE dbtest
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
-- νΉμ λ°μ΄ν°λ² μ΄μ€ μ ν
USE database_name;
USE dbtest;
-- λ°μ΄ν°λ² μ΄μ€ μμ
DROP DATABASE database_name;
DROP DATABASE dbtest;
SHOW CHARACTER SET;
DMLμ λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό μ‘°μνλ μΈμ΄λ‘, ν μ΄λΈμ λ μ½λμ λν΄ CRUD (Create, Retrieve, Update, Delete) μμ μ μνν μ μμ΄μ. π οΈ
ν μ΄λΈμ μλ‘μ΄ λ°μ΄ν°λ₯Ό μΆκ°νλ λͺ λ Ήμ΄μ λλ€. π
INSERT INTO books VALUES ('B001', 'Harry Potter', 'J.K. Rowling', 2007);
INSERT INTO books (book_id, title, author, published_year)
VALUES ('B002', 'The Lord of the Rings', 'J.R.R. Tolkien', 1954);
INSERT INTO books (book_id, title, author, published_year)
VALUES
('B003', '1984', 'George Orwell', 1949),
('B004', 'Pride and Prejudice', 'Jane Austen', 1813);
ν μ΄λΈμμ λ°μ΄ν°λ₯Ό μ‘°νν λ μ¬μ©ν©λλ€. π
SELECT * | { [ ALL | DISTINCT ] column | expression [ alias ], ... } FROM table_name;
*
: FROM μ μ λμ΄λ ν
μ΄λΈμμ λͺ¨λ μ΄μ μ νALL
: μ νλ λͺ¨λ νμ λ°ν (κΈ°λ³Έκ°)DISTINCT
: μ€λ³΅ ν μ κ±°column
: μ§μ λ μ΄μ μ νexpression
: μ°μ°μ λ° SQL ν¨μμ μ‘°ν©alias
: λ³μΉSELECT * FROM books;
SELECT title, author FROM books;
SELECT DISTINCT published_year FROM books;
SELECT title AS λμμ λͺ©, author AS μκ° FROM books;
SELECT product_name, price, price * 0.1 AS μΈκΈ FROM products;
SELECT title, published_year,
CASE
WHEN published_year > 2000 THEN 'μ κ°'
WHEN published_year > 1900 THEN 'κ·Όλ'
ELSE 'κ³ μ '
END AS λμλ±κΈ
FROM books;
SQLμμ SELECT
쿼리λ μ°λ¦¬κ° μμ±νλ μμμ μ€μ λ‘ μ€νλλ μμκ° λ€λ¦
λλ€. λ°μ΄ν°λ² μ΄μ€ μμ§μ νΉμ κ·μΉμ λ°λΌ 쿼리λ₯Ό μ²λ¦¬ν©λλ€. μλλ SQL SELECT
λ¬Έμ μΌλ°μ μΈ μ€ν μμμ
λλ€:
FROM
JOIN
μ ν΅ν΄ ν
μ΄λΈμ κ²°ν©ν©λλ€.WHERE
JOIN
μ ν κ²½μ°, μ΄ λ¨κ³μμ 쑰건μ λ§λ λ μ½λλ§ λ¨κΉλλ€.GROUP BY
GROUP BY
κ° μμΌλ©΄ μ΄ λ¨κ³λ μλ΅λ©λλ€.HAVING
GROUP BY
λ‘ κ·Έλ£Ήνν λ°μ΄ν° μ€ νΉμ 쑰건μ λ§μ‘±νλ κ·Έλ£Ήλ§μ νν°λ§ν©λλ€.WHERE
λ κ°λ³ νμ νν°λ§νκ³ , HAVING
μ κ·Έλ£Ήνλ λ°μ΄ν°λ₯Ό λμμΌλ‘ νν°λ§ν©λλ€.SELECT
DISTINCT
ν€μλκ° μμΌλ©΄ μ€λ³΅λλ κ°μ μ κ±°ν©λλ€.ORDER BY
ASC
(μ€λ¦μ°¨μ) λλ DESC
(λ΄λ¦Όμ°¨μ)μΌλ‘ μ λ ¬ λ°©ν₯μ μ§μ ν μ μμ΅λλ€.LIMIT
SELECT column1, column2
FROM table
WHERE condition
GROUP BY column1
HAVING aggregate_condition
ORDER BY column1 DESC
LIMIT 10;
μ΄ μμλ‘ μΏΌλ¦¬κ° μ²λ¦¬λλ©°, μ΄ κ³Όμ μ μ΄ν΄νλ©΄ λ ν¨μ¨μ μΈ μΏΌλ¦¬λ₯Ό μμ±ν μ μμ΅λλ€! π
ν μ΄λΈμμ 쑰건μ λ§λ λ μ½λλ₯Ό μμ ν©λλ€. π
UPDATE table_name SET col_name1 = col_val1, [ col_name2 = col_val2, ..., col_nameN = col_valN] WHERE conditions;
UPDATE books
SET published_year = 1997
WHERE book_id = 'B001';
UPDATE products
SET price = price * 1.1;
μ£Όμ: WHERE μ μ μλ΅νλ©΄ λͺ¨λ λ°μ΄ν°κ° μμ λ©λλ€. MySQLμ κ²½μ° κΈ°λ³Έμ μΌλ‘ μμ λͺ¨λκ° μ€μ λμ΄ μμ΄ WHERE μμ΄ UPDATE, DELETEλ₯Ό μ€νν λ μλ¬κ° λ°μν μ μμ΄μ. π¨
ν μ΄λΈμμ 쑰건μ λ§λ λ μ½λλ₯Ό μμ ν©λλ€. ποΈ
DELETE FROM table_name WHERE conditions;
DELETE FROM books
WHERE book_id = 'B002';
DELETE FROM products
WHERE price < 10000;
WHERE μ μ ν΅ν΄ νΉμ 쑰건μ λ§λ λ°μ΄ν°λ₯Ό κ²μν μ μμ΅λλ€. π―
SELECT * | { [ ALL | DISTINCT ] column | expression [ alias ], ... } FROM table_name WHERE conditions;
SELECT title, author FROM books
WHERE author = 'George Orwell';
SELECT product_name, price FROM products
WHERE price >= 50000;
SELECT customer_id, customer_name FROM customers
WHERE email IS NULL;
SELECT title, author, published_year
FROM books
WHERE published_year IN (1949, 1954, 2007);
WHERE μ μμ μ¬λ¬ 쑰건μ κ²°ν©ν λ μ¬μ©νλ λ Όλ¦¬ μ°μ°μλ€μ λλ€. βοΈ
SELECT title, author, published_year
FROM books
WHERE author = 'J.K. Rowling' AND published_year > 2000;
SELECT title, author
FROM books
WHERE author = 'George Orwell' OR author = 'J.R.R. Tolkien';
SELECT title, author
FROM books
WHERE author != 'Jane Austen';
νΉμ λ²μμ μνλ λ°μ΄ν°λ₯Ό μ‘°νν λ μ¬μ©ν©λλ€. π―
SELECT product_name, price
FROM products
WHERE price BETWEEN 20000 AND 50000;
λ¬Έμμ΄μμ νΉμ ν¨ν΄μ μ°Ύμ λ μ¬μ©νλ©°, μμΌλμΉ΄λ %
μ _
λ₯Ό μ¬μ©ν μ μμ΄μ. π
SELECT title, author
FROM books
WHERE title LIKE '%Ring%';
SELECT customer_id, customer_name
FROM customers
WHERE customer_name LIKE 'B__';
κ²μλ κ²°κ³Όλ₯Ό μ λ ¬ν λ μ¬μ©ν©λλ€. π
SELECT * | { [ ALL | DISTINCT ] column | expression [ alias ], ... } FROM table_name WHERE conditions ORDER BY col_name1 [ ASC | DESC] [, col_name2, ...];
SELECT title, author, published_year
FROM books
ORDER BY published_year ASC;
SELECT product_name, price
FROM products
ORDER BY price DESC;
κ²μλ κ²°κ³Όμμ λ°νν νμ μλ₯Ό μ νν©λλ€. π
SELECT * | { [ ALL | DISTINCT ] column | expression [ alias ], ... } FROM table_name WHERE conditions ORDER BY col_name1 [ ASC | DESC ] [, col_name2, ...] LIMIT κ°μ | OFFSET μμμΈλ±μ€;
SELECT product_name, price
FROM products
ORDER BY price DESC
LIMIT 3;
SELECT title, author
FROM books
ORDER BY published_year DESC
LIMIT 4, 5;
IN
μ°μ°μλ νΉμ 컬λΌμ κ°μ΄ μ£Όμ΄μ§ λͺ©λ‘μ ν¬ν¨λλμ§ νμΈν λ μ¬μ©λ©λλ€. β
SELECT title, author, published_year
FROM books
WHERE published_year IN (1949, 1954, 2007);
SELECT customer_name, city
FROM customers
WHERE city IN ('New York', 'Los Angeles', 'Chicago');
SELECT product_name, category
FROM products
WHERE category IN ('Electronics', 'Books', 'Clothing');
SELECT title, author, published_year
FROM books
WHERE published_year NOT IN (1949, 1954, 2007);
SELECT customer_name, city
FROM customers
WHERE city NOT IN ('New York', 'Los Angeles', 'Chicago');
SQLμμ NULLμ 'μ μ μλ κ°'μ μλ―ΈνκΈ° λλ¬Έμ, λ Όλ¦¬ μ°μ°μμ ν¨κ» μ¬μ©λ λ μ£Όμν΄μΌ ν΄μ. NULLκ³Όμ λ Όλ¦¬ μ°μ° κ²°κ³Όλ λ€μκ³Ό κ°μ΄ λμν©λλ€:
NOT NULL β NULL
NULL AND TRUE β NULL
FALSE AND NULL β FALSE
NULL AND TRUE β NULL
NULL AND NULL β NULL
TRUE OR NULL β TRUE
FALSE OR NULL β NULL
NULL OR NULL β NULL
DELETE
, TRUNCATE
, DROP
μ λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό μμ ν λ μ¬μ©λλ λͺ
λ Ήμ΄λ€μ΄μ§λ§, κ·Έ λμ λ°©μκ³Ό λͺ©μ μ΄ λ€λ¦
λλ€. κ°κ°μ μ°¨μ΄λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
DELETE
λͺ
λ Ήμ λ‘€λ°±(Undo)μ΄ κ°λ₯ν©λλ€. μ¦, λ°μ΄ν°λ₯Ό μμ ν νμλ νΈλμμ
μ ν΅ν΄ 볡ꡬν μ μμ΅λλ€.DELETE FROM employees WHERE id = 1001;
employees
ν
μ΄λΈμμ id
κ° 1001μΈ νλ§ μμ λ©λλ€.TRUNCATE
λ λ‘€λ°± λΆκ°ν©λλ€. νΈλμμ
λ΄μμ μ€νλλλΌλ 볡ꡬν μ μμ΅λλ€.DELETE
λ³΄λ€ ν¨μ¬ λΉ λ₯΄κ² λ°μ΄ν°λ₯Ό μμ ν μ μμ΅λλ€. μ΄λ λ°μ΄ν°μ κ°λ³ μμ κ° μλ ν
μ΄λΈ μ΄κΈ°ν λ°©μμ΄κΈ° λλ¬Έμ
λλ€.TRUNCATE TABLE employees;
employees
ν
μ΄λΈμ λͺ¨λ λ°μ΄ν°κ° μμ λμ§λ§, ν
μ΄λΈ ꡬ쑰λ κ·Έλλ‘ μ μ§λ©λλ€.DROP
μμ λ‘€λ°± λΆκ°ν©λλ€. ν
μ΄λΈμ΄ μμ λλ©΄ 볡ꡬν μ μμ΅λλ€.DROP TABLE employees;
employees
ν
μ΄λΈ μμ²΄κ° μμ λλ©°, ν
μ΄λΈκ³Ό κ΄λ ¨λ λͺ¨λ λ°μ΄ν°μ κ΅¬μ‘°κ° μ¬λΌμ§λλ€.λͺ λ Ήμ΄ | μμ λ²μ | λ‘€λ°± κ°λ₯μ± | WHERE μ¬μ© | μλ | ν μ΄λΈ ꡬ쑰 μ μ§ |
---|---|---|---|---|---|
DELETE | 쑰건μ λ°λ₯Έ ν μμ | κ°λ₯ | κ°λ₯ | λλ¦Ό | μ μ§ |
TRUNCATE | ν μ΄λΈμ λͺ¨λ ν μμ | λΆκ°λ₯ | λΆκ°λ₯ | λΉ λ¦ | μ μ§ |
DROP | ν μ΄λΈ μ 체 μμ | λΆκ°λ₯ | λΆκ°λ₯ | λ§€μ° λΉ λ¦ | μμ |
μ΄ μ°¨μ΄λ₯Ό μ΄ν΄νλ©΄ λ°μ΄ν° μμ μ λͺ©μ μ λ§λ λͺ λ Ήμ΄λ₯Ό μ ννμ¬ μ¬μ©ν μ μμ΅λλ€! π
DCLμ λ°μ΄ν°λ² μ΄μ€ κ°μ²΄μ λν μ κ·Ό κΆνμ΄λ CRUD κΆνμ μ μνλ λͺ λ Ήμ΄μ λλ€. μ΄λ₯Ό ν΅ν΄ νΉμ μ¬μ©μμκ² ν μ΄λΈμ κ²μ κΆνμ λΆμ¬νκ±°λ, κΈμ§ν μ μμ΄μ. π₯π
GRANT
: λ°μ΄ν°λ² μ΄μ€ κ°μ²΄μ κΆνμ λΆμ¬REVOKE
: λ°μ΄ν°λ² μ΄μ€ κ°μ²΄μ λΆμ¬λ κΆνμ μ·¨μGRANT SELECT ON table_name TO user_name;
REVOKE SELECT ON table_name FROM user_name;
TCLμ λ°μ΄ν°λ² μ΄μ€μμ νΈλμμ (Transaction)μ μ μ΄νλ λͺ λ Ήμ΄μ λλ€. νΈλμμ μ λ°μ΄ν°λ² μ΄μ€μ λ Όλ¦¬μ μ°μ° λ¨μλ‘, μ¬λ¬ μΏΌλ¦¬κ° νλμ νΈλμμ μΌλ‘ λ¬Άμ¬ μ²λ¦¬λ μ μμ΄μ. πΌπ
COMMIT
: μ€νν 쿼리λ₯Ό μ΅μ’
μ μΌλ‘ μ μ©ROLLBACK
: μ€νν 쿼리λ₯Ό λ§μ§λ§ COMMIT μ μΌλ‘ μ·¨μνμ¬ λ°μ΄ν°λ₯Ό 볡ꡬCOMMIT;
ROLLBACK;
START TRANSACTION
: COMMIT λλ ROLLBACKμ΄ λμ¬ λκΉμ§ νΈλμμ
μ μμμ μ립λλ€.COMMIT
: νΈλμμ
μ μ±κ³΅μ μΌλ‘ μλ£νκ³ λ³κ²½ μ¬νμ DBμ μ μ©ν©λλ€. β
ROLLBACK
: νΈλμμ
μ μ€ν¨λ‘ μ²λ¦¬νκ³ , νΈλμμ
μμ μ μνλ‘ λλ립λλ€. πSAVEPOINT
: SAVEPOINTλ₯Ό μ€μ νλ©΄ ROLLBACK μ ν΄λΉ μ§μ μΌλ‘ 볡μμ΄ κ°λ₯ν©λλ€. πΎautocommit
μ΄ νμ±νλμ΄ μμ΅λλ€. π SELECT @@AUTOCOMMIT;
SET AUTOCOMMIT = 1; -- autocommit νμ±ν
SET AUTOCOMMIT = 0; -- autocommit λΉνμ±ν
USE ssafydb;
CREATE TABLE tc_test
(
val VARCHAR(10)
);
START TRANSACTION;
INSERT INTO tc_test VALUES ('a');
INSERT INTO tc_test VALUES ('b');
INSERT INTO tc_test VALUES ('c');
SELECT * FROM tc_test;
ROLLBACK;
SELECT * FROM tc_test;
START TRANSACTION;
INSERT INTO tc_test VALUES ('a');
INSERT INTO tc_test VALUES ('b');
INSERT INTO tc_test VALUES ('c');
SELECT * FROM tc_test;
COMMIT;
SELECT * FROM tc_test;
TRUNCATE tc_test;
START TRANSACTION;
INSERT INTO tc_test VALUES ('a');
INSERT INTO tc_test VALUES ('b');
INSERT INTO tc_test VALUES ('c');
SAVEPOINT f1;
START TRANSACTION;
INSERT INTO tc_test VALUES ('d');
INSERT INTO tc_test VALUES ('e');
INSERT INTO tc_test VALUES ('f');
SELECT * FROM tc_test;
ROLLBACK TO f1;
SELECT * FROM tc_test;
DROP TABLE tc_test;
SELECT * FROM customers UNION SELECT * FROM products; -- error λ°μ
UNION
: λ 쿼리μμ μ νλ λͺ¨λ νμ λ°ννμ§λ§, μ€λ³΅λ νμ μ κ±°λ©λλ€.UNION ALL
: λ 쿼리μμ μ νλ λͺ¨λ νμ λ°ννλ©°, μ€λ³΅λ νλ ν¬ν¨λ©λλ€.INTERSECT
: λ 쿼리μμ μ νλ μ€λ³΅λ νλ§ λ°νλ©λλ€. (MySQLμμλ μ§μλμ§ μμ)MINUS
: 첫 λ²μ§Έ 쿼리μμ μ νλ ν μ€ λ λ²μ§Έ 쿼리μ μλ νλ§ λ°νλ©λλ€. (MySQLμμλ μ§μλμ§ μμ)SELECT customer_id, first_name, last_name
FROM customers
WHERE city IN ('New York', 'Los Angeles', 'Chicago');
SELECT customer_id, first_name, last_name
FROM customers
WHERE credit_limit > (SELECT AVG(credit_limit)
FROM customers);
UNION
:SELECT customer_id, first_name, last_name
FROM customers
WHERE city IN ('New York', 'Los Angeles', 'Chicago')
UNION
SELECT customer_id, first_name, last_name
FROM customers
WHERE credit_limit > (SELECT AVG(credit_limit)
FROM customers);
UNION ALL
:SELECT c.*
FROM (
SELECT customer_id, first_name, last_name
FROM customers
WHERE city IN ('New York', 'Los Angeles', 'Chicago')
UNION ALL
SELECT customer_id, first_name, last_name
FROM customers
WHERE credit_limit > (SELECT AVG(credit_limit)
FROM customers)
) c
ORDER BY c.customer_id;
INTERSECT
& MINUS
(MySQL μ§μλμ§ μμ)INTERSECT
μ MINUS
λ₯Ό μ§μνμ§ μκΈ° λλ¬Έμ λ€λ₯Έ λ°©λ²μΌλ‘ ν΄κ²°ν΄μΌ ν©λλ€.INTERSECT
μμSELECT order_id
FROM orders
INTERSECT
SELECT order_id
FROM order_details;
ν΄κ²° λ°©λ²: INNER JOIN
SELECT DISTINCT o.order_id FROM orders o INNER JOIN order_details od ON o.order_id = od.order_id;
- κ²°κ³Ό: λ ν μ΄λΈμμ 곡ν΅λ order_idκ° λ°νλ©λλ€.
MINUS
μμSELECT product_id
FROM products
MINUS
SELECT product_id
FROM order_details;
ν΄κ²° λ°©λ² 1:
NOT IN
μ¬μ©SELECT DISTINCT product_id FROM products WHERE product_id NOT IN ( SELECT product_id FROM order_details );
- κ²°κ³Ό: 첫 λ²μ§Έ ν μ΄λΈμμ λ λ²μ§Έ ν μ΄λΈμ μ‘΄μ¬νμ§ μλ product_idκ° λ°νλ©λλ€.
ν΄κ²° λ°©λ² 2:
NOT EXISTS
μ¬μ©SELECT DISTINCT p.product_id FROM products p WHERE NOT EXISTS ( SELECT od.product_id FROM order_details od WHERE p.product_id = od.product_id );
ν΄κ²° λ°©λ² 3: LEFT OUTER JOIN μ¬μ©
SELECT DISTINCT p.product_id FROM products p LEFT JOIN order_details od ON p.product_id = od.product_id WHERE od.product_id IS NULL;