🗄️ 데이터베이스 🌱 입문

MySQL 완벽 가이드

관계형 데이터베이스 MySQL 기초부터 최적화까지

⏱️ 7시간 👁️ 25 조회 ⭐ 추천 강좌
📖 강좌 내용
# 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. 백업 및 보안