MySQL 8.0 완전 복습 가이드 📚¶
1. 환경 설정 및 기본 개념¶
1.1 개발 환경 설정¶
- DBeaver: 데이터베이스 관리 도구 (GUI 환경)
- Aiven: 클라우드 MySQL 서비스
- MySQL 8.0.x: 오픈소스 관계형 데이터베이스
-- 기본 연결 테스트
SELECT 1 + 1;
SELECT VERSION(), DATABASE();
1.2 RDBMS 기본 개념¶
graph TD
A[RDBMS<br/>관계형 데이터베이스 관리 시스템] --> B[테이블]
A --> C[스키마]
A --> D[SQL]
B --> E[행/Row/Record]
B --> F[열/Column/Field]
C --> G[데이터 구조 정의]
D --> H[DQL - 조회]
D --> I[DML - 조작]
D --> J[DDL - 정의]
RDBMS 비유: 엑셀 스프레드시트 모음집 - 데이터베이스: 하나의 엑셀 파일 - 테이블: 엑셀 시트 하나 - 행(Row): 엑셀의 한 줄 - 열(Column): 엑셀의 세로 컬럼
2. DQL (Data Query Language) - 데이터 조회¶
2.1 기본 조회 (SELECT)¶
-- 전체 데이터 조회
SELECT * FROM 테이블명;
-- 특정 컬럼 조회
SELECT column1, column2 FROM 테이블명;
-- 테이블 구조 확인
DESC 테이블명;
-- 중복 제거
SELECT DISTINCT column1 FROM 테이블명;
2.2 조건부 조회 (WHERE)¶
-- 기본 조건
SELECT * FROM products WHERE price > 1000;
-- 복합 조건
SELECT * FROM products
WHERE price BETWEEN 1000 AND 5000
AND category = 'electronics';
-- 패턴 매칭
SELECT * FROM customers WHERE name LIKE '김%';
2.3 그룹화 및 집계 (GROUP BY, HAVING)¶
-- 그룹별 집계
SELECT category, COUNT(*), AVG(price)
FROM products
GROUP BY category;
-- 그룹 조건
SELECT category, AVG(price)
FROM products
GROUP BY category
HAVING AVG(price) > 2000;
GROUP BY 비유: 반 학생들을 성별로 나눠서 각각의 평균 키 구하기
2.4 정렬 및 제한 (ORDER BY, LIMIT)¶
-- 정렬
SELECT * FROM products ORDER BY price DESC;
-- 상위 N개 조회
SELECT * FROM products ORDER BY price DESC LIMIT 5;
-- 페이징 (건너뛰기)
SELECT * FROM products ORDER BY price DESC LIMIT 10, 5;
3. JOIN - 테이블 연결¶
3.1 JOIN 개념 시각화¶
graph LR
A[학생 테이블] --> C[INNER JOIN<br/>교집합]
B[성적 테이블] --> C
A --> D[LEFT JOIN<br/>학생 기준 전체]
B --> D
A --> E[RIGHT JOIN<br/>성적 기준 전체]
B --> E
A --> F[FULL JOIN<br/>합집합]
B --> F
3.2 JOIN 유형별 예제¶
-- INNER JOIN (교집합)
SELECT s.name, g.score
FROM students s
INNER JOIN grades g ON s.student_id = g.student_id;
-- LEFT JOIN (왼쪽 테이블 기준 전체)
SELECT s.name, g.score
FROM students s
LEFT JOIN grades g ON s.student_id = g.student_id;
-- CROSS JOIN (카테시안 곱)
SELECT s.name, c.course_name
FROM students s
CROSS JOIN courses c;
JOIN 비유: - INNER JOIN: 양쪽 모두 일치하는 것만 (교집합) - LEFT JOIN: 왼쪽은 무조건, 오른쪽은 있으면 (왼쪽 기준) - CROSS JOIN: 모든 조합 만들기 (A×B)
4. DML (Data Manipulation Language) - 데이터 조작¶
4.1 데이터 삽입 (INSERT)¶
-- 단일 행 삽입
INSERT INTO products (name, price, category)
VALUES ('노트북', 150000, 'electronics');
-- 다중 행 삽입
INSERT INTO products (name, price, category)
VALUES
('마우스', 30000, 'electronics'),
('키보드', 80000, 'electronics');
4.2 데이터 수정 (UPDATE)¶
-- 조건부 수정
UPDATE products
SET price = 140000
WHERE name = '노트북';
-- 다중 컬럼 수정
UPDATE products
SET price = price * 1.1, category = 'premium_electronics'
WHERE price > 100000;
4.3 데이터 삭제 (DELETE)¶
-- 조건부 삭제
DELETE FROM products WHERE price < 10000;
-- 전체 삭제 (주의!)
DELETE FROM products;
5. DDL (Data Definition Language) - 구조 정의¶
5.1 테이블 생성 (CREATE)¶
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) DEFAULT 0,
category VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
5.2 테이블 수정 (ALTER)¶
-- 컬럼 추가
ALTER TABLE products ADD COLUMN description TEXT;
-- 컬럼 수정
ALTER TABLE products MODIFY COLUMN name VARCHAR(200);
-- 컬럼 삭제
ALTER TABLE products DROP COLUMN description;
5.3 테이블 삭제 (DROP)¶
-- 테이블 삭제
DROP TABLE products;
6. 트랜잭션 (Transaction) - 데이터 안전성¶
6.1 ACID 속성¶
graph TD
A[ACID] --> B[Atomicity<br/>원자성]
A --> C[Consistency<br/>일관성]
A --> D[Isolation<br/>격리성]
A --> E[Durability<br/>지속성]
B --> B1[전부 실행 or 전부 취소]
C --> C1[제약조건 유지]
D --> D1[트랜잭션 간 간섭 방지]
E --> E1[커밋 후 영구 저장]
ACID 비유: 은행 계좌 이체 - 원자성: 출금과 입금이 모두 성공하거나 모두 실패 - 일관성: 총 금액은 변하지 않음 - 격리성: 다른 이체가 동시에 방해하지 않음 - 지속성: 완료된 이체는 영구적으로 기록
6.2 트랜잭션 제어¶
-- 수동 트랜잭션 시작
START TRANSACTION;
-- 여러 작업 수행
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
-- 커밋 (확정)
COMMIT;
-- 또는 롤백 (취소)
-- ROLLBACK;
6.3 락(Lock) 종류¶
graph TD
A[트랜잭션 락] --> B[공유 락<br/>Shared Lock]
A --> C[배타 락<br/>Exclusive Lock]
B --> B1[읽기 허용<br/>쓰기 금지]
C --> C1[모든 접근 금지]
D[락 전략] --> E[비관적 락<br/>Pessimistic]
D --> F[낙관적 락<br/>Optimistic]
E --> E1[미리 락 획득]
F --> F1[충돌 시 사후 검증]
7. 데이터 무결성과 정규화¶
7.1 무결성 종류¶
무결성 유형 | 설명 | 예시 |
---|---|---|
개체 무결성 | PK는 중복되지 않음 | 학번은 유일해야 함 |
참조 무결성 | FK는 존재하는 PK만 참조 | 존재하지 않는 학과 참조 금지 |
도메인 무결성 | 컬럼 제약조건 준수 | 나이는 양수, 이메일 형식 준수 |
7.2 정규화 기본 개념¶
graph TD
A[정규화] --> B[제1정규형<br/>1NF]
A --> C[제2정규형<br/>2NF]
A --> D[제3정규형<br/>3NF]
B --> B1[원자값만 허용<br/>리스트 형태 금지]
C --> C1[부분 함수 종속 제거]
D --> D1[이행 함수 종속 제거]
정규화 비유: 서랍장 정리 - 1정규형: 한 칸에 한 종류의 물건만 - 2정규형: 관련 있는 것들끼리 분리 - 3정규형: 직접적 관련성만 유지
8. 실전 문제 해결¶
8.1 LeetCode 예제¶
-- 문제: 저지방이면서 재활용 가능한 제품 찾기
SELECT product_id
FROM Products
WHERE low_fats = 'Y' AND recyclable = 'Y';
8.2 성능 최적화 팁¶
-- 인덱스 활용
CREATE INDEX idx_price ON products(price);
-- JOIN 순서 최적화 (ON 조건을 WHERE보다 먼저)
SELECT p.name, c.category_name
FROM products p
JOIN categories c ON p.category_id = c.id -- 먼저 처리
WHERE p.price > 1000; -- 나중에 처리
9. 용어 정리표¶
용어 | 영어 원문 | 설명 |
---|---|---|
DQL | Data Query Language | 데이터 조회 언어 (SELECT) |
DML | Data Manipulation Language | 데이터 조작 언어 (INSERT, UPDATE, DELETE) |
DDL | Data Definition Language | 데이터 정의 언어 (CREATE, ALTER, DROP) |
PK | Primary Key | 기본키 (고유 식별자) |
FK | Foreign Key | 외래키 (다른 테이블 참조) |
ACID | Atomicity, Consistency, Isolation, Durability | 트랜잭션 4대 속성 |
10. 데드락 방지 전략¶
sequenceDiagram
participant A as 트랜잭션 A
participant B as 트랜잭션 B
participant X as 테이블 X
participant Y as 테이블 Y
A->>X: 락 획득 ✓
B->>Y: 락 획득 ✓
A->>Y: 락 요청 ⏳
B->>X: 락 요청 ⏳
Note over A,B: 데드락 발생!
Note over A,B: MySQL이 하나를 롤백
데드락 비유: 좁은 다리에서 양쪽에서 차가 만나는 상황 - 해결책: 한쪽이 후진하여 길을 양보