SQLD - 이론

김기훈·2025년 10월 29일

자격증

목록 보기
2/5

데이터 모델링의 이해

구분핵심 개념요약
데이터 모델링현실 세계를 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 NULLNULL은 비교연산 불가
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, MINNULL은 제외됨
윈도우 함수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는 복구 불가
TRANSACTIONCOMMIT / 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 값만
# col1에 NULL 값이 있다면 어떤 결과인가?
SELECT COUNT(col1), COUNT(*)
FROM emp;
# 답: COUNT(*) ≥ COUNT(col1)

✅ 2) ORDER BY (정렬)

  • SELECT 이후 실행
  • ASC(오름차순, 기본) / DESC(내림차순)
  • 여러 컬럼 정렬 가능
  ORDER BY dept ASC, salary DESC;
# 정답 → dept 오름차순 → salary 내림차순
SELECT * FROM emp
ORDER BY dept ASC, salary DESC;

✅ 3) DISTINCT (중복 제거)

  • SELECT에서 중복 제거
  • GROUP BY와 함께 사용 시 의미 중복
# 정답 → 중복 없는 dept 목록
SELECT DISTINCT dept
FROM emp;

✅ 4) GROUP BY & HAVING

  • GROUP BY → 그룹 기준
  • HAVING → 그룹 결과 필터
  • WHERE → 그룹 전 필터
  • SELECT 리스트에서 집계되지 않은 컬럼은 반드시 GROUP BY 필요
# 부서별 인원수가 5명 이상인 부서만 출력
## 정답 → 그룹화 후 개수 5 이상만
SELECT dept, COUNT(*)
FROM emp
GROUP BY dept
HAVING COUNT(*) >= 5;

✅ 5) 집계 함수

  • COUNT, SUM, MAX, MIN, AVG
  • NULL은 계산에서 제외됨
  • 대부분 다중행 함수 → 단독 사용 시 GROUP BY 필수
# 1 
COUNT(*)     -- 전체 행 수
COUNT(col)   -- col이 NOT NULL인 행 수

# 2
## 각 부서(dept)별로 몇 명인지 집계해서 보여주는 형태
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 dept_id FROM dept) ← 이것이 서브쿼리
SELECT *
FROM emp
WHERE dept IN (SELECT dept_id FROM dept);

✅ 9) CASE WHEN (조건)

CASE
  WHEN 조건 THENELSEEND

✅ 10) 문자열/날짜 함수

  • CONCAT, SUBSTR, LENGTH
  • SYSDATE, DATE_ADD, DATEDIFF 등

✅ 11) DDL / DML / DCL / TCL

구분명령설명
DDLCREATE / ALTER / DROP / TRUNCATE구조
DMLSELECT / INSERT / UPDATE / DELETE데이터
DCLGRANT / REVOKE권한
TCLCOMMIT / ROLLBACK / SAVEPOINT트랜잭션

✅ 12) TRUNCATE VS DELETE

항목TRUNCATEDELETE
종류DDLDML
조건불가가능
속도빠름느림
로그최소다 기록
COMMIT 필요?XO

✅ 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=, >, <
다중행NIN, ANY, ALL
EXISTS존재 여부 확인EXISTS

✅ 18) NORMAL FORM (정규화 핵심)

  • 제1정규형: 원자값
  • 제2정규형: 부분적 종속 제거
  • 제3정규형: 이행 종속 제거
  • (※ SQLD 1과목에서 중요하지만 2과목 SQL에도 연관됨)

✅ 1. 제약조건(Constraints)

✔ CHECK

  • 특정 열(column)의 값이 조건을 만족하는지 검사.

✔ UNIQUE

  • 중복 불가 제약이지만 NULL 중복 허용.

✔ 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

  • GRANT, REVOKE (권한 관리)

✅ 8. SQL 함수

✔ 문자열 / 숫자 / 날짜 함수

  • UPPER: 대문자 변환
  • LENGTH: 문자열 길이
  • TO_DATE: 문자열 → 날짜
  • SYSDATE: 현재 날짜·시간

✔ NVL(expr, value)

  • NULL을 특정 값으로 대체.

✔ LAST_DAY('2024-02-15')

  • 2024-02-29

✔ MONTHS_BETWEEN('2024-01-01','2023-01-01')

  • 12

✅ 9. NULL

  • UNKNOWN(알 수 없음) 의미.
  • 산술 연산 결과도 UNKNOWN.
  • COUNT는 NULL 제외.
  • 외래키가 NULL이어도 참조 무결성 위반 아님.

✅ 10. 정규 표현식(Regex)

  • [^a-z] : 소문자 알파벳 제외
  • \d : 숫자
  • {n} : n번 반복
  • {m,n} : m~n번 반복

✅ 11. 데이터 모델링

✔ 엔터티(Entity)

  • ERD에서 사각형으로 표현.

✔ 속성(Attribute)

  • 타원으로 표현.
  • 여러 엔터티에서 공통 사용 가능.

✔ 관계(Relationship)

  • 1:1, 1:N, N:M
  • N:M은 반드시 중간 테이블 필요

✔ 식별자 관계

  • 자식이 부모의 PK를 상속.

✔ 비식별자 관계

  • 자식이 독립적인 PK 사용.

✅ 12. 계층형 쿼리

✔ START WITH

  • 계층 구조의 시작(루트) 지정.

✔ CONNECT BY NOCYCLE

  • 순환(cycle) 존재 시 사용.

✅ 13. 인덱스

  • 특정 컬럼만 저장.
  • 조회 속도 향상.
  • 클러스터형 인덱스 → 물리적으로 정렬 저장.

✅ 14. 뷰(View)

  • 실제 데이터를 저장하지 않음.
  • 저장 공간 거의 사용하지 않음.
  • SELECT 결과를 가상으로 제공.

📌 전체 요약

SQLD 핵심: 무결성 → 정규화 → JOIN → GROUP BY/HAVING → 서브쿼리 → 트랜잭션 → 권한관리 → 인덱스 → 모델링
profile
안녕하세요.

0개의 댓글