SQLD 준비
공부하자
main
date
Oct 20, 2025
slug
sqld-certification-preparation
author
status
Public
tags
SQLD
Daily
SQL
summary
공부하자
type
Post
thumbnail
category
😎 일상
updatedAt
Sep 15, 2026 06:20 AM
데이터 모델링의 이해
데이터 모델링이란?
- 정보시스템을 구축하기 위한 데이터 관점의 업무 분석 기법
- 현실 세계의 데이터를 약속된 표기법으로 표현하는 기법
- 데이터베이스 구축을 위한 분석 및 설계의 과정
데이터 모델링 시 유의점
중복 최소화 : 데이터베이스가 여러 위치에 같은 정보를 저장하지 않게 한다. (필요에따라 중복이 발생할 수 있으나 최소화 하는게 목적)
비연성 낮춤 : 데이터 정의를 데이터 사용 프로세스와 분리하여 비유연성을 줄이고 유연성을 높인다.
데이터 모델링 수행 절차
- 데이터 모델링을 할 때 정규화를 정확하게 수행한다.
- 데이터베이스 용량산정을 수행한다.
- 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.
- 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
- 이력 모델의 조정, PK/FK 조정, 슈퍼 타입 / 서브 타입 조정 등을 수행한다.
- 성능 관점에서 데이터 모델을 검증한다.
모델링 3단계
개념적 → 논리적 → 물리적 으로 구체화하여 최종 구현으로 이어지는 단계
개념적 모델링 (Conceptual Modeling)
- 조직의 전사적 관점에서 필요한 데이터를 개괄적으로 정의하는 단계
- 업무의 핵심적인 엔터티와 엔터티(Entity) 간의 관계 (Relationship)를 파악하고 ERD (Entity-Relationship Diagram)을 작성
- 추상화 수준이 가장 높고 업무 중심적이며 포괄적인 수준의 모델링 진행 (추상적)
논리적 모델링 (Logical Modeling)
- 개념적 모델링에서 도출된 엔티티와 관계를 컴퓨터가 이해할 수 있는 구조로 변환하는 단계 (추상적)
- 엔티티의 상세 속성(Attribute), 기본 키 (Primary Key) 등 식별자, 엔티티 간의 관계를 세밀하게 정의 데이터의 중복을 최소하기 위해 정규화 수행
- 특정 DBMS에 독립적이며, 정규화를 통해 데이터의 일관성을 확보
물리적 모델링 (Physical Modeling)
- 논리적 모델을 바탕으로 특정 DBMS 환경에 맞춰 실제 데이터베이스를 생성하는 단계 (구체적)
- 실제로 데이터베이스에 이식 할 수 있도록 성능, 저장 등의 물리적인 성격을 고려한 데이터 모델링
- 테이블 컬럼, 데이터 타입 등 실제 저장될 구조를 정의하고, 성능, 보안, 가용성 등 시스템적 요소를 고려
논리적 독립성
- 개념 스키마가 변경되어도 외부 스키마에는 영향을 미치지 않도록 지원하는 것
- 논리적 구조가 변경되어도 응용 프로그램에는 영향 없음
- 사용자 특성에 맞게 구조 변경 가능
- 통합 구조 변경 가능
물리적 독립성
- 내부 스키마가 변경되어도 외부 및 개념 스키마에 영향을 미치지 않도록 지원하는 것
- 저장 장치 구조 변경이 응용 프로그램과 개념 스키마에 향을 주지 않음
- 물리적 구조의 영향 없이 개념 구조 변경 가능
- 개념 구조 영향 없이 물리 주고 변경 가능
💡 모델링을 할 때 세 가지 관점은 데이터에 대한 관점, 프로세스에 대한 관점, 데이터와 프로세스가 서로 연관성이 표현되는 상관 관점
- 업무에서 처리하는 일의 방법에 따라 데이터가 어떻게 영향을 받는지 분석
- 업무에서 실제로 하는 일은 무엇인지 또는 무엇을 해야하는지 분석
- 업무가 어떤 데이터와 관련이 있는지 분석
데이터 모델링 3요소
- 엔티티 (Entity)
- 독립 엔티티(Kernel Entity, Master Entity)
- 사람, 물건, 장소 등과 같이 현실세계에 존재하는 엔티티
- 업무 중심 엔터티(Transaction Entity)
- Transaction이 실행되면서 발생하는 엔티티
- 종속 엔티티 (Dependent Entity)
- 주로 1차 정규화로 인해 관련된 중심 엔티티로 분리된 엔티티
- 교차 엔터티 (Intersaction Entity)
- M:N의 관계를 해소하려는 목적으로 만들어진 엔티티
- 관계 (Relationship)
- 속성 (Attribute)
데이터베이스 스키마 구조
외부(뷰) - 개념 (통합된 사용자) - 내부 스키마 (물리)
외부 스키마 (External Schema)
- Sub Schema 또는 View Schema (사용자 관점)
- 화면에서 사용자가 보는 개인적인 DB 스키마
개념 스키마 (Conceptual Schema)
- 모든 애플리케이션과 사용자가 필요로 하는 데이터를 통합해 조직 전체의 DB를 기술하는 것
- 사용자 관점을 통합해 조직 전체의 DB 기술
- 데이터베이스 내에 데이터 구조와 관계를 설명
내부 스키마 (Internal Schema)
- 데이터베이스의 물리적 저장 구조
- DB가 물리적으로 저장된 형식
- 데이터가 실제 저장되는 방식
ERD 작성 순서
- 엔터티 도출
- 배치
- 관계 설정
- 관계명 기술
- 관계 차수 설정
- 선택 사양 기술
IE 표기법
- 선택적 관계는 동그라미, 필수는 그냥 (까마귀 발 표기)
바커 표기법
- 필수 관계는 실선, 선택적 관계는 점선
SQL 명령어 (Structured Query Language)
DML (Data Manipulation Language)
데이터 조작어
- 데이터베이스 내부 스키마에 데이터를 입력, 수정, 삭제 하거나 조회하기 위해 사용되는 명령어 (주로 데이터 조작)
SELECTINSERTUPDATEDELETE
DDL (Data Definition Language)
데이터 정의어
- 데이터 구조를 정의하는 명령어, 데이터베이스 객체를 생성하거나 삭제, 변경할 때 사용하는 명령어
CREATEALTERDROPRENAME
DCL (Data Control Language)
데이터 제어어
- 객체들을 사용하기 위해 권한을 주고 회수하는 명령어
GRANTREVOKE
TCL (Transaction Control Language)
트랜잭션 제어 명령어
- 논리적인 작업의 단위를 묶어서 DML에 의해 조작된 결과를 작업단위(트랜잭션) 별로 제어하는 명령어
COMMITROLLBACKSAVEPOINT
JOIN
💡 정규화란? (Normalization)
정규화의 기본 목표는 테이블간에 중복된 테이터를 허용하지 않는다는 것, 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 용량을 줄일 수 있다.
제 1 정규화
테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것
.png?table=block&id=2928d60b-90d2-800f-8f45-f767732d7c1d&cache=v2)
→ 테이블의 속성 하나는 하나의 속성만 가져야한다.
제 2 정규화
제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해나는 것, 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어서는 안되는 것
.png?table=block&id=2928d60b-90d2-8004-b5db-c448c534790f&cache=v2)
→ 기본키 중에 특정 컬럼에만 종속된 컬럼이 존재할 경우 테이블을 분해
제 3 정규화
제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
→ 이행적 종속은 A → B, B → C가 성립될 때, A → C가 성립되는 것
.png?table=block&id=2928d60b-90d2-80cb-9e54-d78f103c8029&cache=v2)
BCNF 정규화
제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해나는 것
정규화 기법
기법분류 | 기법 | 내용 |
테이블 병합 | 1:1 관계 | 1:1 관계를 통하여 성능 향상 |
ㅤ | 1:M 관계 | 1:M 관계를 통하여 성능 향상 |
ㅤ | 슈퍼/서브 타입 | 슈퍼/서브 관계를 통합하여 성능 향상 |
테이블 분할 | 수직 분할 | 컬럼 단위의 테이블을 디스크 I/O를 분산처리하기 위해 테이블을 1:1로 분리하여 성능 향상 (트랜잭션의 처리되는 유형 파악이 선행되어야함) |
ㅤ | 수평 분할 | 행(레코드) 단위로 집중 발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터 접근의 효율성을 높여 성능을 향상하기 위해 행 단위로 테이블을 쪼갬 |
테이블 추가 | 중복 테이블 추가 | 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격 조인을 제거하고 성능을 향상 |
ㅤ | 통계 테이블 추가 | SUM, AVG 등을 미리 수행하여 계산해 둠으로써 조회 시 성능을 향상 |
ㅤ | 이력 테이블 추가 | 이력 테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력 테이블에 존재하는 방법 |
트랜잭션의 특징 (ACID)
- 영속성 (Durability)
- 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다.
- 고립성 (Isolation)
- 트랜잭션이 실횡되는 도중 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.
- 일관성 (Consistency)
- 정의된 연산들은 모두 성공적으로 실행되던지, 아니면 전혀 실행되지 않은 상태로 남아 있어야한다.
- 원자성 (Atomicity)
- 트랜잭션이 실행되기 전 데이터의 내용이 잘못되면 실행 이후에도 잘못되지 않게 유지되어야 한다.
PL/SQL (Procedural Language Extension to SQL)
ORACLE에서 지원하는 프로그래밍 언어의 특성을 수용한 SQL의 확장.
PL/SQL Block 내에서 SQL의 DML과 Query, 절차형 언어(if, loop)등을 사용하여 절차적 프로그래밍을 가능하게 한 강력한 트랜잭션 언어
분산 데이터베이스의 투명성
분할 투명성
위치 투명성
지역 투명성
중복 투명성
병행 투명성
장애 투명성
상호배타적 관계란?
하나가 선택되면 다른 하나는 선택될 수 없는 관계
데이터 파티션 기법
Composite Partition
Hash partition
List Partition
Range Partition
날짜 및 숫자처럼 연속된 값을 기준으로 만든 파티션 테이블
INNER JOIN
두 테이블에서 조인 조건을 만족하는 행만 반환 (교집합)
SELECT A.*, B.* FROM TBL1 A INNER JOIN TBL2 B ON A.id = B.id; # A.id 와 B.id가 같은 행들만 출력
LEFT OUTER JOIN
왼쪽 테이블의 모든 행을 반환하고, 일치하는 오른쪽 행이 있으면 결합, 없으면 오른쪽 컬럼은 NULL
SELECT A.*, B.* FROM TBL1 A LEFT OUTER JOIN TBL2 B ON A.id = B.id;
RIGHT OUTER JOIN
LEFT OUTHER JOIN 의 반대
SELECT A.*, B.* FROM TBL1 A RIGHT OUTER JOIN TBL2 B ON A.id = B.id;
FULL OUTER JOIN
왼쪽과 오른쪽 모두의 모든 행을 반환, 일하는 행은 결합하고, 한쪽에만 존재한다면 다른 쪽은 NULL
SELECT A.*, B.* FROM TBL1 A FULL OUTER JOIN TBL2 B ON A.id = B.id;
결과 : AUB 형태로 양쪽에만 있는/공통으로 있는 모든 행 포함
대안으로 LEFT + RIGHT UNION 또는 NOT EXISTS 방식으로 대체 가능
INNER JOIN 과 OUTER JOIN
두 JOIN의 가장 큰 차이점은 매칭되지 않는 행을 포함할것인가(OUTER JOIN), 제외할 것인가 (INNER JOIN)
- INNER JOIN
- 두 테이블 모두 매칭되는 행만 선택 (교집합)
- OUTER JOIN
- 한 쪽 테이블의 행은 유지하면서, 매칭이 안 돼도 포함 (교집합 + 한쪽 (또는 양쪽) 의 나머지
CROSS JOIN
JOIN 조건 없이 양쪽 테이블의 모든 조합을 반환한다. (행수 = rows(A) x rows(B))
SELECT * FROM TBL1 A CROSS JOIN TBL2 B;
GROUP
UNIOIN
여러 쿼리문을 합쳐서 하나의 쿼리문으로 만들어주는 방법
- 중복된 값을 제거하고 보여준다.
- 올바른 정렬을 위해서는 ORDER BY 구문을 사용해야함
- 중복된 값을 제거하는 연산이 추가로 수행되기 때문에 UNION ALL 보다 속도가 느림
UNION ALL
UNION과 동일하게 여러 쿼리문들을 합쳐서 하나의 쿼리문으로 만들어주는 방법
- 중복된 값까지 모두 보여준다.
SELECT A AS one, B AS two FROM TABLE_A UNION (또는 UNION ALL) SELECT C AS one, D AS two FROM TABLE_B;
UNION과 JOIN의 차이
- JOIN
- 새로운 열을 결합한다. (수평 결합)
- UNION
- 새로운 행으로 결합한다. (수직 결합)
INTERSECT
두 개의 테이블에 대해 겹치는 부분을 추출하는 연산 (교집합 역할)
- 데이터 추출 후 중복된 결과는 제거
EXCEPT
두 개의 테이블에 대해 겹치는 부분을 앞의 테이블에서 제외해서 추출하는 연산 (차집합 역할)
- 데이터 추출 후 중복된 결과는 제거
OVER
ORDER BY, GROUP BY, SubQuery를 개선하기 위한 함수
→ GROUP BY, SubQuery 를 사용하지 않아도 집계 함수를 활용할 수 있다.
함수명(컬럼) OVER ( [PARTITION BY 절] [ORDER BY 절] [ROWS 또는 RANGE 절] ) SELECT YYMM, PRICE FROM ( SELECT YYMM, SUM(TOT_PRICE) AS PRICE FROM TABLE1 GROUP BY YYMM ORDER BY YYMM DESC ); # 아래와 같이 변환됨 SELECT YYMM, SUM(TOT_PRICE) OVER(ORDER BY YYMM DESC) AS PRICE FROM TABLE1; SELECT ENAME,SAL, NTILE(4) OVER (ORDER BY SAL DESC) as DATA FROM EMP; # DATA는 4등분으로 나눠서 보여진다.
**
NTILENTILE(숫자) → 들어온 숫자 만큼 데이터를 쪼갠다.
PARTITION BY
OVER 함수 안에서 사용, 데이터를 특정 값에 따라 그룹으로 나누는 역할
# 직원들의 월급 데이터를 분석하여 각 나이별로 평균 월급을 조회 SELECT NAME, AGE, DEPT ROUND(AVG(SALARY) OVER(PARTION BY AGE), 0) AS AVG FROM TB_EMP;
- GROUP BY 처럼 데이터를 나누지만, 행은 그대로 유지된다.
- ORDER BY 순서 지정
- ROWS / RANGE 행 범위를 지정
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW- 시작부터 현재 행까지
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING- 현재 행 기준으로 앞뒤 1행
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW- 현재 행의 ORDER BY 값 기준 범위
GROUPING SETS여러 그룹핑 쿼리를 UNION ALL 한 것과 같은 동일한 결과를 뽑을 수 있음
SELECT job, deptNo, COUNT(*) cnt FROM EMP GROUP BY GROUPING SETS((job, mgr), (job, deptno), ()) # GROUPING SETS( 컬럼, 컬럼, 컬럼, ... ) # GROUPING SETS( (컬럼그룹), (컬럼그룹), (컬럼그룹), ... )
함수
단일행 함수
SQL에서 기본 제공되는 함수를 내장 함수 (built in function) 이라 한다. 단일 행 함수는 하나의 행을 입력 했을 때, 결과가 하나의 행으로 나오는 것
- DUAL 테이블
오라클 설치 시 자동적으로 생성되는 오라클 표준 테이블
오직 하나의 ROW에 하나의 컬럼만 가지고 있는 Dummy 테이블 (테스트 테이블 1X1 형태로 구성됨)
Dual 테이블은 일시적인 가상 테이블로서 숫자 연산, 날짜 연산을 위해 쓰이는 것이 일반적
- 단일행 숫자 함수
ABS숫자 : 절대값을 구해주는 함수
SIGN숫자 : 부호를 출력해주는 함수
FLOOR숫자 : 소수점을 모두 버리는 함수
CEIL숫자 : 소수점을 모두 올리는 함수- * SQL Server -> CELING 숫자
MOD(숫자1, 숫자2) : 숫자1 / 숫자2 의 나머지
ROUND(숫자, 자리수) : 자리수에서 반올림
TRUNC(숫자, 자리수) 자리수에서 내림 ** ROUND, TRUNC 함수에서 자리수를 입력하지 않으면 default 0이다
ROUND(133.8594, 2) ## 1(-2) 3(-1) 3(0), 8(1), 5(2), 9(3), 4(4) 일 때 ### 2에서 끊었으므로 output은 133.85 에서 반올림 하여 133.86.
TRIM, LTRIM, RTRIM 함수 사용 방법TRIM 함수는 문자열의 양쪽 공백을 제거하는 기본 함수
LTRIM 왼쪽 공백, RTRIM 오른쪽 공백 제거
TRIM("문자열") TRIM("ACCOUNTING ") # -> ACCOUNTING ## 좌측으로 두 번째 인자 값을 제거한 값 LTRIM("AABABAA", "A") # -> BABAA
LPAD, RPAD 함수 사용 방법왼쪽, 오른쪽 특정 문자를 채워서 문자열 길이를 맞춤
LPAD("값", "총 문자 길이", "채울문자") LPAD(123, 5, "0") # -> 00123 LPAD(123, 8, "0") # -> 00000123
INSTR 함수 사용 방법특정 글자 위치 찾는 함수
INSTR("문자열", "찾는글자", 검색 시작 위치, 검색 위치) # 4 번째 인자값의 경우 default 1 INSTR("Liverpool", "o", 1) # -> o를 찾는데 1 째에서 시작해서 1번 위치 # L -> 1 i -> 2 v -> 3 e -> 4 r-> 5 p -> 6 지나서 o -> 7 # 결과값 7
POWER 함수 사용 방법거듭 제곱을 출력하는 함수
POWER(대상 숫자, 제곱 숫자) POWER(3,4) # 3을 4 제곱한 수로 81
NULLNULL 과의 산술 연산은 무조건 NULL 출력
대신, >, <, = 와 같이 비교 연산자와 사용했을 경우 unknown 이 출력됨
NOT(unknown)이 들어갔을 경우 unknown이 나옴 Falthy + Falthy = True 의 형태가 아니다.
NULL 과 비교 연산 IS NULL, IS NOT NULL
NVL(값1, 값2) # 값1이 null 이면 값2를 출력, 그게 아니면 값1 NULLIF(값1, 값2) # 값 1이 값2와 같으면 NULL 아니면 값1 출력 COALESCE(값1, 값2) # NULL 이 아닌 최초의 표현식, 모두 NULL이면 NULL 반환 ## ex COALESCE(NULL, NULL, 'abd) -> 'abc'
NULL의 특징
- 기본적인 의미는 값의 부재, 모르는 값
- 정렬에서는 무한대의 의미 (oracle)
- 정렬에서는 최소의 값이라는 의미 (SQL Server)
- NULL/2, 2/NULL, NULL+NULL, NULL-2 모두 NULL 값으로 출력
- SELECT 절에서 NULL = 3 비교 연산 시 , UNKNOWN 오류 발생
ORDER BY# 실행 순서 FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
FROM 에서 데이터를 가져오고, WHERE 조건에 의해 불필요 데이터를 거르고, GROUP BY로 그룹핑하여 데이터를 날리고, HAVING으로 또 데이터를 날리고, 최종적으로 날린 데이터에서 SELECT 을 하고 그 다음 남은 데이터를 정렬하기 때문에 제일 마지막에 실행됨
ORDER BY가 그래서 CPU, Memory를 제일 많이 잡아먹는다. (성능 저하에 큰 요인)
ASC :오름차순 (default)
DESC : 내림차순
# 컬럼 번호를 이용한 정렬도 가능 SELECT EMPNO, ENAME, SAL FROM EMP ORDER BY 3 DESC; ## => SAL 기준으로 정렬 ### 존재하지 않는 컬럼 기준으로 정렬할 경우 ex 4, 그럼 에러남 ## 복수 컬럼 이용한 정렬도 가능 ## 앞의 컬럼을 먼저 정렬하고, 만약 같은 값이 존재한다면 다음 정렬 기준으로 재정렬한다.
DECODE CASE 분기 함수DECODE : A = B 이면 X, A ≠ B 이면 Y를 출력 (A와 B가 같은지에 대한 조건 체크)
CASE : DECODE 와 달리, A와 B 사이에 부등호 관계(크거나 작은 조건)를 처리할 때 주로 사용
DECODE(A, B, X, Y) # A = B 이면 X 아니면 Y DECODE(A, B, X, C, Y, Z) # A = B 이면 X, A = C이면 Y, A != B AND A != C 이면 Z DECODE(A1, B, DECODE(A2, C, X, Y), Z) # A1 = B 이면서 A2 = C 이면 X, A1 = B 이면서 A2 != C 이면 Y, A1 != B 이면 Z # DECODE 내부의 DECODE 중첩
** 비교하는 값인 B, C 와 출력하는 값인 X, Y, Z 자리에 null 을 사용할 수 있다.
RANK DENSE_RANK ROW_NUMBERRANK동일한 값이면 중복 순위를 부여하고, 다음 순위는 해당 개수만큼 건너뛰고 반환한다.
DENSE_RANK동일한 값이면 중복 순위를 부여하고, 다음 순위는 중복 순위와 상관없이 순차적으로 반환한다.
ROW_NUMBER중복 관계없이 순차적으로 순위를 반환한다.