MySQL을 처음 배우거나, 실무에서 빠르게 명령어를 찾아보고 싶을 때 활용할 수 있도록 카테고리별로 정리한 치트시트입니다. 각 명령어에는 간단한 설명을 함께 달았으니, 북마크해 두고 필요할 때마다 참고하세요.
📌 목차
1. 데이터베이스 관리
가장 기본이 되는 데이터베이스 생성, 선택, 삭제 명령어입니다.
-- 현재 서버에 존재하는 모든 데이터베이스 목록 조회
SHOW DATABASES;
-- 새 데이터베이스 생성
CREATE DATABASE mydb;
-- 사용할 데이터베이스 선택 (이후 쿼리는 해당 DB에서 실행됨)
USE mydb;
-- 데이터베이스 삭제 (IF EXISTS: 존재하지 않아도 에러 발생하지 않음)
DROP DATABASE IF EXISTS mydb;
💡 Tip: CREATE DATABASE 시 문자셋을 명시하면 한글 등 다국어 데이터를 안전하게 저장할 수 있습니다.
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 테이블 관리
테이블의 생성, 구조 확인, 수정, 삭제까지 DDL(Data Definition Language) 명령어를 다룹니다.
2-1. 테이블 생성 및 조회
-- 현재 데이터베이스의 모든 테이블 목록 조회
SHOW TABLES;
-- 테이블 생성
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY, -- 자동 증가 기본키
name VARCHAR(50) NOT NULL, -- 이름 (필수)
email VARCHAR(100) UNIQUE NOT NULL, -- 이메일 (유니크 + 필수)
age INT DEFAULT 0, -- 나이 (기본값 0)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 생성 시각 (자동 기록)
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP -- 수정 시각 (자동 갱신)
);
2-2. 테이블 구조 확인
-- 테이블의 컬럼 정보(타입, NULL 여부, 키 등) 간단히 조회
DESCRIBE users;
-- 테이블 생성 쿼리 전체를 확인 (엔진, 문자셋 등 포함)
SHOW CREATE TABLE users;
2-3. 테이블 구조 변경 (ALTER TABLE)
-- 컬럼 추가
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 컬럼 삭제
ALTER TABLE users DROP COLUMN phone;
-- 컬럼 타입 변경 (이름은 유지)
ALTER TABLE users MODIFY age SMALLINT;
-- 컬럼 이름 + 타입 동시 변경
ALTER TABLE users CHANGE name full_name VARCHAR(100);
-- 테이블 이름 변경
ALTER TABLE users RENAME TO members;
2-4. 테이블 삭제
-- 테이블 삭제 (IF EXISTS: 존재하지 않아도 에러 없음)
DROP TABLE IF EXISTS members;
⚠️ 주의: DROP TABLE은 테이블 구조와 데이터를 모두 삭제합니다. 운영 환경에서는 반드시 백업 후 실행하세요.
3. 데이터 삽입 (INSERT)
테이블에 새로운 데이터를 추가하는 DML(Data Manipulation Language) 명령어입니다.
-- 여러 행 한 번에 삽입 (권장: 단건 INSERT보다 성능이 좋음)
INSERT INTO users (name, email, age) VALUES
('홍길동', 'hong@example.com', 30),
('김철수', 'kim@example.com', 25),
('이영희', 'lee@example.com', 28);
-- SET 구문을 사용한 단건 삽입 (컬럼=값 형태로 직관적)
INSERT INTO users SET name='박민수', email='park@example.com', age=35;
💡 Tip: 대량 데이터 삽입 시에는 LOAD DATA INFILE이나 INSERT INTO ... SELECT 구문을 활용하면 훨씬 빠릅니다.
4. 데이터 조회 (SELECT)
가장 많이 사용하는 조회 명령어와 다양한 조건 필터링 방법입니다.
-- 전체 데이터 조회
SELEC * ROM users;
-- 특정 컬럼만 조회 + 조건(WHERE) + 정렬(ORDER BY)
-- age가 25 이상인 사용자를 나이 내림차순으로 조회
SELECT name, email, age
FROM users
WHERE age >= 25
ORDER BY age DESC;
-- 패턴 검색 (LIKE) + 다중 조건 (OR)
-- 이름에 '길'이 포함되거나 이메일에 'example'이 포함된 사용자
SELEC * ROM users
WHERE name LIKE '%길%' OR email LIKE '%example%';
-- 집계 함수: 전체 행 수
SELECT COUNT(*) AS total FROM users;
-- 집계 함수: 평균 나이
SELECT AVG(age) AS avg_age FROM users;
-- 페이지네이션: 1페이지 (0번째부터 10개)
SELEC * ROM users LIMIT 10 OFFSET 0;
-- 중복 제거: 고유한 나이 값만 조회
SELECT DISTINCT age FROM users;
💡 Tip: OFFSET은 0부터 시작합니다. N페이지 조회 시 OFFSET = (N - 1 * IMIT 으로 계산하면 됩니다.
5. 조인 (JOIN)
두 개 이상의 테이블을 연결하여 데이터를 조회하는 방법입니다.
5-1. 조인용 테이블 생성
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT, -- users 테이블의 id를 참조
amount DECIMAL(10,2), -- 주문 금액
order_date DATE, -- 주문 일자
FOREIGN KEY (user_id) REFERENCES users(id) -- 외래키 설정
);
-- 주문 데이터 삽입
INSERT INTO orders (user_id, amount, order_date)
VALUES (1, 100000, '2025-12-01');
5-2. INNER JOIN 실행
-- users와 orders를 user_id로 연결하여 조회
SELECT u.name, o.amount, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id;
💡 JOIN 종류 한눈에 보기
| 종류 | 설명 |
|---|---|
| INNER JOIN | 양쪽 테이블에 모두 일치하는 데이터만 반환 |
| LEFT JOIN | 왼쪽 테이블 전체 + 오른쪽 일치 데이터 (없으면 NULL) |
| RIGHT JOIN | 오른쪽 테이블 전체 + 왼쪽 일치 데이터 (없으면 NULL) |
| CROSS JOIN | 양쪽 테이블의 모든 조합 (카테시안 곱) |
6. 데이터 수정 (UPDATE)
기존 데이터를 변경하는 명령어입니다.
-- 모든 사용자의 나이를 1 증가 (WHERE 조건 필수, 안전 모드 우회를 위해 id > 0 사용)
UPDATE users SET age = age + 1 WHERE id > 0;
-- 이메일이 NULL인 사용자에게 이름 기반 이메일 자동 설정
UPDATE users SET email = CONCAT(name, '@example.com') WHERE email IS NULL;
⚠️ 주의: MySQL의 Safe Updates 모드(sql_safe_updates)가 켜져 있으면, WHERE 절에 키 컬럼을 포함하지 않는 UPDATE/DELETE는 실행되지 않습니다. 의도적으로 전체 수정이 필요한 경우 WHERE id > 0과 같은 조건을 추가하세요.
7. 데이터 삭제 (DELETE)
테이블에서 데이터를 삭제하는 방법입니다.
-- 특정 행 삭제
DELETE FROM users WHERE id = 1;
-- 조건에 맞는 행 삭제
DELETE FROM users WHERE age < 20;
-- 테이블의 모든 데이터 초기화 (구조는 유지, AUTO_INCREMENT도 초기화)
TRUNCATE TABLE users;
💡 DELETE vs TRUNCATE 차이점
| 구분 | DELETE | TRUNCATE |
|---|---|---|
| 롤백 가능 여부 | ✅ 가능 (트랜잭션 내) | ❌ 불가능 |
| WHERE 조건 | ✅ 사용 가능 | ❌ 사용 불가 |
| 속도 | 상대적으로 느림 | 매우 빠름 |
| AUTO_INCREMENT | 유지됨 | 초기화됨 |
8. 인덱스 (INDEX)
조회 성능을 향상시키기 위한 인덱스 관리 명령어입니다.
-- 일반 인덱스 생성 (중복 허용)
CREATE INDEX idx_email ON users(email);
-- 유니크 인덱스 생성 (중복 불허)
CREATE UNIQUE INDEX idx_name ON users(name);
-- 테이블에 설정된 인덱스 목록 조회
SHOW INDEX FROM users;
-- 인덱스 삭제
DROP INDEX idx_email ON users;
💡 Tip: 인덱스는 SELECT 성능을 높여주지만, INSERT/UPDATE/DELETE 시에는 인덱스 갱신 비용이 발생합니다. 자주 조회하는 컬럼에만 선별적으로 적용하세요.
9. 그룹화 & 집계
GROUP BY와 HAVING을 활용한 데이터 그룹화 및 조건 필터링입니다.
-- 나이별 그룹화 후, 인원이 2명 이상인 그룹만 조회
SELECT age,
COUNT(*) AS count,
AVG(age) AS avg
FROM users
GROUP BY age
HAVING count > 1;
💡 WHERE vs HAVING
WHERE: 그룹화 이전에 개별 행을 필터링
HAVING: 그룹화 이후에 그룹 결과를 필터링
10. 뷰 (VIEW)
자주 사용하는 쿼리를 가상 테이블로 저장하여 재사용할 수 있습니다.
-- 25세 이상 사용자만 보여주는 뷰 생성
CREATE VIEW user_summary AS
SELECT name, age FROM users WHERE age >= 25;
-- 뷰 조회 (일반 테이블처럼 사용)
SELEC * ROM user_summary;
-- 뷰 삭제
DROP VIEW IF EXISTS user_summary;
💡 Tip: 뷰는 실제 데이터를 저장하지 않고 쿼리 결과를 가상 테이블로 보여주는 것이므로, 원본 테이블의 데이터가 변경되면 뷰의 결과도 자동으로 반영됩니다.
11. 저장 프로시저 (Stored Procedure)
자주 사용하는 SQL 로직을 서버 측에 저장하고, 이름으로 호출할 수 있는 기능입니다.
-- 프로시저 생성: 입력받은 나이 이상의 사용자 조회
DELIMITER //
CREATE PROCEDURE GetUsersByAge(IN min_age INT)
BEGIN
SELEC * ROM users WHERE age >= min_age;
END //
DELIMITER ;
-- 프로시저 호출
CALL GetUsersByAge(25);
-- 프로시저 삭제
DROP PROCEDURE IF EXISTS GetUsersByAge;
💡 Tip: DELIMITER //는 프로시저 본문 안의 세미콜론(;)이 구문 종료로 인식되지 않도록 임시로 구분자를 변경하는 것입니다. 프로시저 정의가 끝나면 DELIMITER ;로 다시 복원합니다.
12. 트랜잭션 (Transaction)
여러 SQL 문을 하나의 작업 단위로 묶어, 전체 성공 또는 전체 취소를 보장합니다.
-- 트랜잭션 시작
START TRANSACTION;
-- 작업 1: 데이터 삽입
INSERT INTO users (name, email, age) VALUES ('테스트', 'test@example.com', 20);
-- 작업 2: 데이터 수정
UPDATE users SET age = 21 WHERE name = '테스트';
-- 모든 작업이 정상이면 확정
COMMIT;
-- 문제가 발생했다면 모든 작업을 되돌림
-- ROLLBACK;
💡 ACID 원칙: 트랜잭션은 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장합니다. 금융 거래, 재고 처리 등 데이터 정합성이 중요한 작업에 필수적으로 사용됩니다.
13. 백업 & 복원
데이터 유실에 대비한 백업과 복원은 터미널(CLI)에서 실행합니다.
# 데이터베이스 백업 (SQL 파일로 내보내기)
mysqldump -u root -p mydb > backup.sql
# 데이터베이스 복원 (SQL 파일 가져오기)
mysql -u root -p mydb < backup.sql
💡 Tip:
전체 데이터베이스 백업: mysqldump -u root -p --all-databases > all_backup.sql
특정 테이블만 백업: mysqldump -u root -p mydb users > users_backup.sql
운영 환경에서는 crontab을 활용한 자동 백업 스케줄링을 권장합니다.
14. 사용자 관리 & 권한
데이터베이스 접근 사용자를 생성하고, 적절한 권한을 부여/회수하는 방법입니다.
-- 사용자 생성
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'password123';
-- 특정 권한만 부여 (SELECT, INSERT, UPDATE)
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'dev'@'localhost';
-- 모든 권한 부여
GRANT ALL PRIVILEGES ON mydb.* TO 'dev'@'localhost';
-- 권한 변경 사항을 즉시 반영
FLUSH PRIVILEGES;
-- 사용자에게 부여된 권한 확인
SHOW GRANTS FOR 'dev'@'localhost';
-- 모든 권한 회수
REVOKE ALL PRIVILEGES ON mydb.* FROM 'dev'@'localhost';
-- 사용자 삭제
DROP USER 'dev'@'localhost';
⚠️ 보안 Tip: 운영 환경에서는 절대로 ALL PRIVILEGES를 남용하지 마세요. 최소 권한 원칙(Principle of Least Privilege)에 따라 필요한 권한만 부여하는 것이 안전합니다.
15. 상태 확인 & 시스템
서버 상태 모니터링 및 기본 시스템 정보 확인 명령어입니다.
-- 현재까지의 연결 수 등 상태 변수 조회
SHOW STATUS LIKE 'Connections%';
-- MySQL 버전 관련 시스템 변수 조회
SHOW VARIABLES LIKE 'version%';
-- MySQL 버전 확인
SELECT VERSION();
-- 현재 사용 중인 데이터베이스 확인
SELECT DATABASE();
-- 서버 상태 요약 정보 (연결 정보, 버전, 스레드 등)
STATUS;
-- MySQL 종료
EXIT;
마무리
주요 카테고리별 요약
| 카테고리 | 핵심 키워드 |
|---|---|
| 데이터베이스/테이블 관리 | CREATE, ALTER, DROP, SHOW |
| 데이터 조작 (CRUD) | INSERT, SELECT, UPDATE, DELETE |
| 조회 심화 | JOIN, GROUP BY, HAVING, LIKE, LIMIT |
| 성능 & 재사용 | INDEX, VIEW, Stored Procedure |
| 안정성 & 보안 | TRANSACTION, GRANT, REVOKE, mysqldump |
'💡 Tech Note' 카테고리의 다른 글
| 이클립스(Eclipse) 단축키 총정리: 개발 생산성을 높이는 필수 가이드 (0) | 2026.04.13 |
|---|---|
| Git 명령어 완벽 가이드: 초기 설정부터 협업까지 (0) | 2026.04.13 |
| IntelliJ IDEA 단축키 완벽 가이드: 생산성을 2배로 높이는 필수 단축키 모음 (0) | 2026.04.13 |
| ✅ 노션(Notion) 단축키 & 마크다운 완벽 가이드: 생산성을 2배로 높이는 방법 (0) | 2026.04.13 |
| PPT 단축키 총정리 | 파워포인트 작업 속도 2배 올리는 필수 단축키 모음 (0) | 2026.04.13 |