[MariaDB] SQL문 - DDL

이지연·2025년 11월 20일
post-thumbnail

개요

이번 포스팅에서는 데이터베이스 서버에서 테이블과 스키마를 설계·정리할 때 자주 사용하는 DDL(Data Definition Language) 명령어들을
실제 예제 중심의 치트시트 형태로 정리해보겠다.
스키마 생성/삭제부터 테이블 생성·수정·삭제까지, “DB 구조를 만드는 일”에 해당하는 필수 명령들을 한 번에 훑어본다.


스키마 생성 / 조회 / 삭제 / 선택

1) 스키마 생성

-- myapp 이라는 스키마 생성
CREATE DATABASE myapp;
  • 프로젝트마다 별도의 스키마(Database)를 만들어 테이블들을 묶어 관리한다.

2) 스키마 목록 조회

SHOW DATABASES;
  • 현재 MySQL 서버에 존재하는 모든 스키마 목록을 보여준다.

3) 스키마 삭제

DROP DATABASE myapp;
  • 스키마 안의 모든 테이블과 데이터가 함께 삭제되므로, 실제 운영 환경에서는 매우 주의해야 한다.

4) 스키마 선택

USE myapp;
  • 이후 실행되는 CREATE TABLE, SELECT, ALTER TABLE 등은 모두 myapp 스키마를 기준으로 동작한다.

5) 현재 스키마의 테이블 목록 조회

SHOW TABLES;
  • USE myapp; 를 먼저 실행한 뒤에 SHOW TABLES; 를 사용해야 원하는 스키마 기준의 테이블 목록이 나온다.

문자 인코딩 확인 & 변경

서비스를 실제로 운영할 때는 문자 인코딩(특히 한글) 설정이 매우 중요하다.

1) 서버 문자셋 확인

SHOW VARIABLES LIKE 'character_set_server';
  • MySQL 서버 전체의 기본 문자셋을 확인한다.

2) DB 기본 문자셋 변경

ALTER DATABASE myapp DEFAULT CHARACTER SET = utf8mb4;
  • 스키마 기본 문자셋을 utf8mb4 로 맞추는 것을 권장한다.
  • 이 설정을 기반으로 새로 생성되는 테이블/컬럼의 기본 인코딩이 결정된다.

테이블 생성 / 구조 조회 / 데이터 조회

1) 테이블 생성 기본 형식

CREATE TABLE 테이블이름 (
  필드이름1 필드타입1 [제약조건],
  필드이름2 필드타입2 [제약조건],
  ...
  [테이블 제약조건]  -- PK, FK 등
);

예시: 회원 테이블 생성

CREATE TABLE member (
  id         INT AUTO_INCREMENT PRIMARY KEY,   -- 기본 키
  email      VARCHAR(100) NOT NULL UNIQUE,     -- 이메일, 중복 불가
  name       VARCHAR(50)  NOT NULL,           -- 이름
  created_at DATETIME      DEFAULT NOW()       -- 생성 일시
);
  • AUTO_INCREMENT + PRIMARY KEY 조합으로 PK를 구성한다.
  • UNIQUE 로 이메일 중복을 방지한다.
  • DEFAULT NOW() 를 사용하면 레코드 생성 시각이 자동으로 들어간다.

2) 테이블 구조(컬럼 정보) 조회

DESCRIBE member;
-- 또는
DESC member;
  • 컬럼 이름, 타입, NULL 허용 여부, 기본값, 키 정보(PK/UK) 등을 한 번에 확인할 수 있다.

3) 테이블 데이터 전체 조회

SELECT * FROM member;
  • DDL 확인 후 실제 데이터가 어떻게 들어갔는지 간단히 확인할 때 자주 쓰는 패턴이다.

4) 테이블 생성 DDL 조회

SHOW CREATE TABLE member;
  • MySQL이 내부적으로 기억하고 있는 실제 CREATE TABLE 문을 그대로 출력한다.
  • ORM에서 생성한 테이블 구조를 역으로 확인할 때 유용하다.

제약조건 / 인덱스 조회

1) information_schema로 제약조건 조회

SELECT *
FROM information_schema.key_column_usage
WHERE table_name = 'member';
  • 컬럼별로 어떤 키(Primary, Foreign, Unique 등)에 속해 있는지 메타데이터를 조회할 수 있다.
  • 여러 테이블 간 FK 관계를 분석할 때 유용하다.

2) 인덱스 조회

SHOW INDEX FROM member;
  • PK, Unique, 일반 인덱스 등 해당 테이블에 설정된 인덱스 목록과 컬럼 정보를 보여준다.
  • 쿼리 튜닝 또는 인덱스 구조 확인 시 자주 사용하는 명령이다.

테이블/컬럼 구조 변경 – ALTER TABLE

1) 테이블 이름 변경

ALTER TABLE member RENAME member_user;
  • 테이블의 물리 이름만 변경하고, 내부 데이터/컬럼 구조는 그대로 유지된다.

2) 컬럼 추가

ALTER TABLE member_user
ADD COLUMN age INT DEFAULT 0;
  • 기존 테이블에 새 컬럼을 추가한다.
  • DEFAULT 값을 지정하면 기존 레코드에 대해서도 해당 기본값이 채워진다.

3) 컬럼 삭제

ALTER TABLE member_user
DROP COLUMN age;
  • 컬럼 자체와 그 안의 데이터가 통째로 사라지므로, 운영 환경에서는 반드시 백업/검토 후 실행해야 한다.

4) 컬럼명 변경

ALTER TABLE member_user
CHANGE COLUMN name full_name VARCHAR(50) NOT NULL;
  • CHANGE COLUMN 기존이름 새이름 타입 제약 형태로 사용한다.
  • 이름뿐 아니라 타입/제약조건까지 함께 다시 정의해야 한다는 점이 포인트다.

5) 컬럼 타입/제약조건 변경 (이름은 그대로)

ALTER TABLE member_user
MODIFY COLUMN email VARCHAR(200) NOT NULL UNIQUE;
  • MODIFY COLUMN 은 컬럼 이름은 그대로 두고, 타입/길이/제약조건만 바꿀 때 사용한다.
  • 기존에 저장된 데이터가 새 타입/길이에 맞지 않으면 에러가 날 수 있으므로 주의가 필요하다.

테이블 삭제 – DROP TABLE

1) 기본 삭제

DROP TABLE member_user;
  • 해당 테이블과 테이블 안의 데이터가 완전히 삭제된다.
  • 테이블이 존재하지 않으면 에러가 발생하고, 이후 스크립트 실행이 중단될 수 있다.

2) 조건부 삭제

DROP TABLE IF EXISTS member_user;
  • 테이블이 있을 때만 삭제하고, 없으면 에러 없이 그냥 넘어간다.
  • 여러 DDL/DML을 한 번에 실행하는 초기화 스크립트에서
    이미 없는 테이블 때문에 전체가 실패하는 일을 막기 위해 IF EXISTS를 자주 사용한다.

차이 정리

  • DROP TABLE member_user;
    • 대상 테이블이 없으면 에러 발생 → 뒤 이어지는 SQL이 실행되지 않을 수 있다.
  • DROP TABLE IF EXISTS member_user;
    • 존재할 때만 삭제, 없으면 조용히 통과 → 배포/초기화 스크립트에서 안정적이다.

마치며

이번 글에서는 MySQL에서 자주 사용하는 DDL 치트시트
스키마 생성/삭제, 문자셋 설정, 테이블 생성/조회, 제약조건·인덱스 확인,
ALTER TABLE 로 구조 변경, DROP TABLE 로 정리하는 흐름까지 한 번에 정리해보았다.

서비스 개발 단계에서는 ERD를 보고 ORM으로만 테이블을 만들 때가 많지만,
운영/디버깅/마이그레이션 단계에서는 결국 순수 SQL DDL 명령어를 직접 다룰 일이 반드시 생긴다.

다음 글에서는 DDL에 이어, 실제 데이터를 넣고 수정·삭제하는
DML(INSERT, UPDATE, DELETE) 및 조회 쿼리 패턴까지 이어서 정리해보겠다.

profile
Eazy하게

1개의 댓글

comment-user-thumbnail
2025년 12월 11일

스키마에서 키랑 스를 절때 순서를 바꾸지마세요
극악무도한 키.스.마. 가 나올수있습니다…
허억~너무무서워
감사합니다

답글 달기