[Real MySQL 8.0] MySQL μ°μ°μμ λ΄μ₯ν¨μ
μ ν리μΌμ΄μ μμ λ°μ΄ν°λ₯Ό μ μ₯ λλ μ‘°ννκΈ° μν΄ 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 ... μ νμν λ§νΌ λ°λ³΅νμ¬ μ¬μ©ν μ μλ€.
- CASE WHENμ ν¨μκ° μλλΌ SQL ꡬ문μ΄λ©°, νλ‘κ·Έλλ° μΈμ΄μμ μ 곡νλ SWITCH ꡬ문과 κ°μ μν μ νλ€.
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)
볡μ‘ν λ΄μ₯ν¨μλ₯Ό μ¬μ©ν κ²½μ°κ° λ§μ§λ μμΌλ―λ‘ νμν λ μ°Ύμλ³Ό μ μμ μ λλ§ κ³΅λΆνκ³ μ νμλ€.