1. SQL 명령어의 종류
DDL | Data Definition Language | 데이터베이스 구조를 정의하거나 변경하는 언어 |
DML | Data Manipulation Language | 데이터를 조작하는 언어 (조회, 삽입, 수정, 삭제) |
DCL | Data Control Language | 데이터베이스에 대한 권한 제어와 보안 관리 |
2. DDL (데이터 정의 언어)
데이터베이스 객체를 생성/변경/삭제할 때 사용
주요 객체
- 스키마(Schema) = 데이터베이스(DB)
- 테이블(Table) = 실제 데이터 저장 구조
- 뷰(View) = SELECT 문 결과를 가상의 테이블처럼 사용
- 인덱스(Index) = 검색 속도 향상
- 시퀀스(Sequence) = 자동 번호 생성
주요 명령어
CREATE | 객체 생성 | CREATE TABLE, CREATE DATABASE |
ALTER | 객체 구조 변경 | ALTER TABLE ADD COLUMN |
DROP | 객체 삭제 | DROP TABLE, DROP INDEX |
스키마 = 데이터베이스
-- 데이터베이스 생성
CREATE DATABASE mydb;
-- 데이터베이스 삭제
DROP DATABASE mydb;
3. DML (데이터 조작 언어)
테이블에 저장된 실제 데이터를 조작하는 명령어
SELECT | 데이터 조회 | SELECT * FROM Student; |
INSERT | 데이터 삽입 | INSERT INTO Student VALUES (1, '철수', 20, '2024-03-01'); |
UPDATE | 데이터 수정 | UPDATE Student SET age = 21 WHERE id = 1; |
DELETE | 데이터 삭제 | DELETE FROM Student WHERE id = 1; |
4. DCL (데이터 제어 언어)
사용자에게 권한을 부여하거나 회수하는 명령어
GRANT | 권한 부여 | GRANT SELECT ON Student TO user1; |
REVOKE | 권한 회수 | REVOKE SELECT ON Student FROM user1; |
5. 릴레이션 vs 테이블
릴레이션(Relation) | 테이블(Table) |
논리적/추상적 구조 | 물리적 저장 구조 |
관계형 모델 이론 | 실제 DBMS에서 사용하는 실체 |
수학적 관계 정의 | SQL 테이블 객체 |
예: 학생(학번, 이름, 학년)이라는 릴레이션이 있다면, DB에서는 Student 테이블로 구현됨
1. CREATE TABLE 기본 구조
CREATE TABLE 테이블이름 (
컬럼1 데이터타입 [제약조건],
컬럼2 데이터타입 [제약조건],
...
[PRIMARY KEY (컬럼명)],
[UNIQUE (컬럼명)],
[FOREIGN KEY (컬럼명) REFERENCES 다른테이블(컬럼)]
);
2. 제약조건 종류 (옵션으로 사용됨)
NOT NULL | 비어 있으면 안 됨 (필수 입력) |
PRIMARY KEY | 기본 키 (중복 X, NULL X) |
UNIQUE | 중복 X (NULL은 가능) |
DEFAULT | 기본값 지정 |
CHECK | 입력 값에 조건 걸기 |
FOREIGN KEY | 다른 테이블의 키 참조 |
예시: 회원(Member) 테이블
1. 회원 테이블
CREATE TABLE Member (
member_id INT NOT NULL,
username VARCHAR(20) NOT NULL UNIQUE,
password VARCHAR(50) NOT NULL,
email VARCHAR(50),
created_at DATE DEFAULT CURRENT_DATE,
PRIMARY KEY (member_id)
);
설명:
- member_id: 기본키, 필수
- username: 중복 불가 (UNIQUE), 필수
- password: 필수
- email: 선택 사항
- created_at: 기본값은 오늘 날짜
SQL 데이터 타입 정리
1. 문자형 (Character/String Types)
CHAR(n) | 고정 길이 문자열 (n글자) | CHAR(5) → 항상 5글자 공간 |
VARCHAR(n) | 가변 길이 문자열 (최대 n글자) | VARCHAR(50) |
TEXT | 매우 긴 문자열 (가변 길이) | 기사, 게시글 본문 등 |
CLOB | 수백 MB ~ 수 GB의 데이터 저장가능 레코드 단위가 아닌 별도의 저장 공간을 부여하는 외부 저장 방식 |
CHAR은 길이가 고정이라 짧은 데이터도 n자리를 차지
VARCHAR는 실제 입력된 길이만큼 공간 사용
2. 숫자형 (Numeric Types)
INT, INTEGER | 정수 (4바이트) | 학번, ID 등 |
SMALLINT | 작은 정수 (2바이트) | 점수, 순위 등 |
BIGINT | 큰 정수 (8바이트) | 조회수, 큰 ID |
DECIMAL(p, s) / NUMERIC(p, s) | 정밀도 있는 실수 (소수점 고정) | DECIMAL(5, 2) → 총 5자리 중 소수점 이하 2자리 |
FLOAT, REAL, DOUBLE | 부동 소수점 실수 | 과학/계산용 데이터 |
DECIMAL은 정확도 중요할 때 (ex. 돈), FLOAT는 근사값 계산에 적합
3. 날짜/시간형 (Date and Time Types)
DATE | 날짜 (년-월-일) (YYYY-MM0DD) | 2025-03-28 |
TIME | 시간 (시:분:초) (HH:MI:SS) | 13:45:00 |
DATETIME | 날짜 + 시간 (YYYY-MM-DD HH:MI:SS) | 2025-03-28 13:45:00 |
TIMESTAMP | 자동 시간 저장 (주로 생성/수정 시간 기록), 유닉스 시간 기반 1970 ~ 2038년 표현 가능 |
CURRENT_TIMESTAMP |
YEAR | 연도만 저장 (YYYY) | YEAR(4) → 2025 |
DATETIME과 TIMESTAMP는 거의 유사하지만, 타임존 처리 등에서 차이 있음 (DBMS마다 다름)
4. 불리언형 (Boolean Type)
BOOLEAN | 참 / 거짓 (TRUE, FALSE) | is_active BOOLEAN |
TINYINT(1) | MySQL에서 불리언 대신 사용되는 작은 정수 | 1: 참, 0: 거짓 |
5. 이진형 / 기타
BLOB | Binary Large Object (이미지, 동영상 등) | 파일 저장 시 |
ENUM('A', 'B', 'C') | 정해진 값만 선택 가능 | 성별 ENUM('M','F') |
SET | 여러 값 선택 가능 (MySQL 전용) | SET('A', 'B', 'C') |
데이터 타입 선택
이름, 이메일 등 텍스트 | VARCHAR(50~100) |
숫자 ID | INT 또는 BIGINT |
금액, 소수점 정확도 필요한 값 | DECIMAL(p, s) |
날짜 기록 | DATE, DATETIME, TIMESTAMP |
논리값 (true/false) | BOOLEAN 또는 TINYINT(1) |
긴 텍스트, 본문 등 | TEXT |
이미지, 파일 등 | BLOB |
ALTER TABLE 기본 구조 정리
기존 테이블에 컬럼 추가, 제약조건 추가/삭제, 이름 변경 등
ALTER TABLE 테이블이름
ADD 컬럼이름 데이터타입 [제약조건], -- 컬럼 추가
ADD [CONSTRAINT 제약조건이름] 제약조건,
DROP COLUMN 컬럼이름, -- 컬럼 삭제
DROP CONSTRAINT 제약조건이름, -- 제약조건 삭제
MODIFY 컬럼이름 데이터타입, -- 데이터타입 변경 (MySQL)
RENAME COLUMN 기존컬럼 TO 새컬럼, -- 컬럼 이름 변경 (DBMS마다 다름)
RENAME TO 새테이블이름; -- 테이블 이름 변경
사용법
1. 컬럼 추가
ALTER TABLE Member
ADD phone VARCHAR(20);
2. 컬럼 삭제 (컬럼의 삭제는 ALERT를 이용!!)
ALTER TABLE Member
DROP COLUMN phone;
3. 컬럼 타입/속성 수정 (MySQL 기준)
ALTER TABLE Member
MODIFY email VARCHAR(100) NOT NULL;
Oracle에서는 MODIFY,
PostgreSQL은 ALTER COLUMN ... TYPE 사용
4. 제약조건 추가
ALTER TABLE Student
ADD CONSTRAINT student_age_check CHECK (age >= 0);
이름 없이도 가능:
ALTER TABLE Student
ADD CHECK (age >= 0);
5. 기본키 추가
ALTER TABLE Student
ADD CONSTRAINT pk_student_id PRIMARY KEY (id);
6. 외래키 추가
ALTER TABLE Post
ADD CONSTRAINT fk_writer FOREIGN KEY (writer_id)
REFERENCES Member(member_id);
7. 제약조건 삭제
ALTER TABLE Student
DROP CONSTRAINT student_age_check;
MySQL에서는 이름 없이 정의된 제약조건은 삭제가 복잡할 수 있어 이름 붙여 두는 게 좋습니다.
8. 컬럼 이름 변경
(MySQL 8.0 이상 기준)
ALTER TABLE Student
RENAME COLUMN name TO full_name;
(Oracle 등은 RENAME 사용 불가 → RENAME 문 따로 씀)
9. 테이블 이름 변경
ALTER TABLE Student
RENAME TO StudentInfo;
1. 테이블 삭제 명령어
DROP TABLE
테이블 구조 + 데이터 전체 삭제 (완전 삭제)
DROP TABLE 테이블이름;
- 테이블이 완전히 제거됨 (컬럼, 제약조건, 데이터 전부 삭제)
- 삭제 후 복구 불가 (주의!)
- 외래키로 참조된 경우, 먼저 제약조건 제거 필요
DROP TABLE Member;
2. TRUNCATE TABLE
테이블 구조는 유지하고, 데이터만 전부 삭제
TRUNCATE TABLE 테이블이름;
- 데이터만 싹 비우는 명령어
- 테이블의 구조와 제약조건은 그대로 유지
- DELETE보다 훨씬 빠름 (로그 기록 거의 없음)
- 롤백 불가 (MySQL, Oracle의 경우 트랜잭션과 다르게 처리됨)
TRUNCATE TABLE LogHistory;
3. DELETE FROM
조건에 따라 테이블의 일부 또는 전부의 데이터를 삭제
DELETE FROM 테이블이름 WHERE 조건;
- WHERE 조건 없이 쓰면 → 모든 데이터 삭제
- 트랜잭션 지원됨 → ROLLBACK으로 복구 가능
- 삭제 후에도 테이블 구조와 제약조건 유지
DELETE FROM Member WHERE age < 18;
DELETE FROM Member; -- 전체 삭제 (TRUNCATE와 유사하지만 느림)