# MySQL 완벽 가이드
## 학습 목표
MySQL 데이터베이스를 설계하고 관리합니다.
## 1. MySQL이란?
가장 널리 사용되는 오픈소스 관계형 데이터베이스입니다.
- 무료 사용
- 높은 성능
- 풍부한 기능
- 대규모 커뮤니티
## 2. 설치 및 접속
Docker:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql:8
접속:
mysql -u root -p
mysql -h localhost -u root -p database_name
## 3. 데이터베이스 관리
생성:
CREATE DATABASE mydb;
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
목록:
SHOW DATABASES;
선택:
USE mydb;
삭제:
DROP DATABASE mydb;
## 4. 테이블 생성
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
password VARCHAR(255) NOT NULL,
age INT CHECK (age >= 0),
balance DECIMAL(10,2) DEFAULT 0,
status ENUM("active", "inactive") DEFAULT "active",
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
테이블 목록:
SHOW TABLES;
구조 확인:
DESC users;
SHOW CREATE TABLE users;
## 5. 데이터 삽입
INSERT INTO users (name, email, password) VALUES ("Kim", "kim@test.com", "hash123");
여러 행:
INSERT INTO users (name, email, password) VALUES
("Lee", "lee@test.com", "hash456"),
("Park", "park@test.com", "hash789");
## 6. 데이터 조회
전체:
SELECT * FROM users;
특정 컬럼:
SELECT name, email FROM users;
조건:
SELECT * FROM users WHERE age > 20;
SELECT * FROM users WHERE status = "active" AND age >= 18;
SELECT * FROM users WHERE name LIKE "Kim%";
SELECT * FROM users WHERE email IN ("a@test.com", "b@test.com");
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
정렬:
SELECT * FROM users ORDER BY created_at DESC;
SELECT * FROM users ORDER BY name ASC, age DESC;
제한:
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 10 OFFSET 20;
## 7. 데이터 수정
UPDATE users SET name = "Kim Updated" WHERE id = 1;
UPDATE users SET age = age + 1 WHERE status = "active";
## 8. 데이터 삭제
DELETE FROM users WHERE id = 1;
DELETE FROM users WHERE status = "inactive";
전체 삭제 (주의):
TRUNCATE TABLE users;
## 9. JOIN
INNER JOIN:
SELECT u.name, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
LEFT JOIN:
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id;
## 10. 집계 함수
SELECT COUNT(*) FROM users;
SELECT AVG(age) FROM users;
SELECT SUM(balance) FROM users;
SELECT MAX(age), MIN(age) FROM users;
GROUP BY:
SELECT status, COUNT(*) as cnt FROM users GROUP BY status;
SELECT status, AVG(age) FROM users GROUP BY status HAVING AVG(age) > 25;
## 11. 인덱스
생성:
CREATE INDEX idx_email ON users(email);
CREATE UNIQUE INDEX idx_email_unique ON users(email);
CREATE INDEX idx_name_age ON users(name, age);
조회:
SHOW INDEX FROM users;
삭제:
DROP INDEX idx_email ON users;
## 12. 사용자 및 권한
사용자 생성:
CREATE USER "appuser"@"localhost" IDENTIFIED BY "password";
CREATE USER "appuser"@"%" IDENTIFIED BY "password";
권한 부여:
GRANT ALL PRIVILEGES ON mydb.* TO "appuser"@"localhost";
GRANT SELECT, INSERT, UPDATE ON mydb.* TO "appuser"@"localhost";
권한 확인:
SHOW GRANTS FOR "appuser"@"localhost";
권한 적용:
FLUSH PRIVILEGES;
## 13. 백업 및 복원
백업:
mysqldump -u root -p mydb > backup.sql
mysqldump -u root -p --all-databases > all_backup.sql
복원:
mysql -u root -p mydb < backup.sql
## 14. 성능 분석
EXPLAIN SELECT * FROM users WHERE email = "test@test.com";
SHOW PROCESSLIST;
SHOW STATUS;
## 추천 학습 순서
1. 기본 CRUD
2. JOIN 활용
3. 집계와 그룹화
4. 인덱스 설계
5. 백업 및 보안