[SQL] SQL 문법 정리
SQL이란 ?
SQL(Structured Query Language)은 관계형 데이터베이스에서 데이터를 관리하기 위한 표준 언어입니다. 데이터의 정의, 조작, 제어를 위한 다양한 명령어를 제공합니다.
SQL의 주요 특징:
- 선언적 언어: 무엇을 원하는지만 명시하면 됨
- 표준화된 언어: ANSI/ISO 표준을 따름
- 대소문자를 구분하지 않음 (데이터는 구분할 수 있음)
- 세미콜론(;)으로 문장을 구분
SQL 자료형
숫자형 자료형
-
INT
또는INTEGER
: 정수 (-2,147,483,648 ~ 2,147,483,647) -
BIGINT
: 큰 정수 -
DECIMAL(p,s)
: 고정 소수점 (p: 전체 자릿수, s: 소수점 자릿수) -
FLOAT
: 부동 소수점 -
DOUBLE
: 배정도 부동 소수점자료형 size range description TINYINT 1 Bytes -128 ~ 127 (signed)
0 ~ 255 (unsigned)아주 작은 정수
불린 값이나 상태 코드에 사용SMALLINT 2 Bytes -32,768 ~ 32,767 (signed)
0 ~ 65,535 (unsigned)작은 정수
카운터나 순서 번호에 사용MEDIUMINT 3 Bytes -8,388,608 ~ 8,388,607 (signed)
0 ~ 16,777,215 (unsigned)중간 크기 정수
MySQL 전용INT / INTEGER 4 Bytes -2,147,483,648 ~ 2,147,483,647 (signed)
0 ~ 4,294,967,295 (unsigned)표준 정수형
가장 일반적으로 사용BIGINT 8 Bytes -9,223,372,036,854,775,808 ~
9,223,372,036,854,775,807 (signed)큰 정수
타임스탬프, 큰 ID 값에 사용DECIMAL(p,s) /
NUMERIC(p,s)가변 정확한 고정 소수점 소수점 실수 표현
(p: 전체 자릿수, s: 소수점 자릿수)FLOAT 4 Bytes ±3.402823466E+38 (근사값) 단정도 부동소수점
과학적 계산에 사용DOUBLE / REAL 8 Bytes ±1.7976931348623157E+308 (근사값) 배정도 부동소수점
높은 정밀도가 필요한 계산
문자형 자료형
CHAR(n)
: 고정 길이 문자열VARCHAR(n)
: 가변 길이 문자열TEXT
: 긴 텍스트 데이터
날짜/시간형 자료형
-
DATE
: 날짜 (YYYY-MM-DD) -
TIME
: 시간 (HH:MM:SS) -
DATETIME
: 초 단위까지의 시간 정보 (YYYY-MM-DD HH:MM:SS), 타임존 처리하지 않음 -
TIMESTAMP
: 타임스탬프,TIMESTAMP
는 타임존 자동 변환 처리를 지원합니다.자료형 size range description DATE 3 Bytes 1000-01-01 ~ 9999-12-31 연·월·일(YYYY-MM-DD) 저장 DATETIME 5 Bytes
(8 Bytes)1000-01-01 00:00:00 ~
9999-12-31 23:59:59날짜와 시간을 함께 저장 (표준, 시간대 정보 없음) TIMESTAMP 4 Bytes 1970-01-01 00:00:01 UTC ~
2038-01-19 03:14:07 UTC날짜와 시간 저장
(UTC 기반, 시스템 시간대에 따라 변환됨)TIME 3 Bytes -838:59:59 ~ 838:59:59 시:분:초 (HH:MM:SS), 경과 시간도 표현 가능 YEAR 1 Bytes 1901 ~ 2155 연도(YYYY) 저장
기타 자료형
BOOLEAN
: 참/거짓 값BLOB
: 이진 데이터 (이미지, 미디어 같은 Binary 데이터 저장)SET
: 다중 선택 타입ENUM
: 단일 선택 타입 (미리 선택한 리스트중 한가지 선택해서 저장)
DDL (Data Definition Language)
DDL은 데이터베이스 구조를 정의하고 수정하는 언어입니다.
CREATE TABLE 예시:
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
age INT,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ALTER
테이블 구조를 수정하는 명령어입니다.
컬럼 추가:
ALTER TABLE students ADD COLUMN phone VARCHAR(20);
컬럼 수정:
ALTER TABLE students MODIFY COLUMN age SMALLINT;
ALTER TABLE students CHANGE COLUMN age student_age INT;
컬럼 삭제:
ALTER TABLE students DROP COLUMN phone;
제약조건 추가/삭제:
-- 제약조건 추가
ALTER TABLE students ADD CONSTRAINT fk_student_class
FOREIGN KEY (class_id) REFERENCES classes(id);
-- 제약조건 삭제
ALTER TABLE students DROP CONSTRAINT fk_student_class;
DROP, TRUNCATE
- DROP: 테이블 자체를 완전히 삭제합니다 (구조와 데이터 모두 삭제)
- TRUNCATE: 테이블 구조는 유지하고 모든 데이터만 삭제합니다
-- 테이블 완전 삭제
DROP TABLE students;
-- 테이블 내용만 삭제 (구조 유지)
TRUNCATE TABLE students;
DROP과 TRUNCATE의 차이점:
- DROP: 테이블 자체가 사라짐, 롤백 불가
- TRUNCATE: 테이블 구조 유지, 빠른 삭제, 롤백 불가
- DELETE: 조건부 삭제 가능, 롤백 가능, 상대적으로 느림
DELETE
특정 조건에 맞는 행을 삭제하는 명령어입니다.
-- 모든 데이터 삭제
DELETE FROM students;
-- 조건부 삭제
DELETE FROM students WHERE age < 18;
-- 여러 조건으로 삭제
DELETE FROM students WHERE age > 25 AND name LIKE 'Kim%';
외래 키 제약 조건 해제/설정
외래 키 제약 조건을 일시적으로 해제하여 데이터 조작을 수행할 때 사용합니다.
-- 외래 키 제약 조건 해제
SET foreign_key_checks = 0;
-- 테이블 삭제 또는 데이터 조작
DROP TABLE students;
-- 외래 키 제약 조건 재설정
SET foreign_key_checks = 1;
DML (Data Manipulation Language)
DML은 데이터를 조작하는 언어입니다.
SELECT (데이터 조회)
-- 기본 조회
SELECT * FROM students;
-- 특정 컬럼 조회
SELECT name, age FROM students;
-- 조건부 조회
SELECT * FROM students WHERE age >= 20;
-- 정렬
SELECT * FROM students ORDER BY age DESC;
-- 그룹화 및 집계
SELECT age, COUNT(*) FROM students GROUP BY age;
-- 조인
SELECT s.name, c.class_name
FROM students s
JOIN classes c ON s.class_id = c.id;
INSERT (데이터 삽입)
-- 단일 행 삽입
INSERT INTO students (name, age, email)
VALUES ('김철수', 22, 'kim@email.com');
-- 여러 행 삽입
INSERT INTO students (name, age) VALUES
('이영희', 23),
('박민수', 21),
('최지원', 24);
UPDATE (데이터 수정)
-- 조건부 수정
UPDATE students SET age = 25 WHERE name = '김철수';
-- 여러 컬럼 수정
UPDATE students
SET age = 26, email = 'newemail@email.com'
WHERE id = 1;
DCL (Data Control Language)
DCL은 데이터에 대한 접근 권한을 제어하는 언어입니다.
GRANT (권한 부여)
-- 특정 테이블에 대한 SELECT 권한 부여
GRANT SELECT ON students TO user1;
-- 모든 권한 부여
GRANT ALL PRIVILEGES ON database_name.* TO user1;
-- 특정 권한 부여
GRANT SELECT, INSERT, UPDATE ON students TO user1;
REVOKE (권한 해제)
-- 권한 해제
REVOKE SELECT ON students FROM user1;
-- 모든 권한 해제
REVOKE ALL PRIVILEGES ON database_name.* FROM user1;
사용자 관리
-- 사용자 생성
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
-- 사용자 삭제
DROP USER 'username'@'localhost';
TCL (Transaction Control Language)
TCL은 트랜잭션을 제어하는 언어입니다.
트랜잭션의 ACID 속성
- Atomicity(원자성): 트랜잭션은 모두 실행되거나 모두 실행되지 않음
- Consistency(일관성): 트랜잭션 실행 후에도 데이터 무결성 유지
- Isolation(격리성): 동시 실행 트랜잭션들이 서로 영향을 주지 않음
- Durability(지속성): 완료된 트랜잭션의 결과는 영구적으로 저장
트랜잭션 명령어
-- 트랜잭션 시작
START TRANSACTION;
-- 또는
BEGIN;
-- 작업 수행
INSERT INTO students (name, age) VALUES ('홍길동', 20);
UPDATE students SET age = 21 WHERE name = '김철수';
-- 트랜잭션 확정 (커밋)
COMMIT;
-- 트랜잭션 취소 (롤백)
ROLLBACK;
SAVEPOINT (저장점)
START TRANSACTION;
INSERT INTO students (name, age) VALUES ('user1', 20);
-- 저장점 설정
SAVEPOINT sp1;
INSERT INTO students (name, age) VALUES ('user2', 21);
-- 저장점으로 롤백
ROLLBACK TO SAVEPOINT sp1;
COMMIT;
AUTO COMMIT 설정
-- 자동 커밋 해제
SET autocommit = 0;
-- 자동 커밋 설정
SET autocommit = 1;