Data Systems
SQL 핵심 정리
SQL 핵심 정리 학습 내용을 정리한 백필 노트입니다.
이 글은 2025년 학습 기록을 블로그 형식으로 정리한 백필 노트입니다.
1. SQL 개요
SQL(Structured Query Language): 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 정의, 조회, 수정, 삭제하기 위해 사용하는 표준 언어
- 특징
- 선언적 언어: ‘무엇을 할 것인가’를 명시
- 표준화된 문법(SQL 표준)
- 대부분의 RDBMS(MySQL, Oracle, SQL Server, PostgreSQL 등)에서 지원
- SQL 분류
- DDL (Data Definition Language): 테이블, 뷰, 스키마 등 구조 정의
- CREATE, ALTER, DROP, TRUNCATE
- DML (Data Manipulation Language): 데이터 조작
- SELECT, INSERT, UPDATE, DELETE, MERGE
- DCL (Data Control Language): 권한 관리
- GRANT, REVOKE
- TCL (Transaction Control Language): 트랜잭션 관리
- COMMIT, ROLLBACK, SAVEPOINT
- DDL (Data Definition Language): 테이블, 뷰, 스키마 등 구조 정의
2. 데이터 정의(DDL)
- CREATE
- 테이블, 뷰, 인덱스 생성
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE DEFAULT CURRENT_DATE
);
- ALTER
- 테이블 구조 변경(컬럼 추가/삭제/수정)
ALTER TABLE employees ADD email VARCHAR(100);
ALTER TABLE employees MODIFY salary DECIMAL(12,2);
ALTER TABLE employees DROP COLUMN department;
- DROP & TRUNCATE
- DROP: 테이블 자체 삭제 (데이터 + 구조 모두 삭제)
- TRUNCATE: 데이터만 삭제, 구조는 유지
3. 데이터 조작(DML)
- SELECT
- 데이터 조회, 조건 및 정렬 가능
기본 조회
SELECT name, salary FROM employees;
조건 조회
SELECT * FROM employees WHERE salary > 5000 AND department='IT';
정렬
SELECT * FROM employees ORDER BY salary DESC;
집계 함수
- SUM, AVG, COUNT, MAX, MIN
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 4000;
JOIN
- 테이블 간 관계를 이용해 데이터 조회
- INNER JOIN: 공통 데이터만
- LEFT JOIN: 왼쪽 테이블 기준 모두
- RIGHT JOIN: 오른쪽 테이블 기준 모두
- FULL OUTER JOIN: 양쪽 모두
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d
ON e.department = d.dept_id;
서브쿼리
SELECT name FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
- INSERT
INSERT INTO employees (emp_id, name, department, salary)
VALUES (1, '홍길동', 'IT', 5000);
- UPDATE
UPDATE employees
SET salary = salary * 1.1
WHERE department = 'IT';
- DELETE
DELETE FROM employees
WHERE emp_id = 1;
4. 데이터 제어(DCL)
- GRANT
- 권한 부여
GRANT SELECT, INSERT ON employees TO user1;
- REVOKE
- 권한 회수
REVOKE INSERT ON employees FROM user1;
5. 트랜잭션 관리(TCL)
- 트랜잭션: 논리적 작업 단위
- ACID 특성
- Atomicity(원자성)
- Consistency(일관성)
- Isolation(독립성)
- Durability(영속성)
사용 예
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE acc_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE acc_id = 2;
COMMIT; -- 정상 완료
-- ROLLBACK; -- 오류 발생 시 취소
6. 인덱스와 성능 최적화
- 인덱스(Index): 조회 속도 향상, 읽기 빠름, 쓰기 느림
CREATE INDEX idx_salary ON employees(salary);
- 뷰(View): 자주 사용하는 SELECT문 재사용 가능
CREATE VIEW high_salary AS
SELECT name, salary FROM employees WHERE salary > 5000;
- 조인 최적화: 인덱스 활용, 서브쿼리 최소화, 필요 컬럼만 조회
7. 기타 고급 기능
- 제약조건
- PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
department INT REFERENCES departments(dept_id),
salary DECIMAL(10,2) CHECK(salary > 0)
);
- 함수 및 연산
- 문자열: CONCAT, SUBSTRING, LENGTH
- 숫자: ROUND, FLOOR, CEIL
- 날짜: NOW(), DATEADD(), DATEDIFF()
- 트리거(Trigger)
- 특정 이벤트 시 자동 실행
CREATE TRIGGER trg_salary_update
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO audit_log(emp_id, old_salary, new_salary)
VALUES (OLD.emp_id, OLD.salary, NEW.salary);
END;
8. 실무 시 유의점
- 데이터 무결성: 제약조건 활용
- 트랜잭션 처리: ROLLBACK/COMMIT 필수
- 인덱스 남용 주의: 삽입/업데이트 성능 저하
- JOIN 최적화: 서브쿼리 vs 조인 전략 선택
- SQL 표준 준수: 이식성을 위해 기본 SQL 문법 우선