데이터 모델링의 이해
| 구분 | 핵심 개념 | 요약 |
|---|
| 데이터 모델링 | 현실 세계를 DB로 표현하는 과정 | 추상화 → 구조화 → 관계 정의 |
| 엔티티(Entity) | 데이터를 저장할 대상 | 사물, 개념, 사건 등 |
| 속성(Attribute) | 엔티티의 세부 정보 | 학번, 이름, 생년월일 등 |
| 관계(Relationship) | 엔티티 간의 연관성 | 1:1, 1:N, N:M 관계 |
| 식별자(Identifier) | 엔티티를 구분하는 속성 | 기본키(Primary Key) |
| 정규화(Normalization) | 데이터 중복 제거, 이상현상 방지 | 제1~제5정규형, BCNF 등 |
| 제1정규형 | 속성값이 원자값 | 반복 속성 제거 |
| 제2정규형 | 부분 함수 종속 제거 | 기본키의 일부에 종속된 속성 제거 |
| 제3정규형 | 이행적 종속 제거 | 비키가 비키를 결정하지 않도록 |
| 역정규화 | 성능을 위해 일부 중복 허용 | 조회 속도 향상 목적 |
| ERD(Entity Relation Diagram) | 엔티티, 관계를 시각화한 다이어그램 | Crow’s Foot 표기법 사용 |
SQL 기본
| 구분 | 핵심 구문 | 요약 |
|---|
| SELECT | 데이터 조회 | SELECT column FROM table WHERE 조건 |
| DISTINCT | 중복 제거 | SELECT DISTINCT column |
| ORDER BY | 정렬 | ASC(오름차순), DESC(내림차순) |
| WHERE | 조건 필터링 | WHERE age > 30 AND gender = 'M' |
| BETWEEN | 범위 검색 | WHERE score BETWEEN 80 AND 90 |
| LIKE | 패턴 검색 | %(임의문자열), _(한글자) |
| IN | 여러 값 비교 | WHERE dept IN ('IT', 'HR') |
| NULL 처리 | IS NULL / IS NOT NULL | NULL은 비교연산 불가 |
| CASE | 조건 분기 | CASE WHEN score>=90 THEN 'A' ELSE 'B' END |
| GROUP BY | 그룹화 | 집계함수(AVG, SUM 등)와 함께 사용 |
| HAVING | 그룹 조건 | HAVING COUNT(*) > 3 |
| JOIN | 테이블 결합 | INNER, LEFT, RIGHT, FULL OUTER |
| 서브쿼리 | 쿼리 안의 쿼리 | WHERE salary > (SELECT AVG(salary) FROM emp) |
| VIEW | 가상 테이블 | 보안·복잡한 쿼리 단순화 |
| INDEX | 검색 속도 향상 | 과도하면 INSERT/UPDATE 느려짐 |
| SEQUENCE | 자동번호 생성 | CREATE SEQUENCE seq_name |
| DISTINCT vs GROUP BY | 중복제거 vs 그룹화 | 목적 다름에 유의 |
SQL 활용
| 구분 | 핵심 개념 | 요약 |
|---|
| JOIN | 다중 테이블 결합 | ON 조건으로 컬럼 연결 |
| SELF JOIN | 같은 테이블끼리 JOIN | 자기 자신과 비교 |
| UNION / UNION ALL | 합집합 | ALL은 중복 허용 |
| INTERSECT | 교집합 | 두 쿼리 공통 데이터 |
| MINUS (EXCEPT) | 차집합 | 첫 쿼리 - 두 번째 쿼리 |
| 집계함수 | SUM, AVG, COUNT, MAX, MIN | NULL은 제외됨 |
| 윈도우 함수 | RANK(), ROW_NUMBER(), SUM() OVER() | 분석용 함수 |
| RANK() | 동일값 동일순위, 건너뜀 | 1, 2, 2, 4 |
| DENSE_RANK() | 동일값 동일순위, 건너뛰지 않음 | 1, 2, 2, 3 |
| ROW_NUMBER() | 순번 부여 | 중복 없는 번호 |
| PARTITION BY | 그룹 기준 | SUM(sal) OVER(PARTITION BY dept) |
| WITH 절 | 임시 결과 저장 | 가독성 향상 |
| CASE WHEN | 조건식 | 여러 조건 분기 가능 |
| TRUNCATE vs DELETE | 전체삭제 vs 조건삭제 | TRUNCATE는 복구 불가 |
| TRANSACTION | COMMIT / ROLLBACK | 작업 단위 제어 |
| LOCK | 동시성 제어 | Deadlock 주의 |
SQL 튜닝 기초
| 구분 | 핵심 개념 | 요약 |
|---|
| 인덱스 | 검색 성능 향상 | 단일, 복합 인덱스 |
| 실행계획 | 옵티마이저의 실행 순서 | EXPLAIN PLAN 사용 |
| 옵티마이저 | SQL 실행 경로 결정 | Cost 기반 최적화 |
| 통계정보 | 옵티마이저의 판단 근거 | 갱신 필요 |
| 뷰 머지(View Merging) | 불필요한 중첩 제거 | 성능 향상 |
| 조인 순서 | 작은 테이블 먼저 조인 | 효율적 수행 |
| 서브쿼리 최적화 | IN → EXISTS 변경 | 실행속도 개선 |
| 힌트(Hint) | 실행 계획 유도 | /*+ INDEX(table idx_name) */ |
실전 대비 요약 포인트
| 주제 | 포인트 | 설명 |
|---|
| 데이터 모델링 | 정규화 + 식별자 | ERD 해석 가능해야 함 |
| SQL 기본 | SELECT~JOIN 완벽 숙지 | WHERE, GROUP BY, HAVING 구분 |
| SQL 활용 | 윈도우 함수 / 서브쿼리 | 실전 문제 다수 출제 |
| 성능 튜닝 | 인덱스, 실행계획 | 개념만이라도 숙지 |
| 기출패턴 | JOIN + GROUP + 함수 조합 | 유형 반복 출제 많음 |
이론 및 예시 문제
✅ 1) NULL 관련
NULL ≠ 0, NULL ≠ ''
- 비교 불가 →
IS NULL, IS NOT NULL
- 산술 연산 → 결과는 NULL
- COUNT 동작
COUNT(*): 모든 행
COUNT(col): NOT NULL 값만
SELECT COUNT(col1), COUNT(*)
FROM emp;
✅ 2) ORDER BY (정렬)
- SELECT 이후 실행
ASC(오름차순, 기본) / DESC(내림차순)
- 여러 컬럼 정렬 가능
ORDER BY dept ASC, salary DESC;
SELECT * FROM emp
ORDER BY dept ASC, salary DESC;
✅ 3) DISTINCT (중복 제거)
- SELECT에서 중복 제거
- GROUP BY와 함께 사용 시 의미 중복
SELECT DISTINCT dept
FROM emp;
✅ 4) GROUP BY & HAVING
- GROUP BY → 그룹 기준
- HAVING → 그룹 결과 필터
- WHERE → 그룹 전 필터
- SELECT 리스트에서 집계되지 않은 컬럼은 반드시 GROUP BY 필요
SELECT dept, COUNT(*)
FROM emp
GROUP BY dept
HAVING COUNT(*) >= 5;
✅ 5) 집계 함수
- COUNT, SUM, MAX, MIN, AVG
- NULL은 계산에서 제외됨
- 대부분 다중행 함수 → 단독 사용 시 GROUP BY 필수
COUNT(*)
COUNT(col)
SELECT dept, COUNT(*)
SELECT AVG(salary)
FROM emp;
✅ 6) JOIN
- ✅ INNER JOIN
- ✅ OUTER JOIN
- LEFT / RIGHT / FULL
- JOIN 키가 없는 쪽도 표시 → NULL 채움
- ✅ CROSS JOIN
✅ 7) SET 연산
| 구문 | 의미 | 중복 |
|---|
| UNION | 합집합 | 제거 |
| UNION ALL | 합집합 | 포함 |
| INTERSECT | 교집합 | 제거 |
| EXCEPT | 차집합 | 제거 |
✅ 8) 서브쿼리 (Subquery)
- 위치: SELECT / FROM / WHERE / HAVING
- Scalar / Single-row / Multi-row 구분
- IN, EXISTS 등 사용
SELECT *
FROM emp
WHERE dept IN (SELECT dept_id FROM dept);
✅ 9) CASE WHEN (조건)
CASE
WHEN 조건 THEN 값
ELSE 값
END
✅ 10) 문자열/날짜 함수
- CONCAT, SUBSTR, LENGTH
- SYSDATE, DATE_ADD, DATEDIFF 등
✅ 11) DDL / DML / DCL / TCL
| 구분 | 명령 | 설명 |
|---|
| DDL | CREATE / ALTER / DROP / TRUNCATE | 구조 |
| DML | SELECT / INSERT / UPDATE / DELETE | 데이터 |
| DCL | GRANT / REVOKE | 권한 |
| TCL | COMMIT / ROLLBACK / SAVEPOINT | 트랜잭션 |
✅ 12) TRUNCATE VS DELETE
| 항목 | TRUNCATE | DELETE |
|---|
| 종류 | DDL | DML |
| 조건 | 불가 | 가능 |
| 속도 | 빠름 | 느림 |
| 로그 | 최소 | 다 기록 |
| COMMIT 필요? | X | O |
✅ 13) VIEW
- 테이블처럼 사용 가능
- 실제 데이터 저장 X
- 보안 측면에서 유리
✅ 14) Index
- 검색 성능 향상
- INSERT/UPDATE/DELETE 시 오버헤드 증가
- 컬럼 특징
- 선택도 높을수록 유리(중복 적음)
- LIKE 검색 → ABC%만 인덱스 활용, %ABC 비효율
✅ 15) WINDOW 함수
- 처리 후 행을 줄이지 않음
- OVER 절 사용
- PARTITION BY → 그룹
- ORDER BY → 순서
- 대표 함수
- RANK, ROW_NUMBER, SUM, AVG
SUM(sales) OVER(PARTITION BY region)
✅ 16) GROUPING SETS / ROLLUP / CUBE
- 다양한 집계 레벨 생성
- ROLLUP: 소계 + 합계
- CUBE: 모든 조합
✅ 17) Subquery 유형
| 종류 | 반환 건수 | 연산자 |
|---|
| 단일행 | 1 | =, >, < |
| 다중행 | N | IN, ANY, ALL |
| EXISTS | 존재 여부 확인 | EXISTS |
- 제1정규형: 원자값
- 제2정규형: 부분적 종속 제거
- 제3정규형: 이행 종속 제거
- (※ SQLD 1과목에서 중요하지만 2과목 SQL에도 연관됨)
✅ 1. 제약조건(Constraints)
✔ CHECK
- 특정 열(column)의 값이 조건을 만족하는지 검사.
✔ UNIQUE
✔ FOREIGN KEY
- 다른 테이블의 기본키(PK)를 참조.
- 참조 무결성을 보장.
✔ PRIMARY KEY
- 고유 식별자.
- NULL 불가.
- 한 테이블에 1개만 존재.
- 숫자/문자 등 다양한 타입 가능.
- 복합키(PK 여러 속성 조합) 가능.
✅ 2. JOIN (조인)
✔ INNER JOIN
✔ OUTER JOIN
- 조건에 맞지 않는 행도 포함.
- LEFT / RIGHT / FULL OUTER JOIN 존재.
LEFT JOIN = LEFT OUTER JOIN
✔ CROSS JOIN
✔ SELF JOIN
✔ NATURAL JOIN
✅ 3. 서브쿼리(Subquery)
✔ 스칼라 서브쿼리
- 단일 값 반환.
- SELECT 절에서 사용 가능.
✔ 상관 서브쿼리
- 메인 쿼리의 각 행마다 반복 실행 → 비효율적.
✔ NOT IN 주의
- 서브쿼리 결과에 NULL 포함 시 결과가 전부 NULL 처리될 수 있음.
✅ 4. GROUP BY / HAVING / 집계 기능
✔ GROUP BY
- HAVING 없이도 사용 가능.
- 집계 기준 정의.
✔ HAVING
- GROUP BY 이후 실행.
- 그룹화된 데이터 조건 추가.
- 집계 함수 없는 조건도 가능하지만 WHERE 권장.
✔ ROLLUP / CUBE / GROUPING SETS
- 계층형·다차원 분석(OLAP).
GROUPING() 함수 → 집계로 생성된 NULL 여부 확인.
✅ 5. 정규화 / 비정규화
✔ 정규화
- 데이터 중복 제거, 무결성 유지 목적.
- 성능 향상 목적은 아님.
- 비정규화보다 항상 먼저 수행.
✔ 비정규화(반정규화)
- 성능 최적화를 위해 중복을 허용.
- 무조건 성능 향상되는 것은 아님.
✅ 6. 트랜잭션(Transaction)
✔ TCL 명령어
- COMMIT: 영구 반영
- ROLLBACK: 변경사항 복구
- SAVEPOINT: 중간 저장
✔ Isolation(고립성)
- 트랜잭션 간 간섭 방지.
- READ UNCOMMITTED → 더티 리드 발생.
✅ 7. DDL / DML / DCL
✔ DDL
- CREATE, ALTER, DROP
- DROP은 객체를 완전히 삭제(복구 불가)
✔ DML
- SELECT, INSERT, UPDATE, DELETE
- UPDATE는 조건을 통해 여러 행 동시 수정 가능
✔ DCL
✅ 8. SQL 함수
✔ 문자열 / 숫자 / 날짜 함수
- UPPER: 대문자 변환
- LENGTH: 문자열 길이
- TO_DATE: 문자열 → 날짜
- SYSDATE: 현재 날짜·시간
✔ NVL(expr, value)
✔ LAST_DAY('2024-02-15')
✔ MONTHS_BETWEEN('2024-01-01','2023-01-01')
✅ 9. NULL
- UNKNOWN(알 수 없음) 의미.
- 산술 연산 결과도 UNKNOWN.
- COUNT는 NULL 제외.
- 외래키가 NULL이어도 참조 무결성 위반 아님.
✅ 10. 정규 표현식(Regex)
[^a-z] : 소문자 알파벳 제외
\d : 숫자
{n} : n번 반복
{m,n} : m~n번 반복
✅ 11. 데이터 모델링
✔ 엔터티(Entity)
✔ 속성(Attribute)
- 타원으로 표현.
- 여러 엔터티에서 공통 사용 가능.
✔ 관계(Relationship)
- 1:1, 1:N, N:M
- N:M은 반드시 중간 테이블 필요
✔ 식별자 관계
✔ 비식별자 관계
✅ 12. 계층형 쿼리
✔ START WITH
✔ CONNECT BY NOCYCLE
✅ 13. 인덱스
- 특정 컬럼만 저장.
- 조회 속도 향상.
- 클러스터형 인덱스 → 물리적으로 정렬 저장.
✅ 14. 뷰(View)
- 실제 데이터를 저장하지 않음.
- 저장 공간 거의 사용하지 않음.
- SELECT 결과를 가상으로 제공.
📌 전체 요약
SQLD 핵심: 무결성 → 정규화 → JOIN → GROUP BY/HAVING → 서브쿼리 → 트랜잭션 → 권한관리 → 인덱스 → 모델링