1장. SQL 기본
DDL (Data Definition Language)
| 명령어 | 설명 |
|---|
| CREATE | 테이블/뷰/인덱스 등 객체 생성 |
| ALTER | 컬럼 추가(ADD), 수정(MODIFY/ALTER), 삭제(DROP COLUMN), 이름 변경 |
| DROP | 객체 삭제 (CASCADE 옵션으로 참조 객체도 함께 삭제 가능) |
| TRUNCATE | 전체 데이터 삭제 (구조 유지, 롤백 불가, DDL이므로 자동커밋) |
| RENAME | 테이블 이름 변경 |
DDL은 자동 커밋(Auto Commit)됨 — 실행 즉시 반영, ROLLBACK 불가 (Oracle 기준)
DML (Data Manipulation Language)
| 명령어 | 설명 |
|---|
| SELECT | 데이터 조회 (FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY) |
| INSERT | 데이터 삽입 (컬럼 생략 시 전체 컬럼 순서대로 값 입력) |
| UPDATE | 데이터 수정 (SET절 + WHERE절, WHERE 생략 시 전체 수정) |
| DELETE | 데이터 삭제 (로그 기록, 롤백 가능, WHERE 생략 시 전체 삭제) |
| MERGE | 조건에 따라 INSERT/UPDATE/DELETE를 한 문장으로 수행 |
DCL / TCL
| 분류 | 명령어 | 설명 |
|---|
| DCL | GRANT | 권한 부여 (WITH GRANT OPTION: 재부여 가능) |
| REVOKE | 권한 회수 (CASCADE: 재부여된 권한까지 회수) |
| TCL | COMMIT | 트랜잭션 확정 (변경사항 영구 반영) |
| ROLLBACK | 트랜잭션 취소 (마지막 COMMIT 시점으로 복구) |
| SAVEPOINT | 중간 저장점 설정 (ROLLBACK TO로 해당 지점까지만 복구) |
2장. WHERE절
비교 / 논리 연산자
| 연산자 | 설명 |
|---|
| =, <>, <, > | 기본 비교 연산자 (<> 는 != 와 동일) |
| BETWEEN A AND B | A 이상 B 이하 (경계값 포함) |
| IN (값1, 값2, ...) | 목록 중 하나와 일치 (OR 조건의 축약) |
| LIKE | 패턴 매칭 (%: 0개 이상, _: 정확히 1개) |
| IS NULL / IS NOT NULL | NULL 비교는 반드시 IS NULL 사용 (= NULL은 항상 FALSE) |
AND/OR 우선순위와 NULL 주의
- • AND가 OR보다 우선 — 괄호로 명확히 구분할 것
- • NULL과의 모든 비교 연산 결과는 UNKNOWN (TRUE도 FALSE도 아님)
- • NOT IN 안에 NULL이 포함되면 결과가 항상 공집합
- • NULL + 숫자 = NULL, NULL과의 연산 결과는 항상 NULL
3장. 함수
문자열 함수
| 함수 | 설명 |
|---|
| SUBSTR(s, m, n) | 문자열 s의 m번째부터 n개 추출 (1부터 시작) |
| LPAD / RPAD | 왼쪽/오른쪽으로 지정 문자 채워서 길이 맞춤 |
| TRIM | 양쪽 공백 제거 (LEADING/TRAILING/BOTH 옵션) |
| REPLACE(s, a, b) | 문자열 s에서 a를 b로 치환 |
| LENGTH / LEN | 문자열 길이 (Oracle: LENGTH, SQL Server: LEN) |
숫자 함수
| 함수 | 설명 |
|---|
| ROUND(n, d) | 소수점 d+1자리에서 반올림 |
| TRUNC(n, d) | 소수점 d+1자리에서 버림 (SQL Server: 없음, ROUND 3번째 인자 사용) |
| CEIL / FLOOR | 올림(큰 정수) / 내림(작은 정수) (CEIL(-1.5) = -1) |
| MOD(a, b) | a를 b로 나눈 나머지 |
날짜 함수
| 함수 | 설명 |
|---|
| SYSDATE / GETDATE() | 현재 날짜/시간 (Oracle / SQL Server) |
| ADD_MONTHS(d, n) | 날짜 d에 n개월 더하기 |
| MONTHS_BETWEEN(d1, d2) | 두 날짜 사이의 개월 수 (d1 - d2) |
| EXTRACT(YEAR FROM d) | 날짜에서 년/월/일 추출 |
변환 함수
| 함수 | 설명 |
|---|
| TO_CHAR | 숫자/날짜를 문자열로 변환 (포맷 지정 가능) |
| TO_NUMBER | 문자열을 숫자로 변환 (Oracle) |
| TO_DATE | 문자열을 날짜로 변환 (포맷 지정 필수) |
암시적 형변환보다 명시적 형변환을 권장 — 성능과 안정성 모두 향상
NULL 관련 함수
| 함수 | 설명 |
|---|
| NVL(a, b) | a가 NULL이면 b 반환 (SQL Server: ISNULL) |
| NVL2(a, b, c) | a가 NULL이 아니면 b, NULL이면 c 반환 |
| NULLIF(a, b) | a = b이면 NULL, 다르면 a 반환 |
| COALESCE(a, b, ...) | 인자 중 첫 번째 NULL이 아닌 값 반환 (표준 SQL) |
CASE / DECODE
- • CASE — 표준 SQL, 모든 DBMS 사용 가능 (Simple / Searched 두 형태)
- • DECODE — Oracle 전용, 간단한 등치 비교에 적합
- • CASE WHEN 조건 THEN 결과 [ELSE 기본값] END — ELSE 생략 시 NULL 반환
4장. GROUP BY와 집계함수
집계함수와 NULL
| 함수 | NULL 처리 |
|---|
| COUNT(*) | NULL 포함 전체 행 수 |
| COUNT(col) | NULL 제외한 행 수 |
| SUM / AVG | NULL 제외하고 계산 (AVG 분모에서도 제외됨) |
| MAX / MIN | NULL 제외하고 최대/최소 반환 |
GROUP BY / HAVING
- • GROUP BY 절에 없는 컬럼은 SELECT에서 집계함수로만 사용 가능
- • HAVING은 그룹에 대한 조건 (WHERE는 행에 대한 조건)
- • WHERE → GROUP BY → HAVING → SELECT → ORDER BY 순서로 실행
ROLLUP / CUBE / GROUPING SETS
| 함수 | 설명 |
|---|
| ROLLUP(A, B) | (A,B) → (A) → () 단계적 소계 + 총계 (n+1개 그룹) |
| CUBE(A, B) | 가능한 모든 조합의 소계 (2^n개 그룹) |
| GROUPING SETS | 원하는 그룹 조합만 명시적으로 지정 |
GROUPING(col) 함수: 소계/총계로 만들어진 NULL이면 1, 원래 데이터면 0 반환
5장. JOIN
JOIN 유형 비교
| 유형 | 설명 |
|---|
| INNER JOIN | 양쪽 테이블 모두 일치하는 행만 반환 |
| LEFT OUTER JOIN | 왼쪽 테이블 전체 + 오른쪽 일치 행 (불일치 시 NULL) |
| RIGHT OUTER JOIN | 오른쪽 테이블 전체 + 왼쪽 일치 행 (불일치 시 NULL) |
| FULL OUTER JOIN | 양쪽 모두 보존 (불일치 시 NULL로 채움) |
| CROSS JOIN | 카테시안 곱 (M x N 행 생성, 조건 없음) |
| NATURAL JOIN | 같은 이름의 컬럼으로 자동 조인 (ON절 불필요, 중복 컬럼 하나만 표시) |
| SELF JOIN | 같은 테이블을 별칭으로 구분하여 자기 자신과 조인 |
ON절 vs WHERE절 차이
- • INNER JOIN: ON절과 WHERE절에 조건을 넣는 결과가 동일
- • OUTER JOIN: ON절 조건은 조인 전 필터, WHERE절 조건은 조인 후 필터 → 결과가 달라짐
- • OUTER JOIN에서 보존 테이블의 조건을 WHERE에 넣으면 INNER JOIN과 같아질 수 있음
6장. 서브쿼리
서브쿼리 유형
| 유형 | 위치 | 특징 |
|---|
| 스칼라 서브쿼리 | SELECT절 | 반드시 1행 1열 반환 (아니면 에러) |
| 인라인 뷰 | FROM절 | 서브쿼리 결과를 임시 테이블처럼 사용 |
| 중첩 서브쿼리 | WHERE절 | 조건 비교에 사용 (단일행/다중행/다중컬럼) |
상관 vs 비상관 서브쿼리
- • 비상관 서브쿼리 — 메인 쿼리와 독립적, 서브쿼리 먼저 실행 후 결과를 메인에 전달
- • 상관 서브쿼리 — 메인 쿼리의 컬럼을 참조, 메인 쿼리의 각 행마다 반복 실행
EXISTS / IN / ANY / ALL
| 연산자 | 설명 |
|---|
| EXISTS | 서브쿼리에 결과가 1건이라도 있으면 TRUE (상관 서브쿼리와 함께 사용) |
| IN | 서브쿼리 결과 목록 중 하나와 일치하면 TRUE |
| ANY (= SOME) | 서브쿼리 결과 중 하나라도 조건을 만족하면 TRUE |
| ALL | 서브쿼리 결과 전부 조건을 만족해야 TRUE |
7장. 집합연산자
| 연산자 | 설명 |
|---|
| UNION | 합집합 (중복 제거, 정렬 발생) |
| UNION ALL | 합집합 (중복 포함, 정렬 없음, 성능 우수) |
| INTERSECT | 교집합 (양쪽 모두 존재하는 행) |
| MINUS / EXCEPT | 차집합 (Oracle: MINUS, SQL Server: EXCEPT) |
컬럼 수와 데이터 타입이 일치해야 함. ORDER BY는 마지막 쿼리에서만 사용 가능.
8장. 윈도우 함수
순위 함수
| 함수 | 동일 값 처리 | 예시 |
|---|
| RANK | 동순위 허용, 다음 순위 건너뜀 | 1, 2, 2, 4 |
| DENSE_RANK | 동순위 허용, 다음 순위 연속 | 1, 2, 2, 3 |
| ROW_NUMBER | 동순위 없이 고유 번호 부여 | 1, 2, 3, 4 |
행 순서 / 비율 함수
| 함수 | 설명 |
|---|
| LAG(col, n) | 현재 행 기준 n행 이전 값 (기본 1) |
| LEAD(col, n) | 현재 행 기준 n행 이후 값 (기본 1) |
| FIRST_VALUE | 파티션 내 첫 번째 값 |
| LAST_VALUE | 파티션 내 마지막 값 (RANGE 기본 프레임 주의) |
| NTILE(n) | 파티션을 n개 그룹으로 균등 분할 |
| RATIO_TO_REPORT | 파티션 내 해당 값의 비율 (합계 대비) |
ROWS vs RANGE
- • ROWS — 물리적 행 수 기준으로 프레임 지정
- • RANGE — 논리적 값 범위 기준 (동일 값은 같은 프레임에 포함)
- • 기본값: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
- • LAST_VALUE 사용 시 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 지정 필요
9장. 계층형 쿼리
Oracle 계층형 쿼리 구문
| 키워드 | 설명 |
|---|
| START WITH | 루트(시작) 노드 조건 지정 |
| CONNECT BY PRIOR | 부모-자식 관계 정의 (PRIOR 위치에 따라 순방향/역방향) |
| LEVEL | 현재 노드의 깊이 (루트 = 1) |
| SYS_CONNECT_BY_PATH | 루트부터 현재 노드까지의 경로를 문자열로 반환 |
순방향 vs 역방향
- • 순방향 (Top-Down) — CONNECT BY PRIOR 자식ID = 부모ID (부모 → 자식으로 탐색)
- • 역방향 (Bottom-Up) — CONNECT BY PRIOR 부모ID = 자식ID (자식 → 부모로 탐색)
- • PRIOR는 이미 읽은 행(부모)을 가리킨다고 이해하면 쉬움
10장. 기타
뷰(View) / 인덱스
- • 뷰 — 논리적 테이블 (데이터 저장 X), 보안/편의를 위해 사용
- • 단순 뷰는 DML 가능, 복합 뷰(JOIN, GROUP BY, DISTINCT)는 DML 제한
- • 인덱스 — 검색 속도 향상 (B-Tree가 기본), DML 성능은 저하될 수 있음
- • 인덱스 스캔 유형: Range Scan, Unique Scan, Full Scan, Skip Scan
제약조건 (Constraints)
| 제약조건 | 설명 |
|---|
| PRIMARY KEY | UNIQUE + NOT NULL (테이블당 1개, 자동 인덱스 생성) |
| FOREIGN KEY | 다른 테이블의 PK/UK 참조 (참조 무결성) |
| UNIQUE | 중복 불가 (NULL은 허용, 여러 개 가능) |
| CHECK | 값의 범위/조건 제한 (예: salary > 0) |
| NOT NULL | NULL 입력 불가 (Oracle에서 ALTER 시 MODIFY로 변경) |
트랜잭션과 ACID
| 특성 | 설명 |
|---|
| Atomicity | 원자성 — 전부 성공하거나 전부 실패 |
| Consistency | 일관성 — 트랜잭션 전후 데이터 무결성 유지 |
| Isolation | 격리성 — 다른 트랜잭션과 독립적 수행 |
| Durability | 영속성 — 커밋된 결과는 영구 보존 |
Oracle vs SQL Server DDL 차이
- • Oracle: DDL 실행 시 자동 COMMIT (ROLLBACK 불가)
- • SQL Server: DDL도 트랜잭션 내에서 ROLLBACK 가능
PIVOT / UNPIVOT
- • PIVOT — 행 → 열 변환 (집계함수 필수: SUM, COUNT 등)
- • UNPIVOT — 열 → 행 변환 (PIVOT의 반대 연산)
Top-N 쿼리
| 방법 | 설명 |
|---|
| ROWNUM (Oracle) | WHERE ROWNUM <= N (ORDER BY 전에 부여되므로 인라인 뷰 필요) |
| FETCH FIRST (표준 SQL) | ORDER BY 후 FETCH FIRST N ROWS ONLY (OFFSET 지원) |
ROWNUM = 1은 가능하지만 ROWNUM = 2는 불가 (1번 행이 먼저 할당되어야 하므로)
개념을 익혔다면 모의고사로 실력을 확인해보세요