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점이상(과목별 평균 점수가 높은 것만 추림)