[DB] Relational Database, SQL

seunghyunΒ·2023λ…„ 3μ›” 6일
0

πŸ’»

λͺ©λ‘ 보기
13/15

Intoroduction

  • ν…Œμ΄λΈ” μΈμŠ€ν„΄μŠ€λŠ” λ ˆμ½”λ“œλ“€μ˜ 집합 μ΄λ―€λ‘œ

    • λ ˆμ½”λ“œ κ°„μ˜ μˆœμ„œ, λ ˆμ½”λ“œ λ‚΄ ν•„λ“œμ˜ μˆœμ„œλŠ” μ˜λ―Έκ°€ μ—†λ‹€.
  • 차수 (degree) : ν…Œμ΄λΈ” μŠ€ν‚€λ§ˆμ— μ •μ˜λœ ν•„λ“œμ˜ 수

  • 도메인 : 각 ν•„λ“œμ— μž…λ ₯ κ°€λŠ₯ν•œ κ°’λ“€μ˜ λ²”μœ„, 즉 각 ν•„λ“œκ°€ κ°€μ§ˆ 수 μžˆλŠ” λͺ¨λ“  κ°’λ“€μ˜ 집합

  • 기수 (cardinality) : λ ˆμ½”λ“œ 수

  • λͺ¨λ“  ν•„λ“œλŠ” 더 이상 λΆ„λ¦¬λ˜μ§€ μ•ŠλŠ” κ°’, 즉 μ›μžκ°’ (atomic value) 을 가진닀.

  • 2개 μ΄μƒμ˜ ν•„λ“œλ‘œ κ΅¬μ„±λœ ν‚€λ₯Ό 볡합킀라 ν•œλ‹€.

  • μ™Έλž˜ν‚€ : λ‹€λ₯Έ ν…Œμ΄λΈ”μ˜ κΈ°λ³Έ ν‚€λ₯Ό μ°Έμ‘°ν•˜λŠ” ν•„λ“œμ§‘ν•©


관계 λŒ€μˆ˜ (Relational Algebra)

κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œμ˜ λŒ€ν‘œμ  μ§ˆμ˜μ–΄

βœ”οΈ 절차적 μ–Έμ–΄

βœ”οΈ μˆ˜ν•™μ—μ„œμ˜ μˆ˜μ‹κ΅¬μ‘°μ™€ μœ μ‚¬

  • ν”Όμ—°μ‚°μž(operand) : ν…Œμ΄λΈ”
  • μ—°μ‚°μž(operator)
    • 단항 μ—°μ‚°μž(unary operator)
    • 이항 μ—°μ‚°μž(binary operator)

μ—°μ‚°μ˜ μ’…λ₯˜

βœ”οΈ κΈ°λ³Έ μ—°μ‚°

  • 선택 μ—°μ‚° : κ΅ν™˜ 법칙이 μ„±λ¦½ν•œλ‹€.
  • μΆ”μΆœ μ—°μ‚°
  • 재λͺ…λͺ… μ—°μ‚° : ν…Œμ΄λΈ”μ— 이름을 λΆ€μ—¬ν•˜κ±°λ‚˜ λ³€κ²½ν•˜λŠ” μ—°μ‚°. 단, 본래 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 ν…Œμ΄λΈ”λͺ…κΉŒμ§€ λ³€κ²½λ˜λŠ” 것은 μ•„λ‹ˆλ‹€.
  • 집합 μ—°μ‚° : ν˜Έν™˜κ°€λŠ₯ν•˜λ €λ©΄ (compatible) 같은 μ΄λ¦„μ˜ ν•„λ“œλ“€μ΄λΌ ν•˜λ”λΌλ„ 도메인이 μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.
  • μΉ΄ν‹°μ…˜ ν”„λ‘œλ•νŠΈ : 두 개의 ν…Œμ΄λΈ”μ—μ„œ 각각의 λ ˆμ½”λ“œλ“€μ„ μ„œλ‘œ κ²°ν•©ν•˜μ—¬ ν•˜λ‚˜μ˜ λ ˆμ½”λ“œλ‘œ κ΅¬μ„±ν•˜λ©΄μ„œ κ°€λŠ₯ν•œ λͺ¨λ“  μ‘°ν•©μ˜ λ ˆμ½”λ“œλ“€λ‘œ ν…Œμ΄λΈ”μ„ 생성

βœ”οΈ μΆ”κ°€μ—°μ‚°

  • 쑰인 (theta join)

    • 두 ν…Œμ΄λΈ”λ‘œ λΆ€ν„° νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” λ ˆμ½”λ“œλ“€μ„ ν•˜λ‚˜μ˜ λ ˆμ½”λ“œλ‘œ κ²°ν•©ν•˜λŠ” μ—°μ‚°
    • μΉ΄ν‹°μ…˜ ν”„λ‘œλ•νŠΈλŠ” λͺ¨λ“  κ°€λŠ₯ν•œ 쑰합에 μ˜ν•΄ λ ˆμ½”λ“œλ“€μ„ μƒμ„±ν•˜μ§€λ§Œ 쑰인은 νŠΉμ • 쑰건은 λ§Œμ‘±ν•˜λŠ” λ ˆμ½”λ“œλ§Œμ„ 선택
    • 세타(theta: Θ) 쑰인이라고도 함
  • μžμ—° 쑰인 (natural join)

  • μ™ΈλΆ€ 쑰인 (outer join)

  • 지정 μ—°μ‚° (assignment)

  • (λ‚˜λˆ„κΈ° μ—°μ‚°)


SQL

πŸ’‘ Structed Query Language

  • κ΄€κ³„ν˜• μ§ˆμ˜μ–Έμ–΄
  • κ΄€κ³„λŒ€μˆ˜λ‚˜ 관계해석은 ν™•μ‹€ν•œ 이둠적 배경을 μ œκ³΅ν•˜λ‚˜ μƒμš©μœΌλ‘œ μ“°μ΄κΈ°μ—λŠ” μ–΄λ ΅κ³  적절치 μ•ŠμŒ
  • SQL은 μžμ—°μ–΄μ™€ μœ μ‚¬ν•˜κ³  λΉ„μ ˆμ°¨μ  μ–Έμ–΄μ΄λ―€λ‘œ μ‚¬μš©ν•˜κΈ° μš©μ΄ν•¨

βœ”οΈ SQL은 크게 DDLκ³Ό DML둜 ꡬ성됨

  • 데이터 μ •μ˜ μ–Έμ–΄ (DDL: Data Definition Language)
    • 데이터 μ €μž₯ ꡬ쑰λ₯Ό λͺ…μ‹œν•˜λŠ” μ–Έμ–΄
    • ν…Œμ΄λΈ” μŠ€ν‚€λ§ˆμ˜ μ •μ˜, μˆ˜μ •, μ‚­μ œ
  • 데이터 μ‘°μž‘ μ–Έμ–΄ (DML: Data Manipulation Language)
    • μ‚¬μš©μžκ°€ 데이터λ₯Ό μ ‘κ·Όν•˜κ³  μ‘°μž‘ν•  수 있게 ν•˜λŠ” μ–Έμ–΄
    • λ ˆμ½”λ“œμ˜ 검색(search), μ‚½μž…(insert), μ‚­μ œ(delete), μˆ˜μ •(update)

βœ”οΈ 데이터 μ •μ˜ μ–Έμ–΄ DDL

  • ν…Œμ΄λΈ” 생성 (create table)
    • μ•„λž˜ μ˜ˆμ‹œ 사진 μ°Έκ³ 
  • κΈ°λ³Έν‚€, μ™Έλž˜ν‚€ μ„€μ •
    • μ•„λž˜ μ˜ˆμ‹œ 사진 μ°Έκ³ 
    • ⛔️ μ™Έλž˜ν‚€λ₯Ό ν•„λ“œλ‘œ κ°–λŠ” ν…Œμ΄λΈ”μ„ 생성할 λ•Œ μ™Έλž˜ν‚€κ°€ μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ„ λ¨Όμ € 생성해야함
    • ⛔️ dept ν…Œμ΄λΈ”μ„ μ‚­μ œν•˜λ €λ©΄ member ν…Œμ΄λΈ”μ„ λ¨Όμ € μ‚­μ œν•˜λ˜μ§€, μ™Έλž˜ν‚€λ₯Ό ν•΄μ œν•΄μ•Όν•¨
    • μ™Έλž˜ν‚€ ν•΄μ œλŠ” μ•„λž˜μ—μ„œ μžμ„Ένžˆ λ‹€λ£Έ
  • ν…Œμ΄λΈ” μ‚­μ œ (drop table)
    • drop table <ν…Œμ΄λΈ”μ΄λ¦„>
    • ⛔️ λ‹€λ₯Έ ν…Œμ΄λΈ”μ—μ„œ μ™Έλž˜ν‚€λ‘œ μ°Έμ‘°λ˜λŠ” κ²½μš°μ—λŠ” μ‚­μ œν•  수 μ—†μŒ
      • class ν…Œμ΄λΈ”μ€ takes ν…Œμ΄λΈ”μ—μ„œ μ™Έλž˜ν‚€λ‘œ 참쑰됨. takes ν…Œμ΄λΈ”μ„ μ‚­μ œν•˜κΈ° μ „μ—λŠ” class ν…Œμ΄λΈ”μ„ μ‚­μ œν•  수 μ—†μŒ
  • ν…Œμ΄λΈ” μˆ˜μ • (alter table)
    • alter table <ν…Œμ΄λΈ”μ΄λ¦„> add <μΆ”κ°€ν• ν•„λ“œ>
    • ex) alter table student add age int;

βœ”οΈ ν•„λ“œμ˜ Data type μ’…λ₯˜

βœ”οΈ 데이터 μ‘°μž‘ μ–Έμ–΄ DML

  • λ ˆμ½”λ“œ μ‚½μž…
    • insert into <ν…Œμ΄λΈ”μ΄λ¦„> (<ν•„λ“œλ¦¬μŠ€νŠΈ>) values (<κ°’λ¦¬μŠ€νŠΈ>)
    • ex) insert into department (dept_id, dept_name, office) values ('920', '컴퓨터곡학과', '201호');
    • ⛔️ μ™Έλž˜ν‚€λ‘œ μ‚¬μš©λ˜λŠ” ν•„λ“œμ— λŒ€ν•΄ 데이터λ₯Ό μ‚½μž…ν•  λ•Œ μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ˜ ν•΄λ‹Ή ν•„λ“œμ— κ·Έ 값을 λ¨Όμ € μ‚½μž…ν•΄μ•Όν•¨
  • λ ˆμ½”λ“œ μˆ˜μ •
    • update <ν…Œμ΄λΈ”μ΄λ¦„> set <μˆ˜μ •λ‚΄μ—­> where <쑰건>
    • ex) update professor set position='κ΅μˆ˜β€˜, dept_id='923' where name='κ³ ν¬μ„β€˜
    • ex) update student set year = year + 1
    • ⛔️ μ™Έλž˜ν‚€λ‘œ μ‚¬μš©λ˜λŠ” ν•„λ“œμ˜ 값을 μˆ˜μ •ν•  λ•Œ μ™Έλž˜ν‚€κ°€ μ°Έμ‘°ν•˜λŠ” ν…Œμ΄λΈ”μ— μ‚½μž…λ˜μ–΄ μžˆλŠ” κ°’μœΌλ‘œλ§Œ μˆ˜μ •μ΄ κ°€λŠ₯
  • λ ˆμ½”λ“œ μ‚­μ œ
    • delete from <ν…Œμ΄λΈ”μ΄λ¦„> where <쑰건>
    • delete from professor where name='κΉ€νƒœμ„'
    • ⛔️ μ™Έλž˜ν‚€λ‘œ μ°Έμ‘°λ˜λŠ” ν•„λ“œλ₯Ό 가지고 μžˆλŠ” ν…Œμ΄λΈ”μ—μ„œ λ ˆμ½”λ“œλ₯Ό μ‚­μ œν•  κ²½μš°μ—λ„ 였λ₯˜κ°€ λ°œμƒν•  수 있음
  • λ ˆμ½”λ“œ 검색 🌟
    • SQLμ—μ„œ κ°€μž₯ 많이 μ‚¬μš©ν•˜κ³ , μ€‘μš”ν•˜λ©°, λ³΅μž‘ν•¨
    • μ•„λž˜μ—μ„œ λ””ν…ŒμΌμ„ λ‹€λ£Έ
    • μ’…λ₯˜
      • κΈ°λ³Έ ꡬ쑰
      • 재λͺ…λͺ… μ—°μ‚°
      • LIKE μ—°μ‚°μž
      • 집합 μ—°μ‚°
      • 외뢀쑰인
      • 집계 ν•¨μˆ˜
      • λ„μ˜ 처리
      • 쀑첩 질의

μ˜ˆμ‹œ

βœ”οΈ ν…Œμ΄λΈ” 생성, κΈ°λ³Έν‚€, μ™Έλž˜ν‚€ μ„€μ •

λ ˆμ½”λ“œ 검색 🌟

기본 ꡬ쑰

  • select <ν•„λ“œλ¦¬μŠ€νŠΈ> from <ν…Œμ΄λΈ”λ¦¬μŠ€νŠΈ> where <쑰건>
  • fromμ ˆμ— λ‚˜μ—΄λœ department ν…Œμ΄λΈ”κ³Ό student ν…Œμ΄λΈ”μ„ μΉ΄ν‹°μ…˜ ν”„λ‘œλ•νŠΈ
  • whereμ ˆμ— μ§€μ •λœ 쑰건식을 λ§Œμ‘±ν•˜λŠ” λ ˆμ½”λ“œλ§Œ 선택
  • ex)
    select name, dept_name
    from department, student
    where department.dept_id = student.dept_id
  • μ€‘λ³΅λœ λ ˆμ½”λ“œλ₯Ό μ œκ±°ν•˜κ³  κ²€μƒ‰ν•˜λ €λ©΄ distinct λ₯Ό μ‚¬μš©
  • from μ ˆμ— λ‚˜νƒ€λ‚œ ν…Œμ΄λΈ”μ—μ„œ λͺ¨λ“  ν•„λ“œμ˜ 값을 μΆ”μΆœν•  κ²½μš°μ—λŠ” select μ ˆμ— λͺ¨λ“  ν•„λ“œλ₯Ό λͺ…μ‹œν•  ν•„μš” 없이 * λ₯Ό μ‚¬μš©
  • 검색 κ²°κ³Όλ₯Ό μ •λ ¬ν•˜μ—¬ 좜λ ₯ν•˜λŠ” κΈ°λŠ₯
    • selectλ¬Έ 맨 λ§ˆμ§€λ§‰μ— λ‹€μŒκ³Ό 같은 order by μ ˆμ„ μΆ”κ°€
    • μ˜€λ¦„μ°¨μˆœμ„ 기본으둜 ν•˜λ©° <ν•„λ“œλ¦¬μŠ€νŠΈ>에 μ—¬λŸ¬ 개의 ν•„λ“œλ₯Ό λ‚˜μ—΄ν•  경우 λ‚˜μ—΄λœ μˆœμ„œλŒ€λ‘œ μ •λ ¬
    • ex) student ν…Œμ΄λΈ”μ—μ„œ 3, 4ν•™λ…„ ν•™μƒλ“€μ˜ 이름과 ν•™λ²ˆμ„ 검색
    • λ‚΄λ¦Όμ°¨μˆœμ€ ν•΄λ‹Ή ν•„λ“œ 이름 뒀에 desc λΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ‚½μž…

재λͺ…λͺ… μ—°μ‚°

μ‹€μ œ ν…Œμ΄λΈ” 이름이 μˆ˜μ •λ˜κ±°λ‚˜ ν•„λ“œ 이름이 λ°”λ€ŒλŠ” 것이 μ•„λ‹˜!
질의λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ³Όμ • λ™μ•ˆλ§Œ μΌμ‹œμ μœΌλ‘œ μ‚¬μš©.
ν‘œν˜„μ΄ λ‹¨μˆœν™”ν•˜κ±°λ‚˜, 동일 이름이 μ‘΄μž¬ν•  κ²½μš°μ— μ‚¬μš©

  • ex) student ν…Œμ΄λΈ”μ—μ„œ β€˜κΉ€κ΄‘μ‹β€™ 학생과 μ£Όμ†Œκ°€ 같은 ν•™μƒλ“€μ˜ 이름과 μ£Όμ†Œλ₯Ό 검색
    select s2.name
    from student s1, student s2
    where s1.address = s2.address and s1.name = '김광식'
  • ν•„λ“œμ˜ 재λͺ…λͺ…
    • ex) κ΅μˆ˜λ“€μ˜ 이름과 μ§μœ„, μž¬μ§μ—°μˆ˜λ₯Ό 좜λ ₯

LIKE μ—°μ‚°μž

λ¬Έμžμ—΄μ— λŒ€ν•΄μ„œλŠ” μΌλΆ€λΆ„λ§Œ μΌμΉ˜ν•˜λŠ” 경우λ₯Ό μ°Ύμ•„μ•Ό ν•  λ•Œ μ‚¬μš©.
<ν•„λ“œμ΄λ¦„>에 μ§€μ •λœ <λ¬Έμžμ—΄νŒ¨ν„΄>이 λ“€μ–΄ μžˆλŠ”μ§€λ₯Ό νŒλ‹¨.

  • where <ν•„λ“œμ΄λ¦„> like <λ¬Έμžμ—΄νŒ¨ν„΄>

  • = μ—°μ‚°μž λŒ€μ‹ μ— like μ—°μ‚°μžλ₯Ό μ΄μš©ν•¨ (= λŠ” μ •ν™•νžˆ μΌμΉ˜ν•˜λŠ” κ²½μš°μ—λ§Œ μ‚¬μš©)

  • λ¬Έμžμ—΄ νŒ¨ν„΄μ˜ μ’…λ₯˜

  • ex) student ν…Œμ΄λΈ”μ—μ„œ μ—¬ν•™μƒλ“€λ§Œμ„ 검색

집합 μ—°μ‚°

κ΄€κ³„λŒ€μˆ˜μ˜ 집합 연산인 합집합, ꡐ집합, 차집합에 ν•΄λ‹Ήν•˜λŠ” μ—°μ‚°μž

  • 합집합 union

    • 쀑볡을 μ œκ±°ν•˜κ³  싢지 μ•Šλ‹€λ©΄ union μ—°μ‚°μž λŒ€μ‹  union all μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€.
    • ex) student ν…Œμ΄λΈ”κ³Ό professor ν…Œμ΄λΈ”μ—μ„œ ν•™κ³Όλ²ˆν˜Έλ₯Ό 쀑볡을 ν—ˆμš©ν•˜μ—¬ 좜λ ₯
  • ꡐ집합 intersect

    • ex) β€˜μ»΄ν“¨ν„°κ³΅ν•™κ³Όβ€™μ— λ‹€λ‹ˆλŠ” ν•™μƒλ“€μ˜ ν•™λ²ˆκ³Ό takes ν…Œμ΄λΈ”μ—μ„œ 학점이 'A+'인 ν•™μƒλ“€μ˜ ν•™λ²ˆμ˜ ꡐ집합
  • 차집합 minus

    • 산업곡학과 학생듀 μ€‘μ—μ„œ ν•œλ²ˆμ΄λΌλ„ 'A+'λ₯Ό 받지 λͺ»ν•œ ν•™μƒλ“€μ˜ ν•™λ²ˆμ„ 검색

외뢀쑰인 outer join

πŸ’­ β€˜μ΄μ‚°μˆ˜ν•™β€™, β€˜κ°μ²΄μ§€ν–₯언어’ ꡐ과λͺ©λ“€μ€ class ν…Œμ΄λΈ”μ— μ €μž₯λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 검색 결과에 ν¬ν•¨λ˜μ§€ λͺ»ν•œλ‹€. 이럴 λ•Œ μ•„λž˜μ˜ 쑰인을 ν•΄μ£Όλ©΄ 각각 μ–΄λ–€ 결과듀이 λ‚˜μ˜¬κΉŒ?

  • μ™Όμͺ½ 외뢀쑰인 left outer join
    • μ—°μ‚°μžμ˜ μ™Όμͺ½μ— μœ„μΉ˜ν•œ ν…Œμ΄λΈ”μ˜ 각 λ ˆμ½”λ“œμ— λŒ€ν•΄μ„œ 였λ₯Έμͺ½ ν…Œμ΄λΈ”μ— 쑰인 쑰건에 λΆ€ν•©ν•˜λŠ” λ ˆμ½”λ“œκ°€ 없을 κ²½μš°μ—λ„ 검색 결과에 포함
    • μƒμ„±λ˜λŠ” κ²°κ³Ό λ ˆμ½”λ“œμ—μ„œ 였λ₯Έμͺ½ ν…Œμ΄λΈ”μ˜ λ‚˜λ¨Έμ§€ ν•„λ“œμ—λŠ” 널이 μ‚½μž…
  • 였λ₯Έμͺ½ 외뢀쑰인 right outer join
  • μ™„μ „ 외뢀쑰인 full outer join
    • μ–‘μͺ½ ν…Œμ΄λΈ”μ—μ„œ μ„œλ‘œ μΌμΉ˜ν•˜λŠ” λ ˆμ½”λ“œκ°€ 없을 경우, ν•΄λ‹Ή λ ˆμ½”λ“œλ“€λ„ κ²°κ³Ό ν…Œμ΄λΈ”μ— ν¬ν•¨μ‹œν‚€λ©° λ‚˜λ¨Έμ§€ ν•„λ“œμ— λŒ€ν•΄μ„œλŠ” λͺ¨λ‘ 널을 μ‚½μž…

집계 ν•¨μˆ˜ aggregate function

톡계연산 κΈ°λŠ₯ 제곡.
SELECT 절과 HAVING 절 (뒀에 μ„€λͺ…) μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯.
sum, avgλŠ” μˆ«μžν˜• ν…Œμ΄ν„° νƒ€μž…μ„ κ°–λŠ” ν•„λ“œμ—λ§Œ μ μš©κ°€λŠ₯.

  • count : λ°μ΄ν„°μ˜ 개수λ₯Ό κ΅¬ν•œλ‹€.

    • ex) student ν…Œμ΄λΈ”μ—μ„œ 3ν•™λ…„ 학생이 λͺ‡ λͺ…인지 좜λ ₯

    • ex) student ν…Œμ΄λΈ”μ—μ„œ dept_id ν•„λ“œμ— 값이 λͺ‡ κ°œμΈμ§€λ₯Ό 좜λ ₯

    • distinct ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ€‘λ³΅λ˜λŠ” 데이터λ₯Ό μ œμ™Έν•œ 개수λ₯Ό 리턴

      • ex) count(dept_id) λŒ€μ‹  count(distinct dept_id) λ₯Ό μ‚¬μš©
    • μ»΄ν“¨ν„°κ³΅ν•™κ³Όμ˜ 학생 수λ₯Ό 좜λ ₯

  • sum : λ°μ΄ν„°μ˜ 합을 κ΅¬ν•œλ‹€.

    • ex) 전체 κ΅μˆ˜λ“€μ˜ μž¬μ§μ—°μˆ˜ ν•©
  • avg : λ°μ΄ν„°μ˜ 평균 값을 κ΅¬ν•œλ‹€.

    • ex) 전체 ꡐ수의 평균 μž¬μ§μ—°μˆ˜λ₯Ό 좜λ ₯
  • max : λ°μ΄ν„°μ˜ μ΅œλŒ€ 값을 κ΅¬ν•œλ‹€.

  • min : λ°μ΄ν„°μ˜ μ΅œμ†Œ 값을 κ΅¬ν•œλ‹€.

    • ex) λΆ€μ„œ 이름이 β€˜ACCOUNTING' 인 직원듀 μ€‘μ—μ„œ μ΅œλŒ€ κΈ‰μ—¬κ°€ μ–Όλ§ˆμΈμ§€ 좜λ ₯

✚) Group by

  • ⛔️ select μ ˆμ— 집계 ν•¨μˆ˜κ°€ μ‚¬μš©λ  경우 λ‹€λ₯Έ ν•„λ“œλŠ” select μ ˆμ— μ‚¬μš©ν•  μˆ˜κ°€ μ—†μŒ.

    • κ·Έλž˜μ„œ λ‹€μŒ μ§ˆμ˜λŠ” 였λ₯˜
  • μ§€κΈˆκΉŒμ§€μ˜ SQL은 전체 λ ˆμ½”λ“œλ“€μ„ λŒ€μƒμœΌλ‘œ 평균, ν•©, μ΅œλŒ€κ°’/μ΅œμ†Œκ°’ λ§Œμ„ 좜λ ₯.
    GROUP BYλ₯Ό μ΄μš©ν•˜λ©΄ κ·Έλ£Ήλ³„λ‘œ μ§‘κ³„ν•¨μˆ˜ 적용 κ°€λŠ₯! (예: ν•™κ³Όλ³„ν•™μƒμˆ˜,λΆ€μ„œλ³„μ΅œλŒ€κΈ‰β€™)

    • ex) student ν…Œμ΄λΈ”μ—μ„œ ν•™κ³Όλ²ˆν˜Έ (dept_id ν•„λ“œ) λ³„λ‘œ λ ˆμ½”λ“œμ˜ 개수λ₯Ό 좜λ ₯
      • group by μ ˆμ— μ‚¬μš©λœ ν•„λ“œλ₯Ό select μ ˆμ— μΆ”κ°€ν•˜μ—¬ μ‚¬μš©ν•  수 있음
    • ex) ν•™κ³Όλ²ˆν˜Έ λŒ€μ‹  department ν…Œμ΄λΈ”κ³Ό μ‘°μΈν•˜μ—¬ ν•™κ³Ό 이름이 좜λ ₯λ˜λ„λ‘ μœ„ 질의λ₯Ό μˆ˜μ • (ν•™κ³Όλ³„ν•™μƒμˆ˜)
    • ex) emp, dept ν…Œμ΄λΈ”μ—μ„œ λΆ€μ„œλ³„ μ§μ›μˆ˜, 평균급여, μ΅œλŒ€κΈ‰μ—¬, μ΅œμ†ŒκΈ‰μ—¬ λ₯Ό 좜λ ₯
    • ex) 학사 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 학과별 ꡐ수 μˆ«μžμ™€ 평균 μž¬μ§μ—°μˆ˜, μ΅œλŒ€ μž¬μ§μ—°μˆ˜λ₯Ό 좜λ ₯

✚) Having

  • 그룹에 λŒ€ν•œ 쑰건을 λͺ…μ‹œν•  λ•Œ μ‚¬μš©

  • ex) 평균 μž¬μ§μ—°μˆ˜κ°€ 10λ…„ 이상인 학과에 λŒ€ν•΄μ„œλ§Œ ꡐ수 μˆ«μžμ™€ 평균 μž¬μ§μ—°μˆ˜, μ΅œλŒ€ μž¬μ§μ—°μˆ˜λ₯Ό 좜λ ₯

  • λ‹€μŒμ€ 였λ₯˜ ⛔️

    • ⛔️ Group 에 λŒ€ν•œ 쑰건은 where μ ˆμ— μ‚¬μš©ν•˜μ§€ λͺ»ν•¨.

    • having μ ˆμ„ μ΄μš©ν•΄μ•Ό 함

  • ex) having μ ˆμ„ μ΄μš©ν•˜μ—¬ λ‹€μ‹œ μž‘μ„±

  • ex) 직원 μˆ«μžκ°€ 5λͺ… 이상인 λΆ€μ„œμ— λŒ€ν•΄μ„œ λΆ€μ„œλ³„ μ§μ›μˆ˜, 평균급여, μ΅œλŒ€κΈ‰μ—¬, μ΅œμ†ŒκΈ‰μ—¬λ₯Ό 좜λ ₯

πŸ’‘ where 절과 having 절, group by μ ˆμ„ λͺ¨λ‘ ν•¨κ»˜ μ‚¬μš©ν•  경우
1. where μ ˆμ— λͺ…μ‹œλœ 쑰건을 λ§Œμ‘±ν•˜λŠ” λ ˆμ½”λ“œλ“€μ„ 검색
2. group by μ ˆμ— λͺ…μ‹œλœ ν•„λ“œμ˜ 값이 μ„œλ‘œ μΌμΉ˜ν•˜λŠ” λ ˆμ½”λ“œλ“€ 끼리 그룹을 지어 집계 ν•¨μˆ˜λ₯Ό 적용
3. λ§ˆμ§€λ§‰μœΌλ‘œ κ·Έ 집계 ν•¨μˆ˜λ₯Ό μ μš©ν•œ κ²°κ³Όλ“€ μ€‘μ—μ„œ having μ ˆμ„ λ§Œμ‘±ν•˜λŠ” 결과만 κ³¨λΌμ„œ 좜λ ₯

NULL 의 처리

널을 κ²€μƒ‰ν•˜λŠ” 방법

  • <ν•„λ“œμ΄λ¦„> is null
  • <ν•„λ“œμ΄λ¦„> is not null
  • ex) takes ν…Œμ΄λΈ”μ—μ„œ 아직 학점이 λΆ€μ—¬λ˜μ§€ μ•Šμ€ ν•™μƒμ˜ ν•™λ²ˆμ„ 검색

    • select stu_id
      from takes
      where grade is null
  • ex) takes ν…Œμ΄λΈ”μ—μ„œ 학점이 'A+'κ°€ μ•„λ‹Œ ν•™μƒλ“€μ˜ ν•™λ²ˆμ„ 검색

    • select stu_id
      from takes
      where grade <> 'A+'
    • grade ν•„λ“œμ˜ 값이 널인 λ ˆμ½”λ“œμ— λŒ€ν•΄μ„œλŠ” 질의 결과에 ν¬ν•¨λ˜μ§€ μ•ŠμŒ
    • πŸ’‘ ν•˜μ§€λ§Œ count(*) λŠ” νŠΉμ • ν•„λ“œκ°€ μ•„λ‹Œ λ ˆμ½”λ“œ 전체에 λŒ€ν•œ μ—°μ‚°μ΄λ―€λ‘œ λ„μ˜ 쑴재 μ—¬λΆ€μ™€λŠ” 무관함

쀑첩 질의 nested query

in, not in

  • SQL문을 λ‹€λ₯Έ SQLλ¬Έ μ•ˆμ— μ€‘μ²©ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 질의

  • λΆ€μ§ˆμ˜λŠ” μ™ΈλΆ€μ§ˆμ˜μ˜ from μ ˆμ΄λ‚˜ where μ ˆμ— μœ„μΉ˜

  • ex) '301호' κ°•μ˜μ‹€μ—μ„œ κ°œμ„€λœ κ°•μ’Œμ˜ κ³Όλͺ©λͺ… 을 좜λ ₯

    • μœ„ μ§ˆμ˜λŠ” μ•„λž˜ μ§ˆμ˜μ™€ μ˜λ―Έκ°€ κ°™λ‹€.

    • λΆ€ 질의 : ν‚€μ›Œλ“œ in 뒀에 λ‚˜μ˜€λŠ” SQLλ¬ΈμœΌλ‘œμ„œ class ν…Œμ΄λΈ”μ—μ„œ κ°•μ˜μ‹€μ΄ '301호'인 ꡐ과λͺ© 번호λ₯Ό
      검색

    • μ™ΈλΆ€ 질의 : course ν…Œμ΄λΈ”μ—μ„œ course_id ν•„λ“œμ˜ 값이 λΆ€ 질의의 검색 결과에 ν¬ν•¨λ˜λŠ” 경우(in)μ—λ§Œ κ³Όλͺ©λͺ…을 좜λ ₯

  • ex) 2012λ…„ 2학기에 κ°œμ„€λ˜μ§€ μ•Šμ€ κ³Όλͺ©λͺ…을 검색

some, all

  • some= : μ§€μ •λœ ν•„λ“œμ˜ 값이 λΆ€μ§ˆμ˜ 검색결과에 μ‘΄μž¬ν•˜λŠ” μž„μ˜μ˜ κ°’κ³Ό 같은지λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ μ‚¬μš© (in κ³Ό 같은 의미)

  • <=some : λΆ€μ§ˆμ˜μ˜ 검색결과에 μ‘΄μž¬ν•˜λŠ” μž„μ˜μ˜ 값보닀 μž‘κ±°λ‚˜ 같은지λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ μ‚¬μš©

  • =all : μ§€μ •λœ ν•„λ“œμ˜ 값이 λΆ€μ§ˆμ˜ 검색결과에 ν¬ν•¨λœ λͺ¨λ“  κ°’κ³Ό 같은지λ₯Ό νŒλ‹¨

  • <=all : μ§€μ •λœ ν•„λ“œμ˜ 값이 λΆ€μ§ˆμ˜ 검색결과에 ν¬ν•¨λœ λͺ¨λ“  값보닀 μž‘κ±°λ‚˜ 같은지λ₯Ό νŒλ‹¨

  • ex) κ°€μž₯ λ§Žμ€ μˆ˜κ°•μΈμ›μ„ 가진 κ°•μ’Œλ₯Ό 검색

exits, not exists

λΆ€μ§ˆμ˜ 검색결과에 μ΅œμ†Œν•œ ν•˜λ‚˜ μ΄μƒμ˜ λ ˆμ½”λ“œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€μ˜ μ—¬λΆ€λ₯Ό ν‘œν˜„

  • exits : μ΅œμ†Œν•œ ν•œκ°œμ˜ λ ˆμ½”λ“œκ°€ μ‘΄μž¬ν•˜λ©΄ 참이 되고 그렇지 μ•ŠμœΌλ©΄ 거짓

  • not exits : λΆ€μ§ˆμ˜μ˜ 결과에 λ ˆμ½”λ“œκ°€ ν•˜λ‚˜λ„ μ—†μœΌλ©΄ 참이 되고 ν•˜λ‚˜λΌλ„ μ‘΄μž¬ν•˜λ©΄ 거짓

  • ex) '301호' κ°•μ˜μ‹€μ—μ„œ κ°œμ„€λœ κ°•μ’Œμ˜ κ³Όλͺ©λͺ…을 좜λ ₯

  • ex) 2012λ…„ 2학기에 κ°œμ„€λ˜μ§€ μ•Šμ€ κ³Όλͺ©λͺ…을 검색

λ·° View

  • κΈ°μ‘΄ ν…Œμ΄λΈ”λ“€λ‘œλΆ€ν„° μƒμ„±λ˜λŠ” κ°€μƒμ˜ ν…Œμ΄λΈ”

  • ν…Œμ΄λΈ”μ²˜λŸΌ 물리적으둜 μƒμ„±λ˜λŠ” 것이 μ•„λ‹ˆλΌ, 기쑴의 ν…Œμ΄λΈ”λ“€μ„ μ‘°ν•©ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ μ‹€μ œλ‘œ μ‘΄μž¬ν•˜λŠ” ν…Œμ΄λΈ”μΈ κ²ƒμ²˜λŸΌ 보이게 함

  • πŸ’‘ νŠΉμ • μ‚¬μš©μžμ—κ²Œ ν…Œμ΄λΈ”μ˜ λ‚΄μš© 쀑 일뢀λ₯Ό 숨길 수 있기 λ•Œλ¬Έμ— λ³΄μ•ˆμ˜ 효과

  • πŸ’‘ λ³΅μž‘ν•œ 질의의 κ²°κ³Όλ₯Ό 뷰둜 λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜κ²Œ 되면 질의λ₯Ό κ°„λ‹¨νžˆ ν‘œν˜„ν•  수 있음

βœ”οΈ λ·° 생성

μƒμ„±λœ λ·°λŠ” ν…Œμ΄λΈ”κ³Ό λ™λ“±ν•˜κ²Œ μ‚¬μš©
create or replace view <뷰이름> as <selectλ¬Έ>

  • or replace ν‚€μ›Œλ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ <뷰이름>κ³Ό 같은 λ·°κ°€ 이미 μ‘΄μž¬ν•˜λŠ” 경우 기쑴의 λ·°λ₯Ό μ§€μš°κ³  μƒˆλ‘œ 생성

  • λ·° 생성에 μ‚¬μš©λ  selectλ¬Έ

  • λŒ€λΆ€λΆ„μ˜ DBMS μ—μ„œλŠ” μ‚¬μš©μž κ³„μ •μ—λŠ” λ·° 생성 κΆŒν•œμ΄ λΆ€μ—¬λ˜μ§€ μ•ŠμŒ

    • κ΄€λ¦¬μž 계정이 μ•„λ‹Œ μ‚¬μš©μž κ³„μ •μœΌλ‘œ λ‘œκ·ΈμΈν•˜μ—¬ λ·°λ₯Ό μƒμ„±ν•˜λ €λ©΄ λ·° 생성과 κ΄€λ ¨λœ κΆŒν•œμ΄ λΆ€μ—¬λ˜μ–΄μ•Ό 함
    • μ˜€λΌν΄μ—μ„œ λ·° 생성 κΆŒν•œμ„ λΆ€μ—¬ν•˜κΈ° μœ„ν•œ ν˜•μ‹
      • grant create view to <μ‚¬μš©μž 계정>
  • ex) takes ν…Œμ΄λΈ”μ—μ„œ grade ν•„λ“œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ ν•„λ“œλ§ŒμœΌλ‘œ κ΅¬μ„±λœ λ·° λ₯Ό 생성

  • ex) student ν…Œμ΄λΈ”μ—μ„œ 컴퓨터곡학과 학생듀 λ ˆμ½”λ“œλ§Œ μΆ”μΆœν•˜μ—¬ cs_student λ·°λ₯Ό 생성

βœ”οΈ λ·° μ‚¬μš©

  • ex) v_takes 뷰에 λŒ€ν•΄ select문을 μ‹€ν–‰

  • ex) 뷰에 λŒ€ν•΄μ„œ insert, update, delete문을 μ‹€ν–‰

    • v_takes 뷰에 ν¬ν•¨λ˜μ§€ μ•Šμ€ grade ν•„λ“œμ—λŠ” 널이 μ‚½μž…
  • 읽기 μ „μš© λ·°

    • λ·°λ₯Ό 생성할 λ•Œ insert, update, deleteλ¬Έκ³Ό 같은 데이터 μ‘°μž‘ μ–Έμ–΄μ˜ μ‚¬μš©μ„ λΆˆκ°€λŠ₯ν•˜κ²Œ ν•˜λ €λ©΄,
      with read only ν‚€μ›Œλ“œλ₯Ό μΆ”κ°€

βœ”οΈ λ·° μ‚­μ œ

  • drop view <뷰이름>

πŸ“š Reference

<λ°μ΄ν„°λ² μ΄μŠ€μ˜ 이해> (좜판:μ΄ν•œλ―Έλ””μ–΄) 의 λ‚΄μš©μ„ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.
잘λͺ»λœ λ‚΄μš©μ΄ μžˆλ‹€λ©΄ λŒ“κΈ€λ‘œ μ•Œλ €μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€ 😊

0개의 λŒ“κΈ€