💡 Tech Note

MySQL 핵심 명령어 완벽 정리: 입문부터 실무까지

this.Serena 2026. 4. 13. 14:06

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 차이점

구분DELETETRUNCATE
롤백 가능 여부✅ 가능 (트랜잭션 내)❌ 불가능
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

⬆ 목차로 돌아가기