πŸ“Œ Data Manipulation Language

λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터λ₯Ό κ΄€λ¦¬ν•˜κ³  μ‘°μž‘ν•˜λŠ” 핡심 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

βœ… DML의 μ£Όμš” λͺ…λ Ήμ–΄

λͺ…λ Ήμ–΄ μ„€λͺ…
INSERT μƒˆλ‘œμš΄ 데이터λ₯Ό μΆ”κ°€
SELECT 데이터λ₯Ό 쑰회
UPDATE κΈ°μ‘΄ 데이터λ₯Ό μˆ˜μ •
DELETE 데이터λ₯Ό μ‚­μ œ

πŸ”· 4-1. 데이터 μ‚½μž… (INSERT)

INSERT λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ μƒˆλ‘œμš΄ 데이터λ₯Ό ν…Œμ΄λΈ”μ— μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… 기본적인 INSERT 문법

INSERT INTO employees (name, age, department, salary, hire_date)
VALUES ('홍길동', 30, 'IT', 50000, '2024-03-10');

πŸ“Œ νŠΉμ • μ»¬λŸΌμ—λ§Œ 값을 μ‚½μž…ν•˜λ €λ©΄ ν•΄λ‹Ή 컬럼만 λͺ…μ‹œν•˜λ©΄ 됨.

πŸ“Œ 데이터 μž…λ ₯ μˆœμ„œλŠ” ν…Œμ΄λΈ” 생성 μ‹œ μ •μ˜λœ μˆœμ„œμ™€ μΌμΉ˜ν•΄μ•Ό 함.


βœ… μ—¬λŸ¬ 개의 데이터 μ‚½μž…

INSERT INTO employees (name, age, department, salary, hire_date)
VALUES
    ('κΉ€μ² μˆ˜', 25, 'HR', 40000, '2024-02-15'),
    ('이영희', 29, 'Finance', 55000, '2024-01-20');

πŸ“Œ ν•œ λ²ˆμ— μ—¬λŸ¬ 개의 데이터λ₯Ό μ‚½μž… κ°€λŠ₯ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”μ— 도움됨.


βœ… μžλ™ 증가(AUTO_INCREMENT) 컬럼 처리

INSERT INTO employees (name, department, salary, hire_date)
VALUES ('λ°•μ˜μˆ˜', 'Marketing', 48000, '2024-03-05');

πŸ“Œ id 컬럼이 AUTO_INCREMENT둜 μ„€μ •λœ 경우, 값을 μƒλž΅ν•˜λ©΄ μžλ™ 증가됨.

βœ… 주의점

βœ… μˆ˜μ •λœ μ½”λ“œ

-- μ˜¬λ°”λ₯Έ μ‚½μž… 방식
INSERT INTO employees (name, department, salary, hire_date)
VALUES ('λ°•μ˜μˆ˜', 'Marketing', 48000, '2024-03-05');

-- IDλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•΄μ•Ό ν•  경우 (ꢌμž₯ν•˜μ§€ μ•ŠμŒ)
INSERT INTO employees (id, name, department, salary, hire_date)
VALUES (DEFAULT, 'λ°•μ˜μˆ˜', 'Marketing', 48000, '2024-03-05');

πŸ“Œ MariaDBμ—μ„œλŠ” NULL λŒ€μ‹  DEFAULT ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ AUTO_INCREMENT 값을 μžλ™ 할당함.

πŸ“Œ idλ₯Ό 직접 μ‚½μž…ν•˜μ§€ μ•ŠλŠ” 것이 일반적으둜 더 μ•ˆμ •μ μΈ λ°©λ²•μž„

🚨 6. INSERT μ‹œ ON DUPLICATE KEY UPDATE

INSERT INTO employees (id, name, salary)
VALUES (1, '홍길동', 50000)
ON DUPLICATE KEY UPDATE
salary = VALUES(salary);

πŸ“Œ κΈ°μ‘΄ id=1이 μ‘΄μž¬ν•˜λ©΄ salary만 μ—…λ°μ΄νŠΈλ¨.

πŸ“Œ μƒˆλ‘œμš΄ id=1이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ INSERTκ°€ 싀행됨.


πŸ”· 4-2. 데이터 쑰회 (SELECT)

SELECT λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ 데이터λ₯Ό κ²€μƒ‰ν•˜κ³  μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… 기본적인 SELECT 문법

SELECT * FROM employees;

πŸ“Œ λͺ¨λ“  μ»¬λŸΌμ„ μ‘°νšŒν•  λ•Œ * μ‚¬μš© κ°€λŠ₯ν•˜μ§€λ§Œ, μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•΄ ν•„μš”ν•œ 컬럼만 λͺ…μ‹œν•˜λŠ” 것이 μ’‹μŒ.


βœ… νŠΉμ • 컬럼만 쑰회

SELECT name, department, salary FROM employees;

πŸ“Œ ν•„μš”ν•œ 컬럼만 μ§€μ •ν•˜μ—¬ 쑰회 κ°€λŠ₯.


βœ… 쑰건을 μ‚¬μš©ν•œ 데이터 쑰회 (WHERE)

SELECT * FROM employees WHERE department = 'IT';

πŸ“Œ WHERE μ ˆμ„ μ‚¬μš©ν•˜μ—¬ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” λ°μ΄ν„°λ§Œ 쑰회.

SELECT * FROM employees WHERE age >= 30 AND salary > 50000;

πŸ“Œ 논리 μ—°μ‚°μž(AND, OR)λ₯Ό ν™œμš©ν•˜μ—¬ 볡합 쑰건 μ„€μ • κ°€λŠ₯.


βœ… 데이터 μ •λ ¬ (ORDER BY)

SELECT * FROM employees ORDER BY salary DESC;

πŸ“Œ κΈ‰μ—¬(salary) κΈ°μ€€μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœ(DESC) μ •λ ¬.

πŸ“Œ μ˜€λ¦„μ°¨μˆœ 정렬은 ASC (κΈ°λ³Έκ°’).

SELECT * FROM employees ORDER BY department ASC, salary DESC;

πŸ“Œ λΆ€μ„œ(department) κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•˜κ³ , 같은 λΆ€μ„œ λ‚΄μ—μ„œλŠ” salary κΈ°μ€€μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬.

πŸ“ŒNULL 값이 기본적으둜 μ˜€λ¦„μ°¨μˆœ(ASC)μ—μ„œλŠ” λ¨Όμ €, λ‚΄λ¦Όμ°¨μˆœ(DESC)μ—μ„œλŠ” λ§ˆμ§€λ§‰μ— 정렬됨.

βœ… μˆ˜μ •λœ μ½”λ“œ

-- κΈ‰μ—¬κ°€ NULL인 데이터λ₯Ό κ°€μž₯ λ§ˆμ§€λ§‰μ— 배치
SELECT * FROM employees ORDER BY salary DESC NULLS LAST;

πŸ“Œ MariaDBλŠ” NULLS LAST λ˜λŠ” NULLS FIRSTλ₯Ό κΈ°λ³Έ μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ IS NULL을 ν™œμš©ν•œ 우회 방법이 ν•„μš”ν•¨.

-- NULL 값을 λ¨Όμ € μ •λ ¬ν•˜λŠ” 방법
SELECT * FROM employees ORDER BY salary IS NULL, salary DESC;

πŸ“Œ IS NULL을 ν™œμš©ν•˜μ—¬ NULL 데이터λ₯Ό λ¨Όμ € μ •λ ¬ ν›„ κΈ‰μ—¬λ₯Ό λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ κ°€λŠ₯.


βœ… μƒμœ„ N개 데이터 쑰회 (LIMIT)

SELECT * FROM employees ORDER BY salary DESC LIMIT 5;

πŸ“Œ κΈ‰μ—¬κ°€ 높은 μƒμœ„ 5λͺ… 쑰회.

SELECT * FROM employees ORDER BY salary DESC LIMIT 5 OFFSET 2;

πŸ“Œ κΈ‰μ—¬κ°€ 높은 3번째~7번째 데이터 쑰회 (νŽ˜μ΄μ§• 처리).


πŸ”· 4-3. 데이터 μˆ˜μ • (UPDATE)

UPDATE λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ κΈ°μ‘΄ 데이터λ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… νŠΉμ • 컬럼 μ—…λ°μ΄νŠΈ

UPDATE employees SET salary = 60000 WHERE name = '홍길동';

πŸ“Œ ν™κΈΈλ™μ˜ κΈ‰μ—¬λ₯Ό 60,000으둜 λ³€κ²½.


βœ… μ—¬λŸ¬ 개의 컬럼 μ—…λ°μ΄νŠΈ

UPDATE employees
SET salary = 62000, department = 'Finance'
WHERE name = 'κΉ€μ² μˆ˜';

πŸ“Œ κΉ€μ² μˆ˜μ˜ λΆ€μ„œλ₯Ό Finance둜 λ³€κ²½ν•˜κ³  κΈ‰μ—¬λ₯Ό 62,000으둜 μˆ˜μ •.


βœ… λͺ¨λ“  행을 μˆ˜μ •ν•  경우 (WHERE 없이 μ‚¬μš© 주의!)

UPDATE employees SET salary = salary * 1.1;

πŸ“Œ 전체 μ§μ›μ˜ κΈ‰μ—¬λ₯Ό 10% 인상.

⚠ 주의: WHERE 절이 μ—†μœΌλ©΄ λͺ¨λ“  데이터가 μˆ˜μ •λ¨.

βœ… μ‹€λ¬΄μ—μ„œ μ’…μ’… λ°œμƒν•˜λŠ” 치λͺ…적인 μ‹€μˆ˜λ₯Ό λ§‰μœΌλ €λ©΄

-- νŠΉμ • μ§μ›μ˜ κΈ‰μ—¬λ§Œ μˆ˜μ •
UPDATE employees SET salary = 60000 WHERE name = '홍길동';

-- 전체 ν–‰ μˆ˜μ • μ‹œ λ°˜λ“œμ‹œ 확인 절차 ν•„μš”
START TRANSACTION;
UPDATE employees SET salary = salary * 1.1; -- λ‘€λ°± κ°€λŠ₯
ROLLBACK;

πŸ“Œ START TRANSACTION을 μ‚¬μš©ν•˜λ©΄ μ‹€μˆ˜λ‘œ 잘λͺ»λœ UPDATEλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ ROLLBACK κ°€λŠ₯.

πŸ“Œ μ‹€λ¬΄μ—μ„œλŠ” WHERE 없이 UPDATEλ₯Ό μ‹€ν–‰ν•˜λŠ” 것을 ν”Όν•΄μ•Ό ν•˜λ©°, λ°˜λ“œμ‹œ TRANSACTION을 ν™œμš©ν•˜λŠ” 것이 μ’‹μŒ.


πŸ”· 4-4. 데이터 μ‚­μ œ (DELETE)

βœ… νŠΉμ • 데이터 μ‚­μ œ

DELETE FROM employees WHERE name = '이영희';

πŸ“Œ 이름이 이영희인 μ§μ›μ˜ 데이터λ₯Ό μ‚­μ œ.


βœ… νŠΉμ • 쑰건의 μ—¬λŸ¬ 데이터 μ‚­μ œ

DELETE FROM employees WHERE salary < 40000;

πŸ“Œ κΈ‰μ—¬κ°€ 40,000 미만인 직원 μ‚­μ œ.


βœ… λͺ¨λ“  데이터 μ‚­μ œ (WHERE 없이 μ‚¬μš© 주의!)

DELETE FROM employees;

πŸ“Œ λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•˜μ§€λ§Œ ν…Œμ΄λΈ” κ΅¬μ‘°λŠ” μœ μ§€λ¨.

⚠ μ‹€μˆ˜λ‘œ λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•˜μ§€ μ•Šλ„λ‘ 주의 ν•„μš”!


βœ… DELETE vs TRUNCATE 차이

λͺ…λ Ήμ–΄ 데이터 μ‚­μ œ ROLLBACK κ°€λŠ₯ μ—¬λΆ€ AUTO_INCREMENT μ΄ˆκΈ°ν™” μ—¬λΆ€ μ™Έλž˜ ν‚€ μ œν•œ (FK)
DELETE FROM employees; ν–‰λ§Œ μ‚­μ œ βœ… κ°€λŠ₯ (TRANSACTION λ‚΄μ—μ„œ) ❌ μœ μ§€λ¨ βœ… FK μ œν•œ 적용
TRUNCATE TABLE employees; ν–‰ μ‚­μ œ + ν…Œμ΄λΈ” μ΄ˆκΈ°ν™” ❌ λΆˆκ°€λŠ₯ βœ… 리셋됨 ❌ FK μ œν•œμœΌλ‘œ μ‹€ν–‰ λΆˆκ°€.

πŸ“Œ TRUNCATEλŠ” μ™Έλž˜ ν‚€(FK)κ°€ μ„€μ •λœ ν…Œμ΄λΈ”μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŒ.

πŸ“Œ TRUNCATEλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ λ¨Όμ € μ™Έλž˜ ν‚€ μ œμ•½ 쑰건을 λΉ„ν™œμ„±ν™”ν•΄μ•Ό

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE employees;
SET FOREIGN_KEY_CHECKS = 1;

πŸ“Œ μ™Έλž˜ ν‚€(FK) μ œν•œμ΄ μžˆλŠ” 경우 TRUNCATEλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 SET FOREIGN_KEY_CHECKS = 0; 섀정이 ν•„μš”.


πŸ”· 4-5. νŠΈλžœμž­μ…˜ (Transaction)

βœ… νŠΈλžœμž­μ…˜μ΄λž€?

βœ… νŠΈλžœμž­μ…˜ μ‹œμž‘

START TRANSACTION;
UPDATE employees SET salary = salary * 1.1;
ROLLBACK;  -- λ³€κ²½ μ·¨μ†Œ

πŸ“Œ ROLLBACK을 μ‚¬μš©ν•˜λ©΄ 이전 μƒνƒœλ‘œ 되돌릴 수 있음.

βœ… νŠΈλžœμž­μ…˜ ν™•μ •

START TRANSACTION;
UPDATE employees SET salary = salary * 1.1;
COMMIT;  -- λ³€κ²½ ν™•μ •

πŸ“Œ COMMIT을 μ‚¬μš©ν•˜λ©΄ λ³€κ²½ 사항이 μ΅œμ’… μ €μž₯됨.

βœ… TRANSACTION을 μ‚¬μš©ν•  λ•Œ AUTOCOMMIT λͺ¨λ“œκ°€ ν™œμ„±ν™”λœ 경우, λͺ…μ‹œμ μœΌλ‘œ START TRANSACTION을 μ‹€ν–‰ν•΄μ•Ό 함.

-- νŠΈλžœμž­μ…˜ λͺ¨λ“œ λΉ„ν™œμ„±ν™”
SET AUTOCOMMIT = 0;

START TRANSACTION;
UPDATE employees SET salary = salary * 1.1;
COMMIT;

-- μ›λž˜ μƒνƒœλ‘œ 볡ꡬ
SET AUTOCOMMIT = 1;

πŸ“Œ MariaDBλŠ” 기본적으둜 AUTOCOMMIT이 ν™œμ„±ν™”λ˜μ–΄ μžˆμœΌλ―€λ‘œ, νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•  λ•Œ 이λ₯Ό λͺ…ν™•νžˆ μ„€μ •ν•΄μ•Ό 함.

πŸ“Œ SET AUTOCOMMIT = 0;을 μ„€μ •ν•˜λ©΄ COMMIT을 λͺ…μ‹œμ μœΌλ‘œ μ‹€ν–‰ν•΄μ•Ό λ³€κ²½ 사항이 μ €μž₯됨.


πŸ”· βœ… 정리 (λ…Έμ…˜μš© μ΅œμ ν™” 포맷)

πŸ“Œ DML 핡심 κ°œλ… μš”μ•½

1️⃣ 데이터 μ‚½μž… (INSERT)

2️⃣ 데이터 쑰회 (SELECT + WHERE, ORDER BY, LIMIT)

3️⃣ 데이터 μˆ˜μ • (UPDATE)

4️⃣ 데이터 μ‚­μ œ (DELETE vs TRUNCATE)

5️⃣ νŠΈλžœμž­μ…˜ (COMMIT, ROLLBACK)

πŸ“Œ 이제 MariaDB의 DML(데이터 μ‘°μž‘μ–΄)을 μ™„λ²½ν•˜κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€! πŸš€

πŸ“Œ μΆ”κ°€ 질문이 있으면 μ–Έμ œλ“ μ§€ μ§ˆλ¬Έν•˜μ„Έμš”! 😊