와 였늘 μˆ˜μ—…μ€ μ–΄λ””μ„œ κ²€μƒ‰λ§Œ 해봀지, μ‹€μ œλ‘œλŠ” 처음 κ³΅λΆ€ν•΄λ³΄λŠ” λΆ€λΆ„μ΄μ—ˆλ‹€. 정말 SQLμ—λŠ” λ§Žμ€ κΈ°λŠ₯이 있고 λ‚˜λŠ” 기본적인 κ²ƒλ“€λ§Œ 겨우 μ‚¬μš©ν•˜κ³  μžˆμ—ˆκ΅¬λ‚˜... 배울수둝 μ‹ κΈ°ν•˜κ³  μž¬λ°ŒλŠ” 게 λ§Žμ€ 것 κ°™λ‹€. μ „λΆ€λ₯Ό μƒ…μƒ…νžˆ μ •λ¦¬ν•˜μ§„ λͺ»ν•˜κ² μ§€λ§Œ λ‚΄κ°€ 보기에 μ€‘μš”ν•œ 것듀 μœ„μ£Όλ‘œ ν•œ 번 정리λ₯Ό ν•΄λ΄€λ‹€!

πŸ›’οΈ λ‚΄μž₯ν•¨μˆ˜

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³  μ‘°μž‘ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 미리 μ •μ˜λœ ν•¨μˆ˜
β†’ λ‚΄μž₯ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ MySQL 엔진이 μ•Œμ•„μ„œ ν•΄μ€Œ

νŠΉμ„±

  • λ‹€μ–‘μ„±
  • νš¨μœ¨μ„±
  • 닀쀑 κΈ°λŠ₯
  • NULL 처리
  • 볡합 μ‚¬μš© κ°€λŠ₯

λ¬Έμžμ—΄ ν•¨μˆ˜, μˆ˜ν•™ ν•¨μˆ˜, λ‚ μ§œ/μ‹œκ°„ ν•¨μˆ˜, 집계 ν•¨μˆ˜, λ³€ν™˜ ν•¨μˆ˜ 등이 μžˆλ‹€.


πŸ›’οΈ μ €μž₯ ν”„λ‘œμ‹œμ €

Stored Procedure, MySQLμ—μ„œ 미리 μž‘μ„±λœ SQL 쿼리의 집합

μ—¬λŸ¬ SQL 문을 ν•˜λ‚˜μ˜ λ£¨ν‹΄μœΌλ‘œ κ²°ν•©ν•˜μ—¬, 반볡적인 μž‘μ—…μ„ μ‰½κ²Œ μ²˜λ¦¬ν•˜κ³  μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ λ†’μ΄λŠ”λ° μœ μš©ν•¨

호좜되면 μ¦‰μ‹œ μ‹€ν–‰, λ³΅μž‘ν•œ μž‘μ—…μ„ μžλ™ν™”ν•˜λŠ”λ° 자주 μ‚¬μš©

ꡬ성 λ‚΄μ—­

  • Client: μ‚¬μš©μžκ°€ μ €μž₯ ν”„λ‘œμ‹œμ €λ₯Ό ν˜ΈμΆœν•˜λŠ” ν™˜κ²½ (ex. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜, CLI λ“±)

  • MySQL μ„œλ²„: μ €μž₯ ν”„λ‘œμ‹œμ €κ°€ μ‹€ν–‰λ˜λŠ”

  • DBMS.μ €μž₯ ν”„λ‘œμ‹œμ €: 미리 μ •μ˜λœ SQL μž‘μ—… 블둝

  • λ°μ΄ν„°λ² μ΄μŠ€: μ €μž₯ ν”„λ‘œμ‹œμ €κ°€ μƒν˜Έμž‘μš©λŠ” 데이터 μ €μž₯μ†Œ

Client β†’ MySQL μ„œλ²„ β†’ μ €μž₯ ν”„λ‘œμ‹œμ € β†’ λ°μ΄ν„°λ² μ΄μŠ€

μ €μž₯ ν”„λ‘œμ‹œμ €μ˜ νŠΉμ§•

  • μž¬μ‚¬μš©μ„±
  • μ„±λŠ₯ μ΅œμ ν™” : SQL이 미리 μ»΄νŒŒμΌλ˜λ―€λ‘œ 닀쀑 호좜 μ‹œ μ„±λŠ₯ ν–₯상 효과
  • λ³΄μ•ˆ : λ³΄μž‘ν•œ μž‘μ—…μ„ 숨겨 λ³΄μ•ˆμ„±μ„ 높이고, κΆŒν•œ μ œμ–΄ κ°„νŽΈν™”
  • νŠΈλžœμž­μ…˜ 처리 : νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ‚¬μš©λ  수 있으며, λ³΅μž‘ν•œ νŠΈλžœμž­μ…˜ λ‘œμ§μ„ μΊ‘μŠν™”
  • μž…λ ₯ 및 좜λ ₯ λ§€κ°œλ³€μˆ˜ : μž…λ ₯값을 λ°›μ•„ μ²˜λ¦¬ν•  수 있고, κ²°κ³Όλ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€

ν‚€μ›Œλ“œ ꡬ뢄
DELIMITER //

  • κ΅¬λΆ„μžλ₯Ό //둜 λ³€κ²½ β†’ ν”„λ‘œμ‹œμ € λ‚΄μ—μ„œ μ‚¬μš©λœ ; ꡬ문과 ν˜Όλ™λ˜μ§€ μ•Šλ„λ‘ μ„€μ •
  • μ—¬λŸ¬ SQL문을 ν•˜λ‚˜λ‘œ λ¬Άμ–΄ μ²˜λ¦¬ν•  수 있게 함
  • κ·Έλž˜μ„œ ν”„λ‘œμ‹œμ €λ‚˜ 트리거λ₯Ό μ‚¬μš©ν•  λ•Œ 자주 μ‚¬μš©ν•˜κ²Œ λœλ‹€!

CREATE PROCEDURE

  • μ €μž₯ ν”„λ‘œμ‹œμ € 생성(μ •μ˜)

IN

  • μ €μž₯ ν”„λ‘œμ‹œμ €λ‘œ 값을 받을 λ•Œ IN ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό μ •μ˜ν•˜κ³ , 데이터 νƒ€μž…μ„ μ •μ˜ν•œλ‹€.

BEGIN ... END

  • μ—¬λŸ¬ 개의 SQL문을 ν•˜λ‚˜μ˜ λΈ”λ‘μœΌλ‘œ λ¬ΆλŠ” 데 μ‚¬μš©
  • μ €μž₯ ν”„λ‘œμ‹œμ € λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” λͺ¨λ“  SQL문이 이 μ•ˆμ— μž‘μ„±λ˜μ–΄μ•Ό ν•œλ‹€!

END //

  • μ €μž₯ ν”„λ‘œμ‹œμ € SQL 블둝이 λλ‚¬μŒμ„ λ‚˜νƒ€λƒ„ (μ €μž₯ ν”„λ‘œμ‹œμ € μž‘μ—… μ’…λ£Œ)

DELIITER ;

  • κ΅¬λΆ„μžλ₯Ό λ‹€μ‹œ κΈ°λ³Έ 값인 ;둜 λ˜λŒλ¦¬λŠ” λͺ…λ Ή
  • 이후에 μž‘μ„±λ  λ‹€λ₯Έ SQL문을 μ •μƒμ μœΌλ‘œ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄μ„œ λ‹€μ‹œ κ΅¬λΆ„μžλ₯Ό λŒλ €λ‘μ–΄μ•Ό ν•œλ‹€

μ €μž₯ ν”„λ‘œμ‹œμ € 호좜/μ‚­μ œ
CALL / DROP PROCEDURE IF EXISTS

  • IF EXISTS ꡬ문을 ν†΅ν•΄μ„œ ν•΄λ‹Ή ν”„λ‘œμ‹œμ €κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό λ°©μ§€ν•œλ‹€

μ €μž₯ ν”„λ‘œμ‹œμ € 적용 λΆ„μ•Ό

  • 데이터 뢄석 - λ³΅μž‘ν•œ 데이터 뢄석 μž‘μ—…μ„ μ €μž₯ ν”„λ‘œμ‹œμ €λ‘œ 미리 μ •μ˜ν•΄λ‘μ–΄ 반볡적으둜 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€
  • λ°μ΄ν„°λ² μ΄μŠ€ μœ μ§€ 관리 - 데이터 λ°±μ—…, 볡원, 정리 μž‘μ—…μ„ μ €μž₯ ν”„λ‘œμ‹œμ €λ‘œ κ΄€λ¦¬ν•˜μ—¬ 일관성 μœ μ§€
  • νŠΈλžœμž­μ…˜ 처리 - μ—¬λŸ¬ SQL μž‘μ—…μ„ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άμ–΄μ„œ μ €μž₯ ν”„λ‘œμ‹œμ €λ‘œ μ²˜λ¦¬ν•˜λ©΄ 효율적이며 일관성 μžˆλŠ” 데이터 처리 κ°€λŠ₯

πŸ”« 트리거

λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ—μ„œ 데이터가 μ‚½μž…, κ°±μ‹  λ˜λŠ” μ‚­μ œ 될 λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” SQL μ½”λ“œ 블둝

데이터 무결성 μœ μ§€, 이벀트 기반의 μžλ™ν™”λœ μž‘μ—… μˆ˜ν–‰

데이터가 변동될 λ•Œ νŠΉμ • κ·œμΉ™μ„ κ°•μ œν•˜κ±°λ‚˜ μΆ”κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ”λ° μ‚¬μš©

트리거 μ‹€ν–‰ μ‹œμ 
BEFORE : 데이터 μž‘μ—… μ „
AFTER : 데이터 μž‘μ—… ν›„

트리거 μœ ν˜•

  • INSERT 트리거 : ν…Œμ΄λΈ”μ— μƒˆλ‘œμš΄ 행이 좔가될 λ•Œ μ‹€ν–‰
  • UPDATE 트리거 : κΈ°μ‘΄ 데이터가 μˆ˜μ •λ  λ•Œ μ‹€ν–‰
  • DELETE 트리거 : 데이터가 μ‚­μ œλ  λ•Œ μ‹€ν–‰

μ£Όμš” κΈ°λŠ₯ 및 νŠΉμ§•

  • 데이터 무결성 μœ μ§€
  • μžλ™ν™”
  • 이벀트 기반 처리
  • 볡합 둜직 κ΅¬ν˜„ κ°€λŠ₯
  • 계측적 트리거 호좜

트리거 생성 β†’ 이벀트 λ°œμƒ(INSERT/UPDATE/DELETE) β†’ BEFORE / AFTER 트리거 μ‹€ν–‰ β†’ SQL μ‹€ν–‰ (데이터 처리, 둜그 기둝 λ“±)

CREATE TRIGGER 트리거_이름
[BEFORE|AFTER] [INSERT|UPDATE|DELETE]
ON ν…Œμ΄λΈ”_이름
FOR EACH ROW
BEGIN 
	-- 데이터 λ™μž‘ μ •μ˜
END;

πŸ›’οΈ νŠΈλžœμž­μ…˜

ν•˜λ‚˜μ˜ μž‘μ—… λ‹¨μœ„λ‘œ, μ—¬λŸ¬ SQL 쿼리듀이 ν•œ λ²ˆμ— μ‹€ν–‰λ˜μ–΄μ•Ό ν•  λ•Œ μ‚¬μš©

β†’ 데이터 무결성을 μœ μ§€ν•˜κΈ° μœ„ν•¨

ACID μ€€μˆ˜

  • Atommicity (μ›μžμ„±) : νŠΈλžœμž­μ…˜ λ‚΄μ˜ λͺ¨λ“  μž‘μ—…μ΄ λͺ¨λ‘ μ„±κ³΅ν•˜κ±°λ‚˜ λͺ¨λ‘ μ‹€νŒ¨
  • Consistency (일관성) : νŠΈλžœμž­μ…˜ 전후에 데이터 무결성 보μž₯
  • Isolation (격리성) : 각각의 νŠΈλžœμž­μ…˜μ΄ λ…λ¦½μ μœΌλ‘œ 처리
  • Durability (지속성) : νŠΈλžœμž­μ…˜ μ„±κ³΅ν•˜λ©΄ κ·Έ κ²°κ³Όκ°€ 영ꡬ적으둜 μœ μ§€

κΈ°λŠ₯
COMMIT - νŠΈλžœμž­μ…˜μ—μ„œ λ°œμƒν•œ λͺ¨λ“  λ³€κ²½ 사항을 영ꡬ적으둜 μ €μž₯

ROLLBACK - 영ꡬ적으둜 μ·¨μ†Œ

SAVEPOINT - νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ νŠΉμ • μ‹œμ μœΌλ‘œ λŒμ•„κ°€κΈ° μœ„ν•΄ μ„€μ •

ISOLATION LEVEL - νŠΈλžœμž­μ…˜κ°„μ˜ μƒν˜Έμž‘μš© 정도 μ œμ–΄

START TRANSACTION β†’ COMMIT | ROLLBACK

μ£Όμ˜μ‚¬ν•­

  • νŠΈλžœμž­μ…˜μ΄ 길어지면 λ°μ΄ν„°λ² μ΄μŠ€ 락이 걸릴 수 μžˆλ‹€!
  • λ°˜λ“œμ‹œ ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ‚¬μš©ν•΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 것이 μ€‘μš”

πŸ›’οΈ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜ 생성

User-Defined Function, MySQLμ—μ„œ μ‚¬μš©μžκ°€ 직접 μ •μ˜ν•œ ν•¨μˆ˜

λ‚΄μž₯ ν•¨μˆ˜κ°€ μ œκ³΅ν•˜μ§€ μ•ŠλŠ” νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©μžκ°€ 직접 SQL μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ ν•¨μˆ˜λ‘œ 등둝할 수 μžˆλ‹€! β†’ μ½”λ“œ μž¬μ‚¬μš© κ°€λŠ₯, λ³΅μž‘ν•œ 쿼리 논리λ₯Ό ν•¨μˆ˜λ‘œ μΊ‘μŠν™”ν•  수 μžˆλ‹€

CREATE FUNCTION ν•¨μˆ˜_이름 (μž…λ ₯κ°’ λ°μ΄ν„°νƒ€μž…, ...)
	RETURNS κ²°κ³Όκ°’λ°μ΄ν„°νƒ€μž…
BEGIN
	DECLARE μž„μ‹œκ°’ λ°μ΄ν„°νƒ€μž…;
    SET μž„μ‹œκ°’ = μž…λ ₯κ°’;
    -- ν•¨μˆ˜ λ‚΄μš© 
    RETURN κ²°κ³Όκ°’;
END;

-- ν•¨μˆ˜ μ‚­μ œ
DROP FUNCTION ν•¨μˆ˜_이름;

νŠΉμ§•

  • μž¬μ‚¬μš©μ„±
  • μΊ‘μŠν™” : μ½”λ“œ κ°„μ†Œν™”
  • 인수 전달 : 0개 μ΄μƒμ˜ 인수λ₯Ό λ°›μ•„ μ²˜λ¦¬ν•  수 μžˆλ‹€
  • κ°’ λ°˜ν™˜
  • μ„±λŠ₯ : 미리 컴파일되기 λ•Œλ¬Έμ— μ„±λŠ₯ μ΅œμ ν™”μ— 유리, μœ μ§€ λ³΄μˆ˜μ—λ„ μœ λ¦¬ν•˜λ‹€
  • νŠΉμ • μž‘μ—… μžλ™ν™”
  • 데이터 검증 및 λ³€ν™˜ (ex. 이메일 μ£Όμ†Œ ν˜•μ‹ 검증)

πŸ™„ λŠλ‚€μ 

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ§ŒνΌμ€ μ•„λ‹ˆμ§€λ§Œ, sqlμ—μ„œλ„ μΈμžκ°’μ„ λ°›κ³ , λ¦¬ν„΄ν•˜λŠ” μ‹μ˜ ν‘œν˜„μ΄ λœλ‹€λ‹ˆ!!!! μ—¬κΈ°λŠ” 깊게 κ³΅λΆ€ν•΄λ΄€λ˜ 적이 μ—†λ˜ λΆ„μ•ΌλΌμ„œ 처음 μ•Œμ•˜κ³  μ‹ κΈ°ν–ˆλ‹€. ν˜„μ—… ν•˜λ©΄μ„œ 'μ•„ μΏΌλ¦¬μ—μ„œλŠ” λ°”λ‘œ μ–΄λ–»κ²Œ μ•ˆ λ˜λ‚˜?' κΆκΈˆν•˜κΈ°λ§Œ ν–ˆμ§€ μ°Ύμ•„λ³Ό 생각은 μ•ˆν–ˆμ—ˆμŒ γ…Žγ…Ž ν•˜μ§€λ§Œ μžˆκ΅¬λ‚˜... 이미 μžˆμ—ˆκ΅¬λ‚˜... λ‚΄κ°€ μƒκ°ν•œ 것 = 이미 μ²œμž¬λ“€μ΄ μƒκ°ν•˜κ³  ν•΄κ²°μ±…κΉŒμ§€ λ‚΄λ†“μŒ γ…Žγ…Ž

μ•”νŠΌ νŠΈλ¦¬κ±°λž‘ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λŠ” μ•Œμ•„λ‘λ©΄ 정말정말 νŽΈν•˜κ²Œ μ“Έ 것 κ°™λ‹€λŠ” 생각을 ν–ˆλ‹€. μ €μž₯ ν”„λ‘œμ‹œμ €λ„ 잘 μ“Έ 쀄 μ•Œμ•„μ•Όκ² λ‹€. 맀우맀우맀우 많이 μ‚¬μš©ν•˜λŠ” 문법을 배운 것 같은 λŠλ‚Œ~ μž¬λ°Œμ—ˆλ‹€.


λ³Έ ν¬μŠ€νŒ…μ€ κΈ€λ‘œλ²Œμ†Œν”„νŠΈμ›¨μ–΄μΊ νΌμŠ€μ™€ ꡐ보DTSκ°€ ν•¨κ»˜ μ§„ν–‰ν•˜λŠ” μ±Œλ¦°μ§€μž…λ‹ˆλ‹€

profile
영차영차 😎

0개의 λŒ“κΈ€