πŸ›’οΈDatabase

[Real MySQL 8.0] MySQL μ—°μ‚°μžμ™€ λ‚΄μž₯ν•¨μˆ˜

DevPoong 2023. 8. 8. 18:32

 

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 데이터λ₯Ό μ €μž₯ λ˜λŠ” μ‘°νšŒν•˜κΈ° μœ„ν•΄ DB와 톡신할 λ•Œ DB μ„œλ²„λ‘œ μ „λ‹¬λ˜λŠ” 것은 SQL 뿐이닀.
SQL은 μ–΄λ– ν•œ(What) 데이터λ₯Ό μš”μ²­ν•˜κΈ° μœ„ν•œ 언어이지, μ–΄λ–»κ²Œ(How) 데이터λ₯Ό 읽을지λ₯Ό ν‘œν˜„ν•˜λŠ” μ–Έμ–΄λŠ” μ•„λ‹ˆλ―€λ‘œ μžλ°”μ™€ 같은 언어와 λΉ„κ΅ν–ˆμ„ λ•Œ μ œν•œμ μœΌλ‘œ 느껴질 수 μžˆλ‹€.

κ·Έλž˜μ„œ 쿼리가 λΉ λ₯΄κ²Œ μˆ˜ν–‰λ˜κ²Œ ν•˜λ €λ©΄ DB μ„œλ²„μ—μ„œ 쿼리가 μ–΄λ–»κ²Œ μš”μ²­μ„ μ²˜λ¦¬ν• μ§€ μ˜ˆμΈ‘ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό νŠœλ‹ν•΄μ„œ μ„±λŠ₯을 κ°œμ„ ν•œλ‹€λŠ” 것은 쉽지 μ•Šμ§€λ§Œ, DBMSμ—μ„œλŠ” λͺ‡μ‹­ λͺ‡λ°± 배의 μ„±λŠ₯ νŠœλ‹μ€ ν”ν•œ 일이닀.
λ”°λΌμ„œ SQL μž‘μ„± λ°©λ²•μ΄λ‚˜ κ·œμΉ™μ€ λ¬Όλ‘ , 내뢀적인 처리 방식(μ˜΅ν‹°λ§ˆμ΄μ €)에 λŒ€ν•΄ 곡뢀해야 ν•œλ‹€.

 

1. MySQL μ—°μ‚°μž

(1) λ‚ μ§œ

λ‹€λ₯Έ DBMSμ—μ„œ λ‚ μ§œ νƒ€μž…μ„ λΉ„κ΅ν•˜κ±°λ‚˜ INSERTν•˜λ €λ©΄ λ¬Έμžμ—΄μ„ DATE νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” μ½”λ“œκ°€ ν•„μš”ν•˜λ‹€.
ν•˜μ§€λ§Œ MySQLμ—μ„œλŠ” 정해진 ν˜•νƒœμ˜ λ‚ μ§œ 포맷으둜 ν‘œκΈ°ν•˜λ©΄ MySQL μ„œλ²„κ°€ μžλ™μœΌλ‘œ DATEλ‚˜ DATETIME κ°’μœΌλ‘œ λ³€ν™˜ν•˜κΈ° λ•Œλ¬Έμ— λ³΅μž‘ν•˜κ²Œ STR_TO_DATE() 같은 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

(2) λΆˆλ¦¬μ–Έ

BOOLμ΄λ‚˜ BOOLEANμ΄λΌλŠ” νƒ€μž…μ΄ μžˆμ§€λ§Œ 사싀 TINYINT νƒ€μž…μ— λŒ€ν•œ λ™μ˜μ–΄μΌ 뿐이닀.
BOOL νƒ€μž…μœΌλ‘œ μ»¬λŸΌμ„ 생성해도 κ²°κ΅­μ—λŠ” TINYINT둜 λͺ…μ‹œλ˜μ–΄ μžˆλ‹€.

λ˜ν•œ, MySQL은 C/C++ μ–Έμ–΄μ—μ„œμ²˜λŸΌ TRUE λ˜λŠ” FALSE 같은 λΆˆλ¦¬μ–Έ 값을 1κ³Ό 0 μ •μˆ˜λ‘œ λ§€ν•‘ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

(3) 동등( Equal ) 비ꡐ( =, <=> )

λ‹€λ₯Έ DBMS와 λ§ˆμ°¬κ°€μ§€λ‘œ "=" 기호λ₯Ό μ‚¬μš©ν•΄μ„œ 비ꡐλ₯Ό μˆ˜ν–‰ν•  수 μžˆλ‹€.
κ·Έ 외에도 MySQL은 NULL 값에 λŒ€ν•œ λΉ„κ΅κΉŒμ§€ μˆ˜ν–‰ν•  수 μžˆλŠ” "<=>" NULL-Safe 비ꡐ μ—°μ‚°μžλ„ μ œκ³΅ν•œλ‹€.

(4) λΆ€μ •( Not-Equal ) 비ꡐ( <>, != )

같지 μ•ŠμŒμ„ λΉ„κ΅ν•˜κΈ° μœ„ν•œ μ—°μ‚°μžλ‘œ "<>" λ₯Ό 일반적으둜 많이 μ‚¬μš©ν•œλ‹€.
λ˜ν•œ, "!=" μ—°μ‚°μžλ„ μ‚¬μš© κ°€λŠ₯ν•˜λ―€λ‘œ λ‘˜ 쀑에 ν•˜λ‚˜λ‘œ ν†΅μΌν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 게 가독성에 μ’‹λ‹€.

(5) AND(&&)와 OR(||) μ—°μ‚°μž

일반적으둜 DBMSμ—μ„œλŠ” λΆˆλ¦¬μ–Έ ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό κ²°ν•©ν•˜κΈ° μœ„ν•΄ ANDλ‚˜ OR을 μ‚¬μš©ν•œλ‹€.
MySQLμ—μ„œλŠ” ANDλŠ” "&&", OR은 "||" κ³Ό 같은 μ—°μ‚°μžλ‘œ λŒ€μ²΄ κ°€λŠ₯ν•˜λ‹€.
ν•˜μ§€λ§Œ, μ˜€λΌν΄μ—μ„œλŠ” "||"λ₯Ό λΆˆλ¦¬μ–Έ ν‘œν˜„μ‹μ˜ κ²°ν•© μ—°μ‚°μžκ°€ μ•„λ‹ˆλΌ λ¬Έμžμ—΄μ„ κ²°ν•©ν•˜λŠ” μ—°μ‚°μžλ‘œ μ‚¬μš©ν•œλ‹€.

λ”°λΌμ„œ, SQL 가독성을 높이기 μœ„ν•΄μ„œλŠ” λ‹€λ₯Έ μš©λ„λ‘œ μ‚¬μš© κ°€λŠ₯ν•œ "&&"와 "||"λŠ” μ‚¬μš©μ„ μžμ œν•˜λŠ” 것이 μ’‹λ‹€.

λ˜ν•œ, μ£Όμ˜ν•΄μ•Ό ν•  뢀뢄은 ANDκ°€ OR보닀 μ—°μ‚° μš°μ„ μˆœμœ„κ°€ λ†’λ‹€λŠ” 점이닀.

(6) λ‚˜λˆ„κΈ°( /, DIV )와 λ‚˜λ¨Έμ§€( %, MOD ) μ—°μ‚°μž

"/" μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ μ†Œμˆ˜μ κΉŒμ§€ λͺ«μ„ κ°€μ Έμ˜€κ³ , DIV μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ«μ˜ μ •μˆ˜ λΆ€λΆ„λ§Œ κ°€μ Έμ˜¨λ‹€.
λ‚˜λ¨Έμ§€λ₯Ό κ°€μ Έμ˜€λŠ” "%"와 MOD μ—°μ‚°μžλŠ” λ˜‘κ°™μ€ 좜λ ₯값을 가진닀.

(7) LIKE μ—°μ‚°μž

REGEXP μ—°μ‚°μžλŠ” 인덱슀λ₯Ό μ „ν˜€ μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€λŠ” 단점이 μžˆμ§€λ§Œ LIKEλŠ” 인덱슀λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.
LIKE μ—°μ‚°μžλŠ” μ •κ·œ ν‘œν˜„μ‹μ„ κ²€μ‚¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ–΄λ–€ μƒμˆ˜ λ¬Έμžμ—΄μ΄ μžˆλŠ”μ§€ μ—†λŠ”μ§€ 정도λ₯Ό νŒλ³„ν•˜λŠ” μ—°μ‚°μžλ‹€.
μ‚¬μš©ν•  수 μžˆλŠ” μ™€μΌλ“œ μΉ΄λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

  • %: 0 λ˜λŠ” 1개 μ΄μƒμ˜ λͺ¨λ“  λ¬Έμžμ— 일치(문자의 λ‚΄μš©κ³Ό 관계없이)
  • _: μ •ν™•νžˆ 1개의 λ¬Έμžμ— 일치(문자의 λ‚΄μš©κ³Ό 관계없이)

LIKE μ—°μ‚°μžλŠ” μ™€μΌλ“œμΉ΄λ“œ 문자인 "%", "_"κ°€ κ²€μƒ‰μ–΄μ˜ λ’€μͺ½μ— μžˆλ‹€λ©΄ 인덱슀 λ ˆμΈμ§€ μŠ€μΊ”μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ μ™€μΌλ“œμΉ΄λ“œκ°€ κ²€μƒ‰μ–΄μ˜ μ•žμͺ½μ— μžˆλ‹€λ©΄ 인덱슀 λ ˆμΈμ§€ μŠ€μΊ”μ„ μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

(8) BETWEEN μ—°μ‚°μž

ν¬κ±°λ‚˜ 같닀와 μž‘κ±°λ‚˜ κ°™λ‹€λŠ” 두 개의 μ—°μ‚°μžλ₯Ό ν•˜λ‚˜λ‘œ ν•©μΉœ μ—°μ‚°μžλ‹€.

ν•˜μ§€λ§Œ μ£Όμ˜ν•΄μ•Ό ν•  점이 μžˆλ‹€. μ•„λž˜μ—μ„œ μ‚΄νŽ΄λ³΄μž.

1. SELECT * FROM dept_emp WHERE dept_no='d003' AND emp_no=10001;

2. SELECT * FROM dept_emp WHERE dept_no BETWEEN 'd003' AND 'd005' AND emp_no=10001;

dept_emp ν…Œμ΄λΈ”μ—λŠ” (dept_no, emp_no) 컬럼으둜 κ΅¬μ„±λœ PKκ°€ μ‘΄μž¬ν•œλ‹€κ³  κ°€μ •ν•œλ‹€.
첫 번째 μΏΌλ¦¬λŠ” dept_no와 emp_no 쑰건 λͺ¨λ‘ 인덱슀λ₯Ό μ΄μš©ν•΄ λ²”μœ„λ₯Ό μ€„μ—¬μ£ΌλŠ” λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ, 두 번째 μΏΌλ¦¬μ—μ„œ μ‚¬μš©ν•œ BETWEEN μ—°μ‚°μž 같은 경우 λ²”μœ„λ₯Ό 읽어야 ν•˜λ―€λ‘œ 'd003'보닀 ν¬κ±°λ‚˜ κ°™κ³  'd005'보닀 μž‘κ±°λ‚˜ 같은 λͺ¨λ“  인덱슀 λ²”μœ„λ₯Ό κ²€μƒ‰ν•΄μ•Όλ§Œ ν•œλ‹€. μ—¬κΈ°μ„œ emp_no=10001의 쑰건은 비ꡐ λ²”μœ„λ₯Ό μ€„μ΄λŠ” 역할을 ν•˜μ§€ λͺ»ν•œλ‹€.
κ²°κ΅­ 두 번째 μΏΌλ¦¬λŠ” dept_emp ν…Œμ΄λΈ”μ˜ (dept_no, emp_no) 인덱슀의 μƒλ‹Ήνžˆ λ§Žμ€ λ ˆμ½”λ“œλ₯Ό μ½μ§€λ§Œ κ²°κ΅­ κ°€μ Έμ˜€λŠ” λ°μ΄ν„°λŠ” 1건뿐이닀.

λ‘λ²ˆμ§Έ 쿼리λ₯Ό μ•„λž˜μ²˜λŸΌ λ³€κ²½ν•˜λ©΄ emp_no=10001 쑰건도 μž‘μ—… λ²”μœ„λ₯Ό μ€„μ΄λŠ” μš©λ„λ‘œ 인덱슀λ₯Ό μ΄μš©ν•˜λ„λ‘ ν•  수 μžˆλ‹€.

SELECT * FROM dept_emp
WHERE dept_no IN ('d003', 'd004', 'd005')
	AND emp_no = 10001;

BETWEEN이 μ„ ν˜•μœΌλ‘œ 인덱슀λ₯Ό 검색해야 ν•˜λŠ” κ²ƒκ³ΌλŠ” 달리 IN은 동등(Equal) 비ꡐλ₯Ό μ—¬λŸ¬ 번 μˆ˜ν–‰ν•˜λŠ” 것과 같은 νš¨κ³Όκ°€ 있기 λ•Œλ¬Έμ— dept_emp ν…Œμ΄λΈ”μ˜ 인덱슀(dept_no, emp_no)λ₯Ό 졜적으둜 μ‚¬μš©ν•  수 μžˆλŠ” 것이닀.

ν•΄λ‹Ή 예제처럼 μ—¬λŸ¬ 컬럼으둜 μΈλ±μŠ€κ°€ λ§Œλ“€μ–΄μ Έ μžˆμ„ λ•Œ, 인덱슀 μ•žμͺ½μ— μžˆλŠ” 컬럼의 선택도가 λ–¨μ–΄μ§ˆ λ•ŒλŠ” IN으둜 λ³€κ²½ν•˜λŠ” λ°©λ²•μœΌλ‘œ 쿼리 μ„±λŠ₯을 κ°œμ„ ν•  μˆ˜λ„ μžˆλ‹€.

μ •λ¦¬ν•˜μžλ©΄,
BETWEEN 비ꡐλ₯Ό μ‚¬μš©ν•œ μΏΌλ¦¬μ—μ„œλŠ” λΆ€μ„œ λ²ˆν˜Έκ°€ 'd003'인 λ ˆμ½”λ“œλ‘œλΆ€ν„° 'd005'인 λ ˆμ½”λ“œμ˜ 전체 λ²”μœ„λ₯Ό λ‹€ 비ꡐ해야 ν•˜μ§€λ§Œ
IN을 μ‚¬μš©ν•œ μΏΌλ¦¬μ—μ„œλŠ” λΆ€μ„œλ²ˆν˜Έμ™€ 사원 λ²ˆν˜Έκ°€ (('d003', 10001), ('d004', 10001), ('d005', 10001)) 쑰합인 λ ˆμ½”λ“œλ§Œ 비ꡐ해 보면 λœλ‹€.

MySQL 8.0λΆ€ν„°λŠ” μ•„λž˜μ™€ 같이 "IN(subquery)" ν˜•νƒœλ‘œ μž‘μ„±ν•˜λ©΄ μ˜΅ν‹°λ§ˆμ΄μ €κ°€ μ„Έλ―Έ 쑰인 μ΅œμ ν™”λ₯Ό μ΄μš©ν•΄ 더 λΉ λ₯Έ 쿼리둜 λ³€ν™˜ν•΄μ„œ μ‹€ν–‰ν•œλ‹€.

SELECT *
FROM dept_emp USE INDEX(PRIMARY)
WHERE dept_no IN (
	SELECT dept_no
        FROM departments
        WHERE dept_no BETWEEN 'd003' AND 'd005')
	AND emp_no=10001;

 

(9) IN μ—°μ‚°μž

IN은 μ—¬λŸ¬ 개의 값에 λŒ€ν•΄ 동등 비ꡐ 연산을 μˆ˜ν–‰ν•˜λŠ” μ—°μ‚°μžλ‹€.
λ²”μœ„λ‘œ κ²€μƒ‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ—¬λŸ¬ 번의 동등 λΉ„κ΅λ‘œ μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— 일반적으둜 λΉ λ₯΄κ²Œ μ²˜λ¦¬λœλ‹€.

IN μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” 두 가지 μΌ€μ΄μŠ€λ₯Ό 생각해 λ³Ό 수 μžˆλ‹€.

  • 1. μƒμˆ˜κ°€ μ‚¬μš©λœ 경우 - IN (?, ?, ?)
  • 2. μ„œλΈŒμΏΌλ¦¬κ°€ μ‚¬μš©λœ 경우 - IN (SELECT ... FROM ... )

1. μƒμˆ˜κ°€ μ‚¬μš©λœ 경우

IN μ—°μ‚°μžμ— μƒμˆ˜κ°€ μ‚¬μš©λœ κ²½μš°λŠ” 동등 비ꡐ와 λ™μΌν•˜κ²Œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— 맀우 λΉ λ₯΄κ²Œ 쿼리가 처리될 것이닀.

SELECT * FROM dept_emp
	WHERE (dept_no, emp_no) IN (('d001', 10017), ('d002', 10144), ('d003', 10054));

μœ„ μ˜ˆμ‹œλŠ” IN 절의 μƒμˆ«κ°’μ΄ λ‹¨μˆœ 슀칼라 값이 μ•„λ‹ˆλΌ νŠœν”Œμ΄ μ‚¬μš©λλ‹€.  MySQL 8.0 이전 λ²„μ „κΉŒμ§€λŠ” IN μ ˆμ— νŠœν”Œ(λ ˆμ½”λ“œ)을 μ‚¬μš©ν•˜λ©΄ 항상 ν’€ ν…Œμ΄λΈ” μŠ€μΊ”μ„ ν–ˆμ—ˆλ‹€. λ”°λΌμ„œ 이런 쿼리λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ„±λŠ₯에 λ¬Έμ œκ°€ μƒκ²¨μ„œ μΌλΆ€λ‘œ 쿼리λ₯Ό μͺΌκ°œμ–΄ μ—¬λŸ¬ 번 μ‹€ν–‰ν–ˆλ‹€.

ν•˜μ§€λ§Œ, MySQL 8.0 λ²„μ „λΆ€ν„°λŠ” μœ„μ˜ 쿼리와 같이 IN μ ˆμ— νŠœν”Œμ„ κ·ΈλŒ€λ‘œ λ‚˜μ—΄ν•΄λ„ 인덱슀λ₯Ό 졜적으둜 μ‚¬μš©ν•  수 있게 κ°œμ„ λλ‹€.
λ”°λΌμ„œ μœ„μ˜ 쿼리 같은 경우 dept_emp ν…Œμ΄λΈ”μ˜ 프라이머리 ν‚€λ₯Ό μ΄μš©ν–ˆλŠ”λ°, dept_no 컬럼(4κΈ€μž*4λ°”μ΄νŠΈ)κ³Ό emp_no 컬럼(4λ°”μ΄νŠΈ)을 μ΄μš©ν•΄ 인덱슀 λ ˆμΈμ§€ μŠ€μΊ”μ„ μ‹€ν–‰ν•œλ‹€.

2. μ„œλΈŒμΏΌλ¦¬κ°€ μ‚¬μš©λœ 경우

IN (subquery) ν˜•νƒœμ˜ 쑰건이 μ‚¬μš©λœ μΏΌλ¦¬λŠ” μ΅œμ ν™”κ°€ 맀우 κΉŒλ‹€λ‘­μ§€λ§Œ, MySQL 8.0λΆ€ν„°λŠ” μ΅œμ ν™”κ°€ 많이 μ•ˆμ •ν™”λ˜μ–΄ μ˜΅ν‹°λ§ˆμ΄μ €κ°€ μ„Έλ―Έ 쑰인 μ΅œμ ν™”λ₯Ό μ΄μš©ν•˜μ—¬ 더 λΉ λ₯Έ 쿼리둜 λ³€ν™˜ν•΄μ„œ μ‹€ν–‰ν•œλ‹€.

NOT_IN

NOT_IN의 μ‹€ν–‰ κ³„νšμ€ 인덱슀 ν’€ μŠ€μΊ”μœΌλ‘œ ν‘œμ‹œλ˜λŠ”λ°, 동등이 μ•„λ‹Œ λΆ€μ •ν˜• λΉ„κ΅μ—¬μ„œ 인덱슀λ₯Ό μ΄μš©ν•΄ 처리 λ²”μœ„λ₯Ό μ€„μ΄λŠ” μ‘°κ±΄μœΌλ‘œλŠ” μ‚¬μš©ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. NOT_IN μ—°μ‚°μžκ°€ 프라이머리 킀와 비ꡐ될 λ•Œ 가끔 쿼리의 μ‹€ν–‰κ³„νšμ— 인덱슀 λ ˆμΈμ§€ μŠ€μΊ”μ΄ ν‘œμ‹œλ˜λŠ” κ²½μš°κ°€ μžˆλ‹€. ν•˜μ§€λ§Œ μ΄λŠ” InnoDB ν…Œμ΄λΈ”μ—μ„œ PKκ°€ ν΄λŸ¬μŠ€ν„°λ§ 킀이기 λ•Œλ¬ΈμΌ 뿐 μ‹€μ œ INκ³Ό 같이 효율적으둜 μ‹€ν–‰λœλ‹€λŠ” 것을 μ˜λ―Έν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

2. MySQL λ‚΄μž₯ ν•¨μˆ˜

DBMS μ’…λ₯˜μ™€ 관계없이 기본적인 κΈ°λŠ₯의 SQL ν•¨μˆ˜λŠ” λŒ€λΆ€λΆ„ λ™μΌν•˜κ²Œ μ œκ³΅λœλ‹€. ν•˜μ§€λ§Œ ν•¨μˆ˜ μ΄λ¦„μ΄λ‚˜ μ‚¬μš©λ²•μ˜ ν‘œμ€€μ΄ μ—†μœΌλ―€λ‘œ DBMSλ³„λ‘œ 거의 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”λ‹€.
MySQL ν•¨μˆ˜λŠ” 기본적으둜 μ œκ³΅ν•˜λŠ” λ‚΄μž₯ ν•¨μˆ˜μ™€ μ‚¬μš©μžκ°€ 직접 μž‘μ„±ν•΄μ„œ μΆ”κ°€ν•  수 μžˆλŠ” μ‚¬μš©μž μ •μ˜ν•¨μˆ˜(UDF, User Defined Function)둜 κ΅¬λΆ„λœλ‹€.
μ‚¬μš©μž μ •μ˜ν•¨μˆ˜λŠ” C/C++ APIλ₯Ό μ΄μš©ν•΄ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” κΈ°λŠ₯을 직접 ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄ μΆ”κ°€ν•  수 μžˆλ‹€.
μ‚¬μš©μž μ •μ˜ν•¨μˆ˜λŠ” μŠ€ν† μ–΄λ“œ ν”„λ‘œκ·Έλž¨μœΌλ‘œ μž‘μ„±λ˜λŠ” ν”„λ‘œμ‹œμ €λ‚˜ μŠ€ν† μ–΄λ“œ ν•¨μˆ˜μ™€λŠ” λ‹€λ₯Έ 것을 μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€.

(1) λ‚΄μž₯ ν•¨μˆ˜ μ’…λ₯˜ 간단 정리

  • NULL κ°’ 비ꡐ 및 λŒ€μ²΄ (IFNULL, ISNULL)
  • ν˜„μž¬ μ‹œκ° 쑰회 (NOW, SYSDATE)
    • SYSDATE()λ₯Ό μ‚¬μš©ν•˜λ©΄ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ—μ„œ μ•ˆμ •μ μœΌλ‘œ λ³΅μ œλ˜μ§€ λͺ»ν•œλ‹€.
    • SYSDATE() ν•¨μˆ˜μ™€ λΉ„κ΅λ˜λŠ” μ»¬λŸΌμ€ 인덱슀λ₯Ό 효율적으둜 μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€.
    • SYSDATE() ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ λ‹€λ₯Έ 값을 λ°˜ν™˜ν•˜λ―€λ‘œ 사싀 μ •μˆ˜κ°€ μ•„λ‹ˆλ‹€.
    • SYSDATE()λŠ” 인덱슀λ₯Ό μŠ€μΊ”ν•  λ•Œλ„ 맀번 λΉ„κ΅λ˜λŠ” λ ˆμ½”λ“œλ§ˆλ‹€ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•˜μ§€λ§Œ, 
      NOW()λŠ” 쿼리가 μ‹€ν–‰λ˜λŠ” μ‹œμ μ—μ„œ μ‹€ν–‰λ˜κ³  값을 ν• λ‹Ήλ°›μ•„μ„œ κ·Έ 값을 SQL λͺ¨λ“  λΆ€λΆ„μ—μ„œ μ‚¬μš©ν•˜κΈ°μ— 쿼리가 1μ‹œκ°„ λ™μ•ˆ μ‹€ν–‰λ˜λ”λΌλ„ 항상 같은 값을 보μž₯ν•œλ‹€.
  • λ‚ μ§œμ™€ μ‹œκ°„μ˜ 포맷 (DATE_FORMAT, STR_TO_DATE)
    • SQLμ—μ„œ ν‘œμ€€ ν˜•νƒœ(λ…„-μ›”-일 μ‹œ:λΆ„:초)둜 μž…λ ₯된 λ¬Έμžμ—΄μ€ ν•„μš”ν•œ 경우 μžλ™μœΌλ‘œ DATETIME νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜μ–΄ μ²˜λ¦¬λœλ‹€. λ‹€λ₯Έ ν˜•νƒœλ„ κ°€λŠ₯ν•œ 것이 더 있긴 ν•˜λ‹€.
  • λ‚ μ§œμ™€ μ‹œκ°„μ˜ μ—°μ‚° (DATE_ADD, DATE_SUB)
  • νƒ€μž„μŠ€νƒ¬ν”„ μ—°μ‚° (UNIX_TIMESTAMP, FROM_UNIXTIME)
  • λ¬Έμžμ—΄ 처리 (RPAD, LPAD / RTRIM, LTRIM, TRIM)
  • λ¬Έμžμ—΄ κ²°ν•© (CONCAT)
  • GROUP BY λ¬Έμžμ—΄ κ²°ν•© (GROUP_CONCAT)
    • COUNT()λ‚˜ MAX(), MIN(), AVG() λ“±κ³Ό 같은 κ·Έλ£Ή ν•¨μˆ˜ 쀑 ν•˜λ‚˜λ‹€. 주둜 GROUP BY와 ν•¨κ»˜ μ‚¬μš©ν•˜λ©°, GROUP BYκ°€ μ—†λŠ” SQLμ—μ„œ μ‚¬μš©ν•˜λ©΄ 단 ν•˜λ‚˜μ˜ κ²°κ³Όκ°’λ§Œ λ§Œλ“€μ–΄λ‚Έλ‹€.
  • κ°’μ˜ 비ꡐ와 λŒ€μ²΄ (CASE WHEN ... THEN ... END)
    • CASE WHEN은 ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ SQL ꡬ문이며, ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ œκ³΅ν•˜λŠ” SWITCH ꡬ문과 같은 역할을 ν•œλ‹€.
      CASE둜 μ‹œμž‘ν•˜κ³  END둜 λλ‚˜μ•Ό ν•œλ‹€. λ˜ν•œ WHEN ... THEN ... 은 ν•„μš”ν•œ 만큼 λ°˜λ³΅ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.
SELECT emp_no, first_name,
	CASE gender WHEN 'M' THEN 'Man'
    			WHEN 'F' THEN 'Woman'
                	ELSE 'Unknown' END AS gender
    FROM employees
    LIMIT 10;
  • νƒ€μž…μ˜ λ³€ν™˜(CAST, CONVERT)
  • 이진값과 16μ§„μˆ˜ λ¬Έμžμ—΄ (Hex String) λ³€ν™˜(HEX, UNHEX)
  • μ•”ν˜Έν™” 및 ν•΄μ‹œ ν•¨μˆ˜ (MD5, SHA, SHA2)
  • 처리 λŒ€κΈ°(SLEEP)
  • 벀치마크(BENCHMARK)
  • IP μ£Όμ†Œ λ³€ν™˜ (INET_ATON, INET_NTOA)

λ³΅μž‘ν•œ λ‚΄μž₯ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  κ²½μš°κ°€ λ§Žμ§€λŠ” μ•ŠμœΌλ―€λ‘œ ν•„μš”ν•  λ•Œ μ°Ύμ•„λ³Ό 수 μžˆμ„ μ •λ„λ§Œ κ³΅λΆ€ν•˜κ³ μž ν•˜μ˜€λ‹€.