본문 바로가기
Database/Database

SQL(1)

by curious week 2025. 3. 28.

 

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와 유사하지만 느림)

'Database > Database' 카테고리의 다른 글

SQL(3)  (0) 2025.03.28
SQL(2)  (0) 2025.03.28
관계형 모델  (1) 2025.03.14
데이터 베이스 모델링  (0) 2025.03.14
데이터베이스 개요  (1) 2025.03.05