DataBase
[DATABASE] 데이터베이스 언어와 SQL
개발메모장
2025. 4. 29. 09:26
데이터베이스 언어란?
- 데이터베이스를 구축하고 이용하기 위한 통신 수단
- 데이터베이스 언어는 DBMS를 통해 사용되며, 기능과 목적에 따라 데이터 정의 언어(DDL), 데이터 조작 언어(DML), 데이터 제어 언어(DCL), 트랜잭션 제어 언어(TCL)로 구분된다.
데이터 정의 언어(DDL) - Data Definition Language
- 테이블, 스키마 등 구조를 정의하고 변경하는 명령어
명령어 |
설명 |
CREATE |
테이블, 데이터베이스, 인덱스 등을 생성 |
ALTER |
기존 구조를 수정 (컬럼 추가/삭제 등) |
DROP |
테이블이나 데이터베이스 삭제 |
TRUNCATE |
테이블의 모든 데이터 삭제 (구조는 유지) |
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
데이터 조작 언어(DML) - Data Manipulation Language
명령어 |
설명 |
SELECT |
데이터 조회 |
INSERT |
데이터 삽입 |
UPDATE |
데이터 수정 |
DELETE |
데이터 삭제 |
INSERT INTO users (id, name) VALUES (1, '홍길동');
SELECT * FROM users;
UPDATE users SET name = '홍길동' WHERE id = 1;
DELETE FROM users WHERE id = 1;
데이터 제어 언어(DCL) - Data Control Language
명령어 |
설명 |
GRANT |
권한 부여 |
REVOKE |
권한 회수 |
GRANT SELECT, INSERT ON users TO 홍길동;
REVOKE INSERT ON users FROM 홍길동;
트랜잭션 제어 언어(TCL) - Transaction Control Language
- 여러 SQL 작업들을 하나의 트랜잭션 단위로 묶어서 성공시 저장(COMMIT), 문제 발생시 취소(ROLLBACK) 하게 해주는 명령어
명령어 |
설명 |
BEGIN / START TRANSACTION |
트랜잭션 시작 |
COMMIT |
지금까지의 작업을 확정(저장) |
ROLLBACK |
지금까지의 작업을 취소(되돌림) |
SAVEPOINT |
롤백할 수 있는 중간 지점 저장 |
ROLLBACK TO SAVEPOINT |
특정 지점까지 되돌리기 |
SET TRANSACTION |
트랜잭션 격리 수준 설정 |
-- 트랜잭션 시작
BEGIN;
-- SAVEPOINT 설정 (중간 저장 지점)
SAVEPOINT before_transfer;
-- A 계좌에서 100원 차감
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
-- B 계좌에 100원 추가
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';
-- 오류가 없으면 트랜잭션 확정
COMMIT;
-- 만약 중간에 문제 생기면 아래 실행 (예시 상황)
-- ROLLBACK TO before_transfer;
-- 또는 전부 취소
-- ROLLBACK;
SQL문의 실행순서
- SQL문은 우리가 작성하는것과 실제 동작되서 실행되는 순서가 다르다
SQL 작성 순서
SELECT 컬럼
FROM 테이블
JOIN 다른테이블 ON 조건
WHERE 조건
GROUP BY 컬럼
HAVING 조건 -- GROUP BY와 세트
ORDER BY 정렬기준
LIMIT, OFFSET -- RDBMS 마다 지원 여부가 다름
SQL 실행 순서
순서 |
절 |
설명 |
1 |
FROM |
어떤 테이블에서 데이터를 가져올지 |
2 |
JOIN, ON |
테이블을 연결하고 데이터를 합침 |
3 |
WHERE |
조건에 맞는 행만 필터링 |
4 |
GROUP BY |
남은 행을 그룹으로 묶음 |
5 |
HAVING |
그룹에 대한 조건 필터링 (집계조건), GROUP BY와 세트 |
6 |
SELECT |
최종적으로 보여줄 컬럼을 선택 |
7 |
ORDER BY |
결과를 정렬 |
8 |
LIMIT, OFFSET |
정렬된 결과에서 N개만 남김 |
WHERE 조건과 HAVING 조건의 차이점
항목 |
WHERE |
HAVING |
처리시점 |
GROUP BY 이전 |
GROUP BY 이후 |
대상 |
개별 행(ROW) |
집계된 그룹(GROUP) |
사용 가능 조건 |
일반 조건(=, !=, >,<,<> 등) |
집계함수 포함 조건 가능(AVG(), COUNT() 등) |
주 용도 |
데이터 선필터링 |
그룹핑 후 필터링 |
예시)
WHERE: 개별 점수가 70점 이상인 데이터만
SELECT *
FROM STUDENT_SCORE
WHERE score >= 70;
HAVING: 과목별 평균 점수가 70 이상인 과목만
SELECT subject, AVG(score) AS avg_score
FROM STUDENT_SCORE
GROUP BY subject
HAVING AVG(score) >= 70;
같이 사용하는 경우: 개별점수가 60점 이상이고 과목별 평균 점수가 70이상인 과목
SELECT subject, AVG(score) AS avg_score
FROM STUDENT_SCORE
WHERE score >= 60 -- 60점 이상(낮은 점수는 아예 빼고)
GROUP BY subject
HAVING AVG(score) >= 70; -- 평균 70점이상(과목별 평균 점수가 높은 것만 추림)