목차

    불편함을 코드로 지웁니다.

    개발 공부 노트, 개발 도구와 문제를 해결한 과정, AI 프롬프트와 Obsidian 활용법을 정리합니다.

      💡 Tech Note

      MySQL 명령어

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

      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) : 테이블 생성, 구조 확인, 수정, 삭제

      • CREATE : 테이블 생성
      • DESC (DESCRIBE) : 테이블 구조 확인
      • ALTER : 테이블 구조 수정
      • DROP : 테이블 삭제

      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 : 데이터 삽입
      • SELECT : 데이터 조회
      • UPDATE : 데이터 수정
      • DELETE : 데이터 삭제

      -- 여러 행 한 번에 삽입 (권장: 단건 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;

      💡 대량 데이터 삽입 시 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;

      💡 OFFSET : 0부터 시작, N페이지 조회 시 OFFSET = (N - 1 * IMIT 으로 계산

      ⬆ 목차로 돌아가기

      5. 조인 (JOIN)

      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 절에 키(Key) 컬럼이 없는 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)

      INDEX : 조회 성능 향상을 위한 데이터 색인 생성, 수정, 삭제

      • CREATE INDEX : 인덱스 생성
      • SHOW INDEX : 테이블의 인덱스 정보 확인
      • ALTER INDEX : 인덱스 이름 변경 및 구조 수정
      • DROP 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;

      💡 인덱스 (Index)
      - SELECT 조회 성능 향상, 단 DML(INSERT/UPDATE/DELETE) 실행 시 갱신 비용 발생
      - 자주 조회하는 컬럼에 한해 선별적 적용

      ⬆ 목차로 돌아가기

      9. 그룹화 & 집계

      GROUP BY / HAVING : 데이터 그룹화 및 조건 필터링

      • GROUP BY : 특정 컬럼을 기준으로 데이터 그룹화 (주로 COUNT, SUM, AVG 등 집계 함수와 함께 사용)
      • HAVING : 그룹화된 데이터 결과에 대한 조건 필터링 (WHERE은 데이터 그룹화 전, 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)

      VIEW : 자주 사용하는 쿼리를 가상 테이블로 저장 및 재사용

      • CREATE VIEW : 뷰 생성
      • DROP 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;

      💡 뷰 (View)
      - 실제 데이터 저장 없이 쿼리 결과만 보여주는 가상 테이블
      - 원본 테이블 데이터 변경 시 뷰 결과 자동 반영

      ⬆ 목차로 돌아가기

      11. 저장 프로시저 (Stored Procedure)

      STORED PROCEDURE : 자주 사용하는 SQL 로직 서버 저장 및 호출

      • CREATE PROCEDURE : 프로시저 생성
      • CALL : 프로시저 호출 및 실행
      • DROP PROCEDURE : 프로시저 삭제

      -- 프로시저 생성: 입력받은 나이 이상의 사용자 조회
      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;

      💡 DELIMITER // :  프로시저 본문 내 세미콜론(;) 오인식 방지용 구분자 임시 변경
      - DELIMITER ; : 프로시저 정의 완료 후 기본 구분자 복원

      ⬆ 목차로 돌아가기

      12. 트랜잭션 (Transaction)

      TRANSACTION : 다수 SQL 문 단일 작업 단위 결합 및 무결성 보장

      • START TRANSACTION : 트랜잭션 시작
      • COMMIT : 작업 결과 영구 반영
      • ROLLBACK : 작업 취소 및 이전 상태 복구

      -- 트랜잭션 시작
      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. 백업 & 복원

      BACKUP & RESTORE : 데이터 유실 대비 터미널(CLI) 기반 백업 및 복원

      # 데이터베이스 백업 (SQL 파일로 내보내기)
      mysqldump -u root -p mydb > backup.sql
      
      # 데이터베이스 복원 (SQL 파일 가져오기)
      mysql -u root -p mydb < backup.sql
      • 백업 실행 : mysqldump -u root -p [DB명] > [파일명].sql
      • 복원 실행 : mysql -u root -p [DB명] < [파일명].sql
      • 전체 DB 백업 : 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';

      ⚠️ DCL(Data Control Language) : 사용자 생성 및 권한 관리

      • CREATE USER : 사용자 생성
      • GRANT : 권한 부여
      • REVOKE : 권한 회수
      • DROP USER : 사용자 삭제
      • 보안 팁 : 최소 권한 원칙(Principle of Least Privilege) 준수 및 운영 환경 내 ALL PRIVILEGES 남용 금지

      ⬆ 목차로 돌아가기

      15. 상태 확인 & 시스템

      SERVER MONITORING : 서버 상태 및 시스템 정보 확인

      • top / htop : 실시간 CPU 및 메모리 점유율 모니터링
      • df -h : 디스크 여유 공간 및 사용 현황 확인
      • du -sh : 디렉토리별 디스크 사용량 합계 조회
      • free -m : 물리 메모리 및 스왑 메모리 상태 확인
      • uptime : 시스템 가동 시간 및 평균 부하 확인
      • ps aux : 전체 프로세스 실행 현황 및 자원 점유 조회
      • netstat -ntlp / ss -ntlp : 네트워크 포트 활성화 및 연결 상태 확인
      • lscpu : CPU 아키텍처 및 상세 정보 조회
      • uname -a : 운영체제 버전 및 커널 정보 확인
      -- 현재까지의 연결 수 등 상태 변수 조회
      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' 카테고리의 다른 글

      옵티마이저(Optimizer)  (0) 2026.04.16
      [Shortcut] 이클립스(Eclipse)  (0) 2026.04.13
      Git 명령어  (0) 2026.04.13
      [Shortcut] IntelliJ IDEA  (0) 2026.04.13