[DB][MySQL][κ°œλ…] πŸš€ SQL의 λͺ¨λ“  것: μ΄ˆλ³΄λΆ€ν„° μ „λ¬Έκ°€κΉŒμ§€ μ™„λ²½ κ°€μ΄λ“œ! πŸ’‘

κΉ€μƒμš±Β·2024λ…„ 9μ›” 9일
0
post-thumbnail

πŸ’‘ λ°μ΄ν„°λ² μ΄μŠ€μ˜ νŠΉμ§•

  1. ⚑ μ‹€μ‹œκ°„ μ ‘κ·Όμ„± (Real-time Accessibility)
    μ‚¬μš©μžκ°€ μš”μ²­ν•˜λŠ” 정보λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ¦‰μ‹œ μ ‘κ·Όν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 λΉ λ₯΄κ³  효율적인 데이터 처리 및 응닡이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

  2. πŸ‘₯ λ™μ‹œ 곡유 κ°€λŠ₯μ„± (Concurrent Sharing)
    μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μ‹œμ— 데이터λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆλŠ” ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ λ°μ΄ν„°λ² μ΄μŠ€λŠ” νŠΈλžœμž­μ…˜ 관리와 λ™μ‹œμ„± μ œμ–΄λ₯Ό 톡해 λ°μ΄ν„°μ˜ 일관성을 보μž₯ν•©λ‹ˆλ‹€.

  3. ♻️ 연속적인 λ³€ν™” (Continuous Evolution)
    λ°μ΄ν„°λŠ” μ‹œκ°„μ΄ 지남에 따라 μ§€μ†μ μœΌλ‘œ λ³€λ™ν•˜λ©° μΆ”κ°€, μˆ˜μ •, μ‚­μ œκ°€ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ΄λŸ¬ν•œ λ³€ν™”λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ λ°˜μ˜ν•˜μ—¬ μ΅œμ‹  데이터λ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.

  4. πŸ”’ 데이터 무결성 (Data Integrity)
    λ°μ΄ν„°μ˜ μ •ν™•μ„±, 일관성, 신뒰성을 보μž₯ν•©λ‹ˆλ‹€. μ œμ•½ 쑰건(Constraints)을 톡해 λΆˆν•„μš”ν•œ 쀑볡 λ°μ΄ν„°λ‚˜ 비정상적인 데이터λ₯Ό λ°©μ§€ν•˜λ©°, λ°μ΄ν„°μ˜ 무결성을 μœ μ§€ν•©λ‹ˆλ‹€.

  5. πŸ”— 데이터 독립성 (Data Independence)
    λ°μ΄ν„°μ˜ 물리적 ꡬ쑰와 논리적 ꡬ쑰가 λ…λ¦½μ μž…λ‹ˆλ‹€. 물리적인 μ €μž₯ 방식이 λ³€κ²½λ˜λ”λΌλ„ 논리적인 데이터 λͺ¨λΈμ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ μ„€κ³„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  6. πŸ“‰ 데이터 쀑볡 μ΅œμ†Œν™” (Minimized Redundancy)
    λ™μΌν•œ 데이터가 μ—¬λŸ¬ 번 μ €μž₯λ˜μ§€ μ•Šλ„λ‘ 쀑볡을 μ΅œμ†Œν™”ν•˜μ—¬ μ €μž₯ 곡간을 μ ˆμ•½ν•˜κ³ , λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•©λ‹ˆλ‹€.

  7. πŸ›‘οΈ λ³΄μ•ˆμ„± (Security)
    λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ‚¬μš©μž κΆŒν•œμ„ 톡해 데이터에 λŒ€ν•œ 접근을 μ œμ–΄ν•˜λ©°, λΉ„μΈκ°€λœ μ‚¬μš©μžμ˜ 접근을 μ°¨λ‹¨ν•˜μ—¬ λ³΄μ•ˆμ„ κ°•ν™”ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ νŠΉμ§•λ“€μ΄ κ²°ν•©λ˜μ–΄ λ°μ΄ν„°λ² μ΄μŠ€λŠ” 효율적인 데이터 관리와 처리λ₯Ό κ°€λŠ₯ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€! 😊


πŸ“Š RDMS (Relational Database Management System)

κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ 관리 μ‹œμŠ€ν…œ(RDMS, Relational Database Management System)은 데이터λ₯Ό ν…Œμ΄λΈ”(Table) ν˜•νƒœλ‘œ κ΅¬μ‘°ν™”ν•˜μ—¬ μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ΄μ—μš”. κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” 각 ν…Œμ΄λΈ” κ°„μ˜ 관계(Relationship) λ₯Ό μ„€μ •ν•˜μ—¬, λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό κ²€μƒ‰ν•˜κ³  관리할 수 μžˆλ‹΅λ‹ˆλ‹€! πŸ—‚οΈπŸ”


πŸ’‘ νŠΉμ§•

1. πŸ—‚ ν…Œμ΄λΈ” 기반 (Table-based) 데이터 관리

RDMSλŠ” 데이터λ₯Ό ν…Œμ΄λΈ” λ‹¨μœ„λ‘œ κ΄€λ¦¬ν•΄μš”.

  • ν…Œμ΄λΈ”(Table): ν–‰κ³Ό μ—΄λ‘œ κ΅¬μ„±λœ λ°μ΄ν„°μ˜ 집합 πŸ“‹
  • 컬럼(Column): ν…Œμ΄λΈ”μ˜ μ—΄λ‘œ, λ°μ΄ν„°μ˜ 속성을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • ν–‰(Row): ν…Œμ΄λΈ”μ˜ 각 κ°œλ³„ 데이터 ν•­λͺ©μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 고객 정보 ν…Œμ΄λΈ”μ—μ„œλŠ” 고객의 이름, μ£Όμ†Œ, μ „ν™”λ²ˆν˜Έ 등이 각 μ»¬λŸΌμ— μ €μž₯되고, ν•˜λ‚˜μ˜ 고객 μ •λ³΄λŠ” ν–‰μœΌλ‘œ κ΄€λ¦¬λΌμš”! πŸ“

2. πŸ”„ 데이터 쀑볡 μ΅œμ†Œν™”

RDMSμ—μ„œλŠ” 데이터λ₯Ό μ •κ·œν™”(Normalization) 기법을 톡해 쀑볡을 μ΅œμ†Œν™”ν•΄μš”.

  • μ •κ·œν™”: λ™μΌν•œ 데이터가 μ—¬λŸ¬ ν…Œμ΄λΈ”μ— 쀑볡 μ €μž₯λ˜λŠ” 것을 λ°©μ§€ν•˜κ³ , 데이터 μˆ˜μ • μ‹œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό μ€„μ—¬μ€˜μš”! πŸ’‘
  • μ€‘λ³΅λœ 데이터가 μžˆμ„ 경우, μˆ˜μ •ν•  λ•Œ μ—¬λŸ¬ μœ„μΉ˜μ—μ„œ λ³€κ²½ν•΄μ•Ό ν•˜λ―€λ‘œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆκ±°λ“ μš”.

예λ₯Ό λ“€μ–΄, 고객 정보λ₯Ό κ΄€λ¦¬ν•˜λŠ” ν…Œμ΄λΈ”μ—μ„œ 고객의 μ£Όμ†Œλ₯Ό μ—¬λŸ¬ ν…Œμ΄λΈ”μ— μ €μž₯ν•˜μ§€ μ•Šκ³  ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”λ‘œ λΆ„λ¦¬ν•˜κ³ , λ‹€λ₯Έ ν…Œμ΄λΈ”μ—μ„œ μ™Έλž˜ ν‚€(Foreign Key) 둜 μ°Έμ‘°ν•˜κ²Œ ν•΄μš”. πŸ—οΈ

3. πŸ”— ν…Œμ΄λΈ” κ°„ 관계 (Join)λ₯Ό μ΄μš©ν•œ 데이터 검색

RDMSλŠ” μ—¬λŸ¬ ν…Œμ΄λΈ”μ— λΆ„μ‚°λœ 데이터λ₯Ό Join 연산을 톡해 검색할 수 μžˆμ–΄μš”.

  • Join: 두 개 μ΄μƒμ˜ ν…Œμ΄λΈ”μ„ μ—°κ²°ν•˜μ—¬, ν•„μš”ν•œ 데이터λ₯Ό ν•˜λ‚˜μ˜ 결과둜 λ°˜ν™˜ν•˜λŠ” μ—°μ‚°μ΄μ—μš”. πŸ”
  • ν…Œμ΄λΈ” κ°„ 관계λ₯Ό μ„€μ •ν•˜κ³ , 이 관계λ₯Ό ν™œμš©ν•˜μ—¬ λ³΅μž‘ν•œ 데이터도 μ‰½κ²Œ μ‘°νšŒν•  수 μžˆλ‹΅λ‹ˆλ‹€!

예λ₯Ό λ“€μ–΄, μ£Όλ¬Έ ν…Œμ΄λΈ”κ³Ό 고객 ν…Œμ΄λΈ”μ΄ 각각의 데이터λ₯Ό κ΄€λ¦¬ν•˜κ³  μžˆμ„ λ•Œ, 두 ν…Œμ΄λΈ” κ°„μ˜ 관계λ₯Ό μ„€μ •ν•΄ 고객별 μ£Όλ¬Έ 내역을 μ‰½κ²Œ 검색할 수 있죠! πŸ›οΈ


βœ… RDMS의 μž₯점

  1. 데이터 일관성: 쀑볡 데이터λ₯Ό μ€„μ—¬μ„œ λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•΄μš”. πŸ› οΈ
  2. μœ μ—°ν•œ 데이터 검색: ν…Œμ΄λΈ” κ°„μ˜ 관계λ₯Ό ν™œμš©ν•΄ λ³΅μž‘ν•œ 데이터 μ‘°νšŒλ„ κ°€λŠ₯! πŸ”
  3. 데이터 무결성: Primary Key, Foreign Key 등을 μ„€μ •ν•˜μ—¬ 데이터 무결성을 μœ μ§€ν•  수 μžˆμ–΄μš”. πŸ“‘

🌟 λ°μ΄ν„°λ² μ΄μŠ€ μ •κ·œν™” κ³Όμ • μ„€λͺ… 🌟

λ°μ΄ν„°λ² μ΄μŠ€ 섀계λ₯Ό ν•  λ•Œ, 데이터λ₯Ό 효율적으둜 μ €μž₯ν•˜κ³  쀑볡을 μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ μ •κ·œν™”(Normalization) 과정을 거치게 λ©λ‹ˆλ‹€. μ˜€λŠ˜μ€ 고객과 μ£Όλ¬Έ 데이터λ₯Ό μ˜ˆμ‹œλ‘œ λ“€μ–΄, μ •κ·œν™”μ˜ 각 단계λ₯Ό μ„€λͺ…ν•΄ λ“œλ¦΄κ²Œμš”! πŸŽ‰


μ •κ·œν™”μ˜ 각 과정을 μ„€λͺ…ν•˜λ©΄μ„œ 데이터λ₯Ό μ˜ˆμ‹œλ‘œ λ“€μ–΄λ³Όκ²Œμš”. 각 λ‹¨κ³„μ—μ„œ μ–΄λ–»κ²Œ ν…Œμ΄λΈ”μ΄ λ°”λ€ŒλŠ”μ§€ μžμ„Ένžˆ μ„€λͺ…ν•  ν…Œλ‹ˆ 따라와 μ£Όμ„Έμš”! 😊


μ˜ˆμ‹œ 데이터: 고객과 μ£Όλ¬Έ 정보

초기 ν…Œμ΄λΈ” (λΉ„μ •κ·œν™”λœ μƒνƒœ)

μ£Όλ¬Έλ²ˆν˜Έκ³ κ°μ΄λ¦„κ³ κ°μ£Όμ†Œμƒν’ˆλͺ…μƒν’ˆκ°€κ²©μˆ˜λŸ‰
1001ν™κΈΈλ™μ„œμšΈ 강남ꡬ 123슀마트폰500,0001
1002이λͺ½λ£‘μ„œμšΈ 강동ꡬ 456λ…ΈνŠΈλΆ1,200,0001
1003ν™κΈΈλ™μ„œμšΈ 강남ꡬ 123νƒœλΈ”λ¦Ώ300,0002

1️⃣ 제1μ •κ·œν˜• (1NF) - μ›μžμ„± 보μž₯

쑰건: 각 컬럼이 ν•˜λ‚˜μ˜ κ°’(μ›μžκ°’)λ§Œμ„ κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€. 즉, 각 셀은 더 이상 λ‚˜λˆŒ 수 μ—†λŠ” μ›μž 값을 κ°€μ Έμ•Ό ν•˜μ£ .

λΉ„μ •κ·œν™”λœ λ°μ΄ν„°μ—μ„œλŠ” 각 셀이 ν•˜λ‚˜μ˜ 값을 κ°€μ‘ŒμœΌλ―€λ‘œ 1NF 쑰건을 μΆ©μ‘±ν•˜κ³  μžˆμ§€λ§Œ, ν˜Ήμ‹œ μ€‘λ³΅λœ 컬럼이 μžˆλ‹€λ©΄ 뢄리해야 ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μ€‘λ³΅λœ 컬럼이 μ—†κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같은 ν…Œμ΄λΈ”λ‘œ λ³€ν™˜λ©λ‹ˆλ‹€:

μ£Όλ¬Έλ²ˆν˜Έκ³ κ°μ΄λ¦„κ³ κ°μ£Όμ†Œμƒν’ˆλͺ…μƒν’ˆκ°€κ²©μˆ˜λŸ‰
1001ν™κΈΈλ™μ„œμšΈ 강남ꡬ 123슀마트폰500,0001
1002이λͺ½λ£‘μ„œμšΈ 강동ꡬ 456λ…ΈνŠΈλΆ1,200,0001
1003ν™κΈΈλ™μ„œμšΈ 강남ꡬ 123νƒœλΈ”λ¦Ώ300,0002

μ—¬κΈ°μ„œλŠ” 1NF 적용 μ „κ³Ό λ™μΌν•˜κ²Œ μœ μ§€λ˜μ§€λ§Œ, ν…Œμ΄λΈ” λ‚΄ 각 셀이 μ›μž 값을 가지도둝 λ˜μ–΄ μžˆλŠ” 것이 μ€‘μš”ν•œ ν¬μΈνŠΈμž…λ‹ˆλ‹€! ✨


2️⃣ 제2μ •κ·œν˜• (2NF) - λΆ€λΆ„ ν•¨μˆ˜ 쒅속성 제거

쑰건: κΈ°λ³Έ ν‚€μ˜ μΌλΆ€μ—λ§Œ μ’…μ†λœ 속성을 μ œκ±°ν•˜κ³ , 각 속성은 κΈ°λ³Έ 킀에 μ™„μ „ μ’…μ†λ˜λ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 ν…Œμ΄λΈ”μ—μ„œ κΈ°λ³Έ ν‚€κ°€ '주문번호'라고 κ°€μ •ν•˜λ©΄, 고객이름, κ³ κ°μ£Όμ†ŒλŠ” μ£Όλ¬Έκ³Ό 관계없이 고객의 κ³ μœ ν•œ μ •λ³΄μž…λ‹ˆλ‹€. λ”°λΌμ„œ 고객 정보λ₯Ό λ”°λ‘œ λΆ„λ¦¬ν•˜μ—¬ 고객 ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€. πŸ™Œ

즉, κΈ°λ³Έν‚€μ˜ 뢀뢄집합이 κ²°μ •μžκ°€ λ˜μ–΄μ„œλŠ” μ•ˆλœλ‹€. 즉, 제2μ •κ·œν˜• μ „μ˜ ν…Œμ΄λΈ”μ—μ„œ 기본킀에 속해 μžˆμ„μ§€λ„ λͺ¨λ₯΄λŠ” 고객이름에 따라 κ³ κ°μ£Όμ†Œκ°€ κ²°μ •λ˜μ–΄ κ²°μ •μžκ°€ λœλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 이λ₯Ό λ³„λ„λ‘œ 관리해야 ν•œλ‹€.

πŸ’» 2NF 적용 ν›„:

1. 고객 ν…Œμ΄λΈ” πŸ‘₯

고객IDκ³ κ°μ΄λ¦„κ³ κ°μ£Όμ†Œ
C001ν™κΈΈλ™μ„œμšΈ 강남ꡬ 123
C002이λͺ½λ£‘μ„œμšΈ 강동ꡬ 456

2. μ£Όλ¬Έ ν…Œμ΄λΈ” πŸ“¦

주문번호고객IDμƒν’ˆλͺ…μƒν’ˆκ°€κ²©μˆ˜λŸ‰
1001C001슀마트폰500,0001
1002C002λ…ΈνŠΈλΆ1,200,0001
1003C001νƒœλΈ”λ¦Ώ300,0002

이제 고객이름과 κ³ κ°μ£Όμ†Œκ°€ 더 이상 μ£Όλ¬Έ ν…Œμ΄λΈ”μ— 쀑볡 μ €μž₯λ˜μ§€ μ•Šκ³ , 고객ID둜 μ°Έμ‘°ν•˜μ—¬ κ΄€λ¦¬λ©λ‹ˆλ‹€ 😊


3️⃣ 제3μ •κ·œν˜• (3NF) - 이행적 쒅속성 제거

쑰건: κΈ°λ³Έ ν‚€κ°€ μ•„λ‹Œ 속성 κ°„ 쒅속성이 μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€. 즉, κΈ°λ³Έ ν‚€κ°€ μ•„λ‹Œ 컬럼이 λ‹€λ₯Έ λΉ„κΈ°λ³Έ ν‚€ μ»¬λŸΌμ— μ’…μ†λ˜μ–΄ 있으면 μ•ˆ λ©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μƒν’ˆλͺ…κ³Ό μƒν’ˆκ°€κ²©μ€ μ„œλ‘œ 쒅속 관계에 μžˆμ–΄μš”. 즉, μƒν’ˆμ΄ 정해지면 가격도 μžλ™μœΌλ‘œ κ²°μ •λ˜μ£ . λ”°λΌμ„œ μƒν’ˆ 정보λ₯Ό λ”°λ‘œ λΆ„λ¦¬ν•˜μ—¬ μƒν’ˆ ν…Œμ΄λΈ”λ‘œ 관리해야 ν•©λ‹ˆλ‹€. πŸ€

제2 μ •κ·œν™”λ₯Ό μ μš©ν•œ ν…Œμ΄λΈ”μ—μ„œ A->B, B->Cκ°€ 성립할 λ•Œ, A->Cκ°€ μ„±λ¦½ν•˜λŠ” 것을 이행적 쒅속이라고 ν•˜λŠ”λ° μ–΄λ–€ 주문이 μ–΄λ–€ μƒν’ˆκ³Ό μ–΄λ–€ 고객이 μƒ€λŠ”μ§€λ₯Ό μ’…μ†μ„±μœΌλ‘œ 가지고 μžˆλŠ”λ° μ—¬κΈ°μ„œ μƒν’ˆλͺ…κ³Ό μƒν’ˆκ°€κ²©μ΄ 쒅속관계에 μžˆμœΌλ―€λ‘œ 이λ₯Ό 뢄리해야 ν•œλ‹€.

πŸ’» 3NF 적용 ν›„:

1. 고객 ν…Œμ΄λΈ” πŸ‘₯

고객IDκ³ κ°μ΄λ¦„κ³ κ°μ£Όμ†Œ
C001ν™κΈΈλ™μ„œμšΈ 강남ꡬ 123
C002이λͺ½λ£‘μ„œμšΈ 강동ꡬ 456

2. μƒν’ˆ ν…Œμ΄λΈ” πŸ›’

μƒν’ˆIDμƒν’ˆλͺ…μƒν’ˆκ°€κ²©
P001슀마트폰500,000
P002λ…ΈνŠΈλΆ1,200,000
P003νƒœλΈ”λ¦Ώ300,000

3. μ£Όλ¬Έ ν…Œμ΄λΈ” πŸ“¦

주문번호고객IDμƒν’ˆIDμˆ˜λŸ‰
1001C001P0011
1002C002P0021
1003C001P0032

이제 μƒν’ˆλͺ…κ³Ό μƒν’ˆκ°€κ²©μ€ μƒν’ˆ ν…Œμ΄λΈ”μ—μ„œ κ΄€λ¦¬λ˜κ³ , μ£Όλ¬Έ ν…Œμ΄λΈ”μ€ μƒν’ˆIDλ₯Ό μ°Έμ‘°ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ 이행적 쒅속성이 μ œκ±°λ˜μ—ˆμ–΄μš” 🎯


4️⃣ BCNF (Boyce-Codd Normal Form)

쑰건: λͺ¨λ“  κ²°μ •μžκ°€ 후보 ν‚€μ—¬μ•Ό ν•©λ‹ˆλ‹€. 제3μ •κ·œν˜•μ—μ„œλŠ” 이행적 쒅속성을 μ œκ±°ν–ˆμ§€λ§Œ, BCNFλŠ” 후보 ν‚€μ˜ μ œμ•½μ„ 더 κ°•ν™”ν•©λ‹ˆλ‹€. 즉, 제 3μ •κ·œν™”λ₯Ό μ§„ν–‰ν•œ ν…Œμ΄λΈ”μ— λŒ€ν•΄ λͺ¨λ“  κ²°μ •μžκ°€ 후보킀가 λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ§Œμ•½ ν•œ μ£Όλ¬Έμ—μ„œ ν•œ 고객이 νŠΉμ • μ˜μ—… 사원을 λ‹΄λ‹Ήν•œλ‹€κ³  κ°€μ •ν•  경우, μ£Όλ¬Έλ²ˆν˜Έμ™€ 고객ID 외에도 μ˜μ—… 사원 IDκ°€ ν•¨κ»˜ 포함될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ, 고객IDκ°€ μ˜μ—… 사원을 κ²°μ •ν•˜λŠ” λΉ„μ •κ·œμ  관계가 μ‘΄μž¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

BCNF 적용 ν›„:

1. 고객 ν…Œμ΄λΈ” πŸ‘₯

고객IDκ³ κ°μ΄λ¦„κ³ κ°μ£Όμ†Œ
C001ν™κΈΈλ™μ„œμšΈ 강남ꡬ 123
C002이λͺ½λ£‘μ„œμšΈ 강동ꡬ 456

2. μƒν’ˆ ν…Œμ΄λΈ” πŸ›’

μƒν’ˆIDμƒν’ˆλͺ…μƒν’ˆκ°€κ²©
P001슀마트폰500,000
P002λ…ΈνŠΈλΆ1,200,000
P003νƒœλΈ”λ¦Ώ300,000

3. μ£Όλ¬Έ ν…Œμ΄λΈ” πŸ“¦

주문번호고객IDμƒν’ˆIDμˆ˜λŸ‰
1001C001P0011
1002C002P0021
1003C001P0032

4. μ˜μ—…μ‚¬μ› ν…Œμ΄λΈ” πŸ‘”

고객IDμ˜μ—…μ‚¬μ›ID
C001S001
C002S002

μ—¬κΈ°μ„œλŠ” 고객IDκ°€ μ˜μ—…μ‚¬μ›μ„ κ²°μ •ν•˜λŠ” λΉ„μ •κ·œμ μΈ 관계λ₯Ό μ œκ±°ν•˜μ—¬, 고객과 μ˜μ—…μ‚¬μ›μ˜ 정보λ₯Ό λ³„λ„λ‘œ κ΄€λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€ πŸŽ‰


πŸ—ƒοΈ SQL (Structured Query Language)

SQL은 λ°μ΄ν„°λ² μ΄μŠ€(Database)에 μ €μž₯된 데이터λ₯Ό 효과적으둜 κ΄€λ¦¬ν•˜κ³  μ‚¬μš©ν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” ν‘œμ€€ μ–Έμ–΄μž…λ‹ˆλ‹€. λ°μ΄ν„°μ˜ 검색, μ‚½μž…, μˆ˜μ •, μ‚­μ œ λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있으며, λ°μ΄ν„°λ² μ΄μŠ€ 관리 μ‹œμŠ€ν…œ(DBMS)κ³Ό μƒν˜Έμž‘μš©ν•˜λŠ” 데 ν•„μˆ˜μ μ΄μ—μš”! πŸ’»βœ¨


πŸ“Œ SQL의 μ£Όμš” νŠΉμ§•

  1. λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©: SQL은 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 데이터λ₯Ό 관리할 수 μžˆλŠ” λͺ…λ Ήμ–΄λ“€μ˜ μ§‘ν•©μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 데이터λ₯Ό μΆ”μΆœν•˜κ±°λ‚˜ μ‘°μž‘ν•˜κ³ , μ •μ˜ν•˜κ±°λ‚˜ μ œμ–΄ν•  수 μžˆμ–΄μš”. πŸ”„πŸ“Š

  2. λ²”μš©μ„±: SQL은 λͺ¨λ“  DBMS(MySQL, Oracle, PostgreSQL, SQL Server λ“±)μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•΄μš”. 각 DBMSλ§ˆλ‹€ μ•½κ°„μ˜ μ°¨μ΄λŠ” μžˆμ§€λ§Œ, SQL의 κΈ°λ³Έ κ΅¬μ‘°λŠ” 거의 λͺ¨λ“  μ‹œμŠ€ν…œμ—μ„œ λ™μΌν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€! πŸŒπŸ› οΈ


βš™οΈ MySQL의 κΈ°λ³Έ μ„€μ •κ³Ό λŒ€μ†Œλ¬Έμž ꡬ뢄

  1. MySQL의 κΈ°λ³Έ μ„€μ •μ—μ„œ λŒ€μ†Œλ¬Έμž ꡬ뢄 μ—†μŒ:

    • MySQLμ—μ„œλŠ” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ” λ°©μ‹μœΌλ‘œ λ¬Έμžμ—΄ 비ꡐλ₯Ό μ²˜λ¦¬ν•΄μš”. 예λ₯Ό λ“€μ–΄, SELECT * FROM table WHERE name = 'John'; μ΄λΌλŠ” 쿼리λ₯Ό μ‹€ν–‰ν•  λ•Œ, 'John', 'john', 'JOHN' λͺ¨λ‘ 같은 κ°’μœΌλ‘œ μΈμ‹λ©λ‹ˆλ‹€. 🎯
    • μ΄λŠ” MySQL의 λ¬Έμžμ—΄ μ •λ ¬ 방식(collation) λ•Œλ¬ΈμΈλ°, 기본적으둜 λŒ€μ†Œλ¬Έμž ꡬ뢄을 ν•˜μ§€ μ•ŠλŠ”(case-insensitive) λ°©μ‹μœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆμ–΄μš”.
  2. λŒ€μ†Œλ¬Έμž ꡬ뢄이 ν•„μš”ν•œ 경우 BINARY ν•¨μˆ˜ μ‚¬μš©:

    • λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ—¬ κ²€μƒ‰ν•˜κ±°λ‚˜ λΉ„κ΅ν•˜κ³  μ‹Άλ‹€λ©΄ BINARY ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. BINARYλ₯Ό μ‚¬μš©ν•˜λ©΄ MySQL이 ν•΄λ‹Ή 값을 이진(binary) κ°’μœΌλ‘œ μ²˜λ¦¬ν•΄, λŒ€μ†Œλ¬Έμžλ₯Ό μ—„κ²©νžˆ κ΅¬λΆ„ν•˜κ²Œ λΌμš”. βš™οΈπŸ”

    • μ˜ˆμ‹œ:

      SELECT * FROM table WHERE BINARY name = 'John';

      이 경우 'John' 만 κ²€μƒ‰λ˜κ³ , 'john'μ΄λ‚˜ 'JOHN' 같은 λ‹€λ₯Έ ν˜•νƒœμ˜ 값은 κ²€μƒ‰λ˜μ§€ μ•Šμ•„μš”. βœ…


πŸ—ƒοΈ SQL μ’…λ₯˜ 및 κΈ°λ³Έ λͺ…λ Ήμ–΄ 정리


1. DDL (Data Definition Language): 데이터 μ •μ˜μ–΄

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;

2. Character Set & Collation

  • Character set: λ¬Έμžκ°€ 컴퓨터에 μ €μž₯될 λ•Œ μ–΄λ– ν•œ 'μ½”λ“œ'둜 μ €μž₯될지에 λŒ€ν•œ κ·œμΉ™μ˜ 집합을 μ˜λ―Έν•΄μš”. (예: UTF-8, ASCII λ“±) πŸ’Ύ
  • Collation: νŠΉμ • 문자 셋에 μ €μž₯된 값을 λΉ„κ΅ν•˜κ±°λ‚˜ μ •λ ¬ν•  λ•Œ μ‚¬μš©λ˜λŠ” κ·œμΉ™λ“€μ˜ 집합을 μ˜λ―Έν•©λ‹ˆλ‹€. (예: utf8_general_ci, utf8_bin λ“±) πŸ”€πŸ”„

3. λ°μ΄ν„°λ² μ΄μŠ€ 생성 및 λ³€κ²½

λ°μ΄ν„°λ² μ΄μŠ€ 생성

CREATE DATABASE database_name;

-- Character set 및 Collation 지정
CREATE DATABASE database_name
DEFAULT CHARACTER SET char_value
COLLATE col_value;

λ‹€κ΅­μ–΄ 처리 (utf8mb3) λ°μ΄ν„°λ² μ΄μŠ€ 생성 μ˜ˆμ‹œ

CREATE DATABASE dbtest
DEFAULT CHARACTER SET utf8mb3
COLLATE utf8mb3_general_ci;

이λͺ¨μ§€ λ¬ΈμžκΉŒμ§€ 처리 κ°€λŠ₯ν•œ λ°μ΄ν„°λ² μ΄μŠ€ 생성 (utf8mb4)

CREATE DATABASE dbtest
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

λ°μ΄ν„°λ² μ΄μŠ€ λ³€κ²½ (Character set 및 Collation μˆ˜μ •)

ALTER DATABASE database_name
DEFAULT CHARACTER SET char_value
COLLATE col_value;

dbtest λ°μ΄ν„°λ² μ΄μŠ€μ˜ Character set 및 Collation λ³€κ²½

ALTER DATABASE dbtest
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

4. λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©

-- νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€ 선택
USE database_name;

'dbtest' λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©

USE dbtest;

5. λ°μ΄ν„°λ² μ΄μŠ€ μ‚­μ œ

-- λ°μ΄ν„°λ² μ΄μŠ€ μ‚­μ œ
DROP DATABASE database_name;

'dbtest' λ°μ΄ν„°λ² μ΄μŠ€ μ‚­μ œ

DROP DATABASE dbtest;

6. μ‚¬μš© κ°€λŠ₯ν•œ Character set 확인

SHOW CHARACTER SET;

πŸ—ƒοΈ DML (Data Manipulation Language): 데이터 μ‘°μž‘μ–΄

DML은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό μ‘°μž‘ν•˜λŠ” μ–Έμ–΄λ‘œ, ν…Œμ΄λΈ”μ˜ λ ˆμ½”λ“œμ— λŒ€ν•΄ CRUD (Create, Retrieve, Update, Delete) μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμ–΄μš”. πŸ› οΈ


1. INSERT (Create): 데이터 μ‚½μž…

ν…Œμ΄λΈ”μ— μƒˆλ‘œμš΄ 데이터λ₯Ό μΆ”κ°€ν•˜λŠ” λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€. πŸ“

  • 컬럼 이름 μƒλž΅ μ‹œ: ν…Œμ΄λΈ” 생성 μ‹œ μ •μ˜λœ μˆœμ„œλŒ€λ‘œ 값이 μžλ™ λŒ€μž…λ©λ‹ˆλ‹€.
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);

2. SELECT (Retrieve): 데이터 쑰회

ν…Œμ΄λΈ”μ—μ„œ 데이터λ₯Ό μ‘°νšŒν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. πŸ”

SELECT * | { [ ALL | DISTINCT ] column | expression [ alias ], ... } FROM table_name;
  • * : FROM μ ˆμ— λ‚˜μ—΄λœ ν…Œμ΄λΈ”μ—μ„œ λͺ¨λ“  열을 선택
  • ALL : μ„ νƒλœ λͺ¨λ“  행을 λ°˜ν™˜ (κΈ°λ³Έκ°’)
  • DISTINCT : 쀑볡 ν–‰ 제거
  • column : μ§€μ •λœ 열을 선택
  • expression : μ—°μ‚°μž 및 SQL ν•¨μˆ˜μ˜ μ‘°ν•©
  • alias : 별칭

κΈ°λ³Έ SELECT μ˜ˆμ‹œ

  • λͺ¨λ“  λ„μ„œ 정보 검색
SELECT * FROM books;
  • νŠΉμ • 컬럼 쑰회
SELECT title, author FROM books;
  • 쀑볡 μ œκ±°ν•˜μ—¬ 쑰회 (DISTINCT)
SELECT DISTINCT published_year FROM books;
  • 별칭(alias) μ‚¬μš©
SELECT title AS λ„μ„œμ œλͺ©, author AS μž‘κ°€ FROM books;
  • 사칙연산을 ν¬ν•¨ν•œ 쑰회 (μ„ΈκΈˆ 계산)
SELECT product_name, price, price * 0.1 AS μ„ΈκΈˆ FROM products;
  • CASE λ¬Έ μ‚¬μš© (연도에 λ”°λ₯Έ λ„μ„œ λ“±κΈ‰ 계산)
SELECT title, published_year,
  CASE 
    WHEN published_year > 2000 THEN 'μ‹ κ°„'
    WHEN published_year > 1900 THEN 'κ·ΌλŒ€'
    ELSE 'κ³ μ „'
  END AS λ„μ„œλ“±κΈ‰
FROM books;

πŸ’‘ SELECT 쿼리의 μˆ˜ν–‰ μˆœμ„œ

SQLμ—μ„œ SELECT μΏΌλ¦¬λŠ” μš°λ¦¬κ°€ μž‘μ„±ν•˜λŠ” μˆœμ„œμ™€ μ‹€μ œλ‘œ μ‹€ν–‰λ˜λŠ” μˆœμ„œκ°€ λ‹€λ¦…λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ 엔진은 νŠΉμ • κ·œμΉ™μ— 따라 쿼리λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” SQL SELECT 문의 일반적인 μ‹€ν–‰ μˆœμ„œμž…λ‹ˆλ‹€:

  1. FROM

    • λ°μ΄ν„°λ² μ΄μŠ€κ°€ μΏΌλ¦¬μ—μ„œ μ‚¬μš©ν•  ν…Œμ΄λΈ”μ΄λ‚˜ λ·°λ₯Ό ν™•μΈν•˜κ³  데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
    • μ—¬λŸ¬ ν…Œμ΄λΈ”μ΄ ν¬ν•¨λœ 경우 JOIN을 톡해 ν…Œμ΄λΈ”μ„ κ²°ν•©ν•©λ‹ˆλ‹€.
  2. WHERE

    • 쑰건에 λ§žλŠ” 데이터λ₯Ό ν•„ν„°λ§ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ λ ˆμ½”λ“œμ˜ 쑰건을 κ²€μ‚¬ν•˜κ³  ν•„μš” μ—†λŠ” 데이터λ₯Ό μ œμ™Έν•©λ‹ˆλ‹€.
    • JOIN을 ν•œ 경우, 이 λ‹¨κ³„μ—μ„œ 쑰건에 λ§žλŠ” λ ˆμ½”λ“œλ§Œ λ‚¨κΉλ‹ˆλ‹€.
  3. GROUP BY

    • 데이터λ₯Ό κ·Έλ£Ήν™”ν•©λ‹ˆλ‹€. νŠΉμ • 컬럼의 값을 κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό μ§‘ν•©μœΌλ‘œ λ¬Άμ–΄ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • GROUP BYκ°€ μ—†μœΌλ©΄ 이 λ‹¨κ³„λŠ” μƒλž΅λ©λ‹ˆλ‹€.
  4. HAVING

    • GROUP BY둜 κ·Έλ£Ήν™”ν•œ 데이터 쀑 νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” κ·Έλ£Ήλ§Œμ„ ν•„ν„°λ§ν•©λ‹ˆλ‹€.
    • WHEREλŠ” κ°œλ³„ 행을 ν•„ν„°λ§ν•˜κ³ , HAVING은 κ·Έλ£Ήν™”λœ 데이터λ₯Ό λŒ€μƒμœΌλ‘œ ν•„ν„°λ§ν•©λ‹ˆλ‹€.
  5. SELECT

    • μ΅œμ’…μ μœΌλ‘œ ν•„μš”ν•œ μ»¬λŸΌμ„ μ„ νƒν•©λ‹ˆλ‹€.
    • DISTINCT ν‚€μ›Œλ“œκ°€ 있으면 μ€‘λ³΅λ˜λŠ” 값을 μ œκ±°ν•©λ‹ˆλ‹€.
  6. ORDER BY

    • κ²°κ³Ό 데이터λ₯Ό νŠΉμ • μ»¬λŸΌμ„ κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.
    • ASC(μ˜€λ¦„μ°¨μˆœ) λ˜λŠ” DESC(λ‚΄λ¦Όμ°¨μˆœ)으둜 μ •λ ¬ λ°©ν–₯을 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  7. LIMIT

    • 좜λ ₯ν•  λ°μ΄ν„°μ˜ 개수λ₯Ό μ œν•œν•©λ‹ˆλ‹€. νŠΉμ • λ²”μœ„μ˜ λ°μ΄ν„°λ§Œ 좜λ ₯ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

μ˜ˆμ‹œ

SELECT column1, column2
FROM table
WHERE condition
GROUP BY column1
HAVING aggregate_condition
ORDER BY column1 DESC
LIMIT 10;

μ‹€μ œ μˆ˜ν–‰ μˆœμ„œ

  1. FROM table
  2. WHERE condition
  3. GROUP BY column1
  4. HAVING aggregate_condition
  5. SELECT column1, column2
  6. ORDER BY column1 DESC
  7. LIMIT 10

이 μˆœμ„œλ‘œ 쿼리가 처리되며, 이 과정을 μ΄ν•΄ν•˜λ©΄ 더 효율적인 쿼리λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€! πŸ˜„


3. UPDATE (Update): 데이터 μˆ˜μ •

ν…Œμ΄λΈ”μ—μ„œ 쑰건에 λ§žλŠ” λ ˆμ½”λ“œλ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€. πŸ”„

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';
  • λͺ¨λ“  μ œν’ˆμ˜ 가격 10% 인상
UPDATE products 
SET price = price * 1.1;

주의: WHERE μ ˆμ„ μƒλž΅ν•˜λ©΄ λͺ¨λ“  데이터가 μˆ˜μ •λ©λ‹ˆλ‹€. MySQL의 경우 기본적으둜 μ•ˆμ „λͺ¨λ“œκ°€ μ„€μ •λ˜μ–΄ μžˆμ–΄ WHERE 없이 UPDATE, DELETEλ₯Ό μ‹€ν–‰ν•  λ•Œ μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆμ–΄μš”. 🚨


4. DELETE (Delete): 데이터 μ‚­μ œ

ν…Œμ΄λΈ”μ—μ„œ 쑰건에 λ§žλŠ” λ ˆμ½”λ“œλ₯Ό μ‚­μ œν•©λ‹ˆλ‹€. πŸ—‘οΈ

DELETE FROM table_name WHERE conditions;
  • νŠΉμ • λ„μ„œ 정보 μ‚­μ œ
DELETE FROM books 
WHERE book_id = 'B002';
  • 가격이 10000원 미만인 μ œν’ˆ μ‚­μ œ
DELETE FROM products 
WHERE price < 10000;

5. WHERE 절: 쑰건을 μ‚¬μš©ν•œ 데이터 검색

WHERE μ ˆμ„ 톡해 νŠΉμ • 쑰건에 λ§žλŠ” 데이터λ₯Ό 검색할 수 μžˆμŠ΅λ‹ˆλ‹€. 🎯

SELECT * | { [ ALL | DISTINCT ] column | expression [ alias ], ... } FROM table_name WHERE conditions;

μ˜ˆμ‹œ

  • νŠΉμ • μž‘κ°€μ˜ λ„μ„œ 검색
SELECT title, author FROM books 
WHERE author = 'George Orwell';
  • 가격이 50000 이상인 μ œν’ˆ 검색
SELECT product_name, price FROM products 
WHERE price >= 50000;
  • NULL κ°’ 비ꡐ (IS NULL, IS NOT NULL)
SELECT customer_id, customer_name FROM customers 
WHERE email IS NULL;
  • μ›μ†Œ 포함 μ—¬λΆ€ 확인 (IN, NOT IN)
SELECT title, author, published_year 
FROM books 
WHERE published_year IN (1949, 1954, 2007);

6. AND, OR, NOT: 논리 μ—°μ‚°μž

WHERE μ ˆμ—μ„œ μ—¬λŸ¬ 쑰건을 κ²°ν•©ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 논리 μ—°μ‚°μžλ“€μž…λ‹ˆλ‹€. βš™οΈ

μ˜ˆμ‹œ

  • J.K. Rowling μž‘κ°€μ˜ 2000λ…„ 이후 좜판된 λ„μ„œ 검색
SELECT title, author, published_year 
FROM books 
WHERE author = 'J.K. Rowling' AND published_year > 2000;
  • George Orwell λ˜λŠ” J.R.R. Tolkien의 λ„μ„œ 검색
SELECT title, author 
FROM books 
WHERE author = 'George Orwell' OR author = 'J.R.R. Tolkien';
  • μž‘κ°€κ°€ 'Jane Austen'이 μ•„λ‹Œ λ„μ„œ 검색
SELECT title, author 
FROM books 
WHERE author != 'Jane Austen';

7. BETWEEN: λ²”μœ„ 검색

νŠΉμ • λ²”μœ„μ— μ†ν•˜λŠ” 데이터λ₯Ό μ‘°νšŒν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. 🎯

μ˜ˆμ‹œ

  • 가격이 20000 이상 50000 μ΄ν•˜μΈ μ œν’ˆ 검색
SELECT product_name, price 
FROM products 
WHERE price BETWEEN 20000 AND 50000;

8. LIKE: νŒ¨ν„΄ 맀칭

λ¬Έμžμ—΄μ—μ„œ νŠΉμ • νŒ¨ν„΄μ„ 찾을 λ•Œ μ‚¬μš©ν•˜λ©°, μ™€μΌλ“œμΉ΄λ“œ %와 _λ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μš”. πŸ”

μ˜ˆμ‹œ

  • 제λͺ©μ— 'Ring'이 ν¬ν•¨λœ λ„μ„œ 검색
SELECT title, author 
FROM books 
WHERE title LIKE '%Ring%';
  • 이름이 'B'둜 μ‹œμž‘ν•˜λŠ” μ„Έ κΈ€μž 고객 검색
SELECT customer_id, customer_name 
FROM customers 
WHERE customer_name LIKE 'B__';

9. ORDER BY: μ •λ ¬

κ²€μƒ‰λœ κ²°κ³Όλ₯Ό μ •λ ¬ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. πŸ”„

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;

10. LIMIT: κ²°κ³Ό μ œν•œ

κ²€μƒ‰λœ κ²°κ³Όμ—μ„œ λ°˜ν™˜ν•  ν–‰μ˜ 수λ₯Ό μ œν•œν•©λ‹ˆλ‹€. πŸ“Š

SELECT * | { [ ALL | DISTINCT ] column | expression [ alias ], ... } FROM table_name WHERE conditions ORDER BY col_name1 [ ASC | DESC ] [, col_name2, ...] LIMIT 개수 | OFFSET μ‹œμž‘μΈλ±μŠ€;

μ˜ˆμ‹œ

  • μƒμœ„ 3개의 λΉ„μ‹Ό μ œν’ˆ 쑰회
SELECT product_name, price 
FROM products 
ORDER BY price DESC 
LIMIT 3;
  • 4λ²ˆμ§ΈλΆ€ν„° μ‹œμž‘ν•˜μ—¬ 5개의 λ„μ„œ 쑰회
SELECT title, author 
FROM books 
ORDER BY published_year DESC 
LIMIT 4, 5;

11. IN: νŠΉμ • κ°’λ“€μ˜ λͺ©λ‘μ— ν¬ν•¨λ˜λŠ”μ§€ 확인

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');

NOT IN: λͺ©λ‘μ— ν¬ν•¨λ˜μ§€ μ•ŠλŠ” κ°’ 검색

  • νŠΉμ • 좜판 연도λ₯Ό μ œμ™Έν•œ λ„μ„œ 검색
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');

πŸ’‘ 논리 μ—°μ‚° μ‹œ 주의점: NULL

SQLμ—μ„œ NULL은 'μ•Œ 수 μ—†λŠ” κ°’'을 μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ—, 논리 μ—°μ‚°μžμ™€ ν•¨κ»˜ μ‚¬μš©λ  λ•Œ μ£Όμ˜ν•΄μ•Ό ν•΄μš”. NULL과의 논리 μ—°μ‚° κ²°κ³ΌλŠ” λ‹€μŒκ³Ό 같이 λ™μž‘ν•©λ‹ˆλ‹€:

  1. NOT NULL β†’ NULL

    • NULL의 뢀정은 μ—¬μ „νžˆ NULLμž…λ‹ˆλ‹€.
  2. NULL AND TRUE β†’ NULL

    • NULL이 μžˆλŠ” AND 연산은 TRUE라 ν•˜λ”λΌλ„ κ²°κ³ΌλŠ” NULLμ΄μ—μš”.
  3. FALSE AND NULL β†’ FALSE

    • FALSEκ°€ μžˆλŠ” AND μ—°μ‚°μ—μ„œλŠ” NULL이더라도 κ²°κ³ΌλŠ” FALSEμž…λ‹ˆλ‹€.
  4. NULL AND TRUE β†’ NULL

    • NULLκ³Ό TRUE의 AND 연산은 NULL둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.
  5. NULL AND NULL β†’ NULL

    • NULL끼리의 AND 연산도 NULLμž…λ‹ˆλ‹€.
  6. TRUE OR NULL β†’ TRUE

    • TRUEκ°€ μžˆλŠ” OR μ—°μ‚°μ—μ„œλŠ” NULL이더라도 κ²°κ³ΌλŠ” TRUEμž…λ‹ˆλ‹€.
  7. FALSE OR NULL β†’ NULL

    • FALSE와 NULL의 OR 연산은 NULL둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.
  8. NULL OR NULL β†’ NULL

    • NULL끼리의 OR 연산도 NULLμž…λ‹ˆλ‹€.

πŸ’‘ 여기사 잠깐! DELETE, TRUNCATE, DROP의 차이

DELETE, TRUNCATE, DROP은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό μ‚­μ œν•  λ•Œ μ‚¬μš©λ˜λŠ” λͺ…λ Ήμ–΄λ“€μ΄μ§€λ§Œ, κ·Έ λ™μž‘ 방식과 λͺ©μ μ΄ λ‹€λ¦…λ‹ˆλ‹€. 각각의 차이λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. DELETE

  • κΈ°λŠ₯: ν…Œμ΄λΈ” λ‚΄μ—μ„œ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” 데이터 λ˜λŠ” λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.
  • μ‚¬μš© 방식: 데이터λ₯Ό ν•œ ν–‰μ”© μ‚­μ œν•˜λ©°, 쑰건이 μ—†μœΌλ©΄ λͺ¨λ“  행이 μ‚­μ œλ©λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜ κ°€λŠ₯: DELETE λͺ…령은 λ‘€λ°±(Undo)이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 즉, 데이터λ₯Ό μ‚­μ œν•œ 후에도 νŠΈλžœμž­μ…˜μ„ 톡해 볡ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ œμ•½ 쑰건: μ‚­μ œ μ‹œ WHERE μ ˆμ„ μ‚¬μš©ν•΄ 쑰건에 λ§žλŠ” 데이터λ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 속도: ν…Œμ΄λΈ” 크기가 크면 속도가 느렀질 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ

DELETE FROM employees WHERE id = 1001;
  • κ²°κ³Ό: employees ν…Œμ΄λΈ”μ—μ„œ idκ°€ 1001인 ν–‰λ§Œ μ‚­μ œλ©λ‹ˆλ‹€.

2. TRUNCATE

  • κΈ°λŠ₯: ν…Œμ΄λΈ”μ˜ λͺ¨λ“  데이터λ₯Ό λΉ λ₯΄κ²Œ μ‚­μ œν•©λ‹ˆλ‹€.
  • μ‚¬μš© 방식: 데이터λ₯Ό 전체 μ‚­μ œν•˜μ§€λ§Œ, ν…Œμ΄λΈ” ꡬ쑰(μŠ€ν‚€λ§ˆ)λŠ” μœ μ§€λ©λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜ λΆˆκ°€λŠ₯: TRUNCATEλŠ” λ‘€λ°± λΆˆκ°€ν•©λ‹ˆλ‹€. νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λ”λΌλ„ 볡ꡬ할 수 μ—†μŠ΅λ‹ˆλ‹€.
  • μ œμ•½ 쑰건: WHERE μ ˆμ„ μ‚¬μš©ν•  수 μ—†μœΌλ©°, λͺ¨λ“  데이터λ₯Ό ν•œ λ²ˆμ— μ‚­μ œν•©λ‹ˆλ‹€.
  • 속도: DELETE보닀 훨씬 λΉ λ₯΄κ²Œ 데이터λ₯Ό μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ°μ΄ν„°μ˜ κ°œλ³„ μ‚­μ œκ°€ μ•„λ‹Œ ν…Œμ΄λΈ” μ΄ˆκΈ°ν™” 방식이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ˜ˆμ‹œ

TRUNCATE TABLE employees;
  • κ²°κ³Ό: employees ν…Œμ΄λΈ”μ˜ λͺ¨λ“  데이터가 μ‚­μ œλ˜μ§€λ§Œ, ν…Œμ΄λΈ” κ΅¬μ‘°λŠ” κ·ΈλŒ€λ‘œ μœ μ§€λ©λ‹ˆλ‹€.

3. DROP

  • κΈ°λŠ₯: ν…Œμ΄λΈ” 자체λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€. λ°μ΄ν„°λΏλ§Œ μ•„λ‹ˆλΌ ν…Œμ΄λΈ”μ˜ ꡬ쑰와 μ œμ•½ μ‘°κ±΄κΉŒμ§€ λͺ¨λ‘ μ‚­μ œλ©λ‹ˆλ‹€.
  • μ‚¬μš© 방식: ν…Œμ΄λΈ”μ„ μ™„μ „νžˆ μ œκ±°ν•˜λ©°, 이λ₯Ό λ³΅κ΅¬ν•˜λ €λ©΄ ν…Œμ΄λΈ”μ„ μƒˆλ‘œ 생성해야 ν•©λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜ λΆˆκ°€λŠ₯: DROP μ—­μ‹œ λ‘€λ°± λΆˆκ°€ν•©λ‹ˆλ‹€. ν…Œμ΄λΈ”μ΄ μ‚­μ œλ˜λ©΄ 볡ꡬ할 수 μ—†μŠ΅λ‹ˆλ‹€.
  • μ œμ•½ 쑰건: ν…Œμ΄λΈ”λΏλ§Œ μ•„λ‹ˆλΌ 인덱슀, μ œμ•½ 쑰건, 트리거 λ“± ν•΄λ‹Ή ν…Œμ΄λΈ”κ³Ό μ—°κ΄€λœ λͺ¨λ“  객체가 ν•¨κ»˜ μ‚­μ œλ©λ‹ˆλ‹€.
  • 속도: ν…Œμ΄λΈ” 자체λ₯Ό μ‚­μ œν•˜λ―€λ‘œ 맀우 λΉ λ¦…λ‹ˆλ‹€.

μ˜ˆμ‹œ

DROP TABLE employees;
  • κ²°κ³Ό: employees ν…Œμ΄λΈ” μžμ²΄κ°€ μ‚­μ œλ˜λ©°, ν…Œμ΄λΈ”κ³Ό κ΄€λ ¨λœ λͺ¨λ“  데이터와 ꡬ쑰가 μ‚¬λΌμ§‘λ‹ˆλ‹€.

πŸ” DELETE, TRUNCATE, DROP 차이 μš”μ•½

λͺ…λ Ήμ–΄μ‚­μ œ λ²”μœ„λ‘€λ°± κ°€λŠ₯μ„±WHERE μ‚¬μš©μ†λ„ν…Œμ΄λΈ” ꡬ쑰 μœ μ§€
DELETE쑰건에 λ”°λ₯Έ ν–‰ μ‚­μ œκ°€λŠ₯κ°€λŠ₯λŠλ¦Όμœ μ§€
TRUNCATEν…Œμ΄λΈ”μ˜ λͺ¨λ“  ν–‰ μ‚­μ œλΆˆκ°€λŠ₯λΆˆκ°€λŠ₯λΉ λ¦„μœ μ§€
DROPν…Œμ΄λΈ” 전체 μ‚­μ œλΆˆκ°€λŠ₯λΆˆκ°€λŠ₯맀우 λΉ λ¦„μ‚­μ œ

이 차이λ₯Ό μ΄ν•΄ν•˜λ©΄ 데이터 μ‚­μ œ μ‹œ λͺ©μ μ— λ§žλŠ” λͺ…λ Ήμ–΄λ₯Ό μ„ νƒν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€! 😊


πŸ›‘οΈ DCL (Data Control Language): 데이터 μ œμ–΄μ–΄

DCL은 λ°μ΄ν„°λ² μ΄μŠ€ 객체에 λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ΄λ‚˜ CRUD κΆŒν•œμ„ μ •μ˜ν•˜λŠ” λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 νŠΉμ • μ‚¬μš©μžμ—κ²Œ ν…Œμ΄λΈ”μ˜ 검색 κΆŒν•œμ„ λΆ€μ—¬ν•˜κ±°λ‚˜, κΈˆμ§€ν•  수 μžˆμ–΄μš”. πŸ‘₯πŸ”’

μ£Όμš” λͺ…λ Ήμ–΄

  • GRANT: λ°μ΄ν„°λ² μ΄μŠ€ 객체에 κΆŒν•œμ„ λΆ€μ—¬
  • REVOKE: λ°μ΄ν„°λ² μ΄μŠ€ 객체에 λΆ€μ—¬λœ κΆŒν•œμ„ μ·¨μ†Œ

μ˜ˆμ‹œ

  • μ‚¬μš©μžμ—κ²Œ ν…Œμ΄λΈ” 쑰회 κΆŒν•œ λΆ€μ—¬
GRANT SELECT ON table_name TO user_name;
  • μ‚¬μš©μžμ—κ²Œ λΆ€μ—¬λœ ν…Œμ΄λΈ” 쑰회 κΆŒν•œ μ·¨μ†Œ
REVOKE SELECT ON table_name FROM user_name;

πŸ”„ TCL (Transaction Control Language): νŠΈλžœμž­μ…˜ μ œμ–΄μ–΄

TCL은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ νŠΈλžœμž­μ…˜(Transaction)을 μ œμ–΄ν•˜λŠ” λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 논리적 μ—°μ‚° λ‹¨μœ„λ‘œ, μ—¬λŸ¬ 쿼리가 ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άμ—¬ 처리될 수 μžˆμ–΄μš”. πŸ’ΌπŸ”„

μ£Όμš” λͺ…λ Ήμ–΄

  • COMMIT: μ‹€ν–‰ν•œ 쿼리λ₯Ό μ΅œμ’…μ μœΌλ‘œ 적용
  • ROLLBACK: μ‹€ν–‰ν•œ 쿼리λ₯Ό λ§ˆμ§€λ§‰ COMMIT μ „μœΌλ‘œ μ·¨μ†Œν•˜μ—¬ 데이터λ₯Ό 볡ꡬ

μ˜ˆμ‹œ

  • λ³€κ²½λœ 데이터λ₯Ό μ΅œμ’…μ μœΌλ‘œ 적용
COMMIT;
  • λ³€κ²½λœ 데이터λ₯Ό μ·¨μ†Œν•˜κ³  λ§ˆμ§€λ§‰ COMMIT μ „μœΌλ‘œ 볡ꡬ
ROLLBACK;

πŸ› οΈ MySQL νŠΈλžœμž­μ…˜ (Transaction)

  • νŠΈλžœμž­μ…˜: λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™”μ‹œν‚€λŠ” μž‘μ—… λ‹¨μœ„λ₯Ό μ˜λ―Έν•΄μš”. πŸ’Ό
    • INSERT, UPDATE, DELETE λ“±μ˜ DML은 λ³€κ²½λœ 데이터가 λ°”λ‘œ ν•˜λ“œλ””μŠ€ν¬μ— λ°˜μ˜λ˜μ§€ μ•Šκ³ , λ©”λͺ¨λ¦¬μ—μ„œ μž‘μ—…μ΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
    • COMMIT λͺ…λ Ήμ–΄κ°€ μ‹€ν–‰λ˜κΈ° μ „κΉŒμ§€λŠ” λͺ¨λ“  μž‘μ—…μ΄ νŠΈλžœμž­μ…˜μ— ν¬ν•¨λ©λ‹ˆλ‹€.
    • DDLλ¬Έ(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 νŠΈλžœμž­μ…˜μ˜ λŒ€μƒμ΄ μ•„λ‹ˆμ—μš”. ❌

πŸ“œ νŠΈλžœμž­μ…˜ κ΄€λ ¨ 도ꡬ

  • START TRANSACTION: COMMIT λ˜λŠ” ROLLBACK이 λ‚˜μ˜¬ λ•ŒκΉŒμ§€ νŠΈλžœμž­μ…˜μ˜ μ‹œμž‘μ„ μ•Œλ¦½λ‹ˆλ‹€.
  • COMMIT: νŠΈλžœμž­μ…˜μ„ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•˜κ³  λ³€κ²½ 사항을 DB에 μ μš©ν•©λ‹ˆλ‹€. βœ…
  • ROLLBACK: νŠΈλžœμž­μ…˜μ„ μ‹€νŒ¨λ‘œ μ²˜λ¦¬ν•˜κ³ , νŠΈλžœμž­μ…˜ μ‹œμž‘ μ „ μƒνƒœλ‘œ λ˜λŒλ¦½λ‹ˆλ‹€. πŸ”„
  • SAVEPOINT: SAVEPOINTλ₯Ό μ„€μ •ν•˜λ©΄ ROLLBACK μ‹œ ν•΄λ‹Ή μ§€μ μœΌλ‘œ 볡원이 κ°€λŠ₯ν•©λ‹ˆλ‹€. πŸ’Ύ

βš™οΈ MySQL의 κΈ°λ³Έ μ„€μ •

  • MySQLμ—μ„œλŠ” 기본적으둜 autocommit이 ν™œμ„±ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. πŸ”„
    • νŠΈλžœμž­μ…˜μ΄ μžλ™μœΌλ‘œ COMMIT되기 λ•Œλ¬Έμ—, 이λ₯Ό μˆ˜λ™μœΌλ‘œ μ„€μ •ν•˜κ±°λ‚˜ ν•΄μ œν•  수 μžˆμ–΄μš”.

확인:

SELECT @@AUTOCOMMIT;
  • κ²°κ³Ό: 1일 경우 autocommit ν™œμ„±ν™”, 0일 경우 λΉ„ν™œμ„±ν™”

λ³€κ²½:

SET AUTOCOMMIT = 1; -- autocommit ν™œμ„±ν™”
SET AUTOCOMMIT = 0; -- autocommit λΉ„ν™œμ„±ν™”

πŸ’» MySQL νŠΈλžœμž­μ…˜ μ˜ˆμ‹œ

ν…Œμ΄λΈ” 생성:

USE ssafydb;

CREATE TABLE tc_test
(
  val VARCHAR(10)
);

νŠΈλžœμž­μ…˜ μ˜ˆμ‹œ 1: ROLLBACK

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;
  • ROLLBACK λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΈλžœμž­μ…˜ λ‚΄μ˜ λͺ¨λ“  λ³€κ²½ 사항이 μ·¨μ†Œλ©λ‹ˆλ‹€. πŸ”„

νŠΈλžœμž­μ…˜ μ˜ˆμ‹œ 2: COMMIT

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;
  • COMMIT λͺ…λ Ήμ–΄λ‘œ λ³€κ²½ 사항이 μ΅œμ’…μ μœΌλ‘œ DB에 μ €μž₯λ©λ‹ˆλ‹€. βœ…

νŠΈλžœμž­μ…˜ μ˜ˆμ‹œ 3: SAVEPOINT

START TRANSACTION;

INSERT INTO tc_test VALUES ('a');
INSERT INTO tc_test VALUES ('b');
INSERT INTO tc_test VALUES ('c');

SAVEPOINT f1;
  • SAVEPOINTλŠ” νŠΉμ • μ‹œμ μœΌλ‘œ νŠΈλžœμž­μ…˜μ„ 되돌릴 수 μžˆλ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€. πŸ’Ύ

νŠΈλžœμž­μ…˜ μ˜ˆμ‹œ 4: ROLLBACK TO SAVEPOINT

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;
  • ROLLBACK TO SAVEPOINTλ₯Ό μ‚¬μš©ν•˜λ©΄ μ§€μ •ν•œ SAVEPOINT μ‹œμ μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€. πŸ”„

πŸ”— SET μ—°μ‚°μž (SET Operator)

  • λͺ¨λ“  집합 μ—°μ‚°μžλŠ” λ™μΌν•œ μš°μ„  μˆœμœ„λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.
  • SELECT μ ˆμ— μžˆλŠ” 컬럼의 κ°œμˆ˜μ™€ νƒ€μž…μ΄ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
SELECT * FROM customers UNION SELECT * FROM products; -- error λ°œμƒ

πŸ› οΈ SET μ—°μ‚°μžμ˜ μ’…λ₯˜

  • UNION: 두 μΏΌλ¦¬μ—μ„œ μ„ νƒλœ λͺ¨λ“  행을 λ°˜ν™˜ν•˜μ§€λ§Œ, μ€‘λ³΅λœ 행은 μ œκ±°λ©λ‹ˆλ‹€.
  • UNION ALL: 두 μΏΌλ¦¬μ—μ„œ μ„ νƒλœ λͺ¨λ“  행을 λ°˜ν™˜ν•˜λ©°, μ€‘λ³΅λœ 행도 ν¬ν•¨λ©λ‹ˆλ‹€.
  • INTERSECT: 두 μΏΌλ¦¬μ—μ„œ μ„ νƒλœ μ€‘λ³΅λœ ν–‰λ§Œ λ°˜ν™˜λ©λ‹ˆλ‹€. (MySQLμ—μ„œλŠ” μ§€μ›λ˜μ§€ μ•ŠμŒ)
  • MINUS: 첫 번째 μΏΌλ¦¬μ—μ„œ μ„ νƒλœ ν–‰ 쀑 두 번째 쿼리에 μ—†λŠ” ν–‰λ§Œ λ°˜ν™˜λ©λ‹ˆλ‹€. (MySQLμ—μ„œλŠ” μ§€μ›λ˜μ§€ μ•ŠμŒ)

πŸ“ UNION & UNION ALL μ˜ˆμ‹œ

κΈ°λ³Έ μ˜ˆμ‹œ

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 μ§€μ›λ˜μ§€ μ•ŠμŒ)

  • 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;

0개의 λŒ“κΈ€