데이터베이스의 설계 단계에서 데이터 중복을 제거하고 데이터 무결성을 유지하기 위한 과정이다.
특징으로는 다음과 같다.
모든 속성은 반드시 하나의 값만 가져야 한다.
| 이름 | 직업 |
|---|---|
| 이지은 | 배우, 가수, 작곡가 |
직업 속성의 값을 하나만 갖도록 1차 정규화를 적용한다.
| 이름 | 직업 |
|---|---|
| 이지은 | 배우 |
| 이지은 | 가수 |
| 이지은 | 작곡가 |
또한 유사한 속성이 반복되는 경우도 1차 정규화의 대상이다.
| 이름 | 사이트1 | 사이트2 | 사이트3 |
|---|---|---|---|
| 이지은 | 인스타그램 | 페이스북 | 유튜브 |
사이트 속성이 반복되기 때문에 다음과 같이 분리한다.
| 이름 | 사이트 |
|---|---|
| 이지은 | 인스타그램 |
| 이지은 | 페이스북 |
| 이지은 | 유튜브 |
엔터티의 모든 일반 속성은 반드시 모든 주식별자에 종속되어야 한다. 제2정규형을 적용하는 이유는 삽입, 삭제, 갱신 시 이상이 발생할 수 있기 때문이다.
| 주문번호 | 음료코드 | 주문수량 | 음료명 |
|---|---|---|---|
| 202106010010 | A1001 | 2 | 아메리카노 |
| 202106010011 | A1002 | 1 | 카페라떼 |
| 202106010012 | A1001 | 3 | 아메리카노 |
주문번호와 음료코드가 주식별자이며, 일반속성인 음료명은 음료코드 속성에만 종속되기 때문에 분리한다.
| 주문번호 | 음료코드 | 주문수량 | 음료코드 | 음료명 | |
|---|---|---|---|---|---|
| 202106010010 | A1001 | 2 | A1001 | 아메리카노 | |
| 202106010011 | B1002 | 1 | B1002 | 카페라떼 | |
| 202106010012 | A1001 | 3 |
기본키가 단일키일 경우 제2정규형은 항상 만족한다.
주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
| 일련번호 | 이름 | 소속사코드 | 소속사명 |
|---|---|---|---|
| 1 | 이지은 | A1001 | EDAM엔터테이먼트 |
| 2 | 김향기 | B1004 | 지킴엔터테이먼트 |
| 3 | 유건우 | B1004 | 지킴엔터테이먼트 |
일련번호가 주식별자이며, 소속사코드와 소속사명은 서로 종속되기 때문에 분리한다.
| 일련번호 | 이름 | 소속사코드 | 소속사코드 | 소속사명 | |
|---|---|---|---|---|---|
| 1 | 이지은 | A1001 | A1001 | EDAM엔터테이먼트 | |
| 2 | 김향기 | B1004 | B1004 | 지킴엔터테이먼트 | |
| 3 | 유건우 | B1004 |
문제
아래 논리 데이터 모델을 3차 정규화까지 수행했을 때 도출되는 엔터티 수는 몇인가? (하나의 대출자에 대해 하나의 대출번호로 여러 개의 도서 대출 / 반납을 관리하고자 한다고 가정하고, 엔터티 통합은 고려하지 않음)
[학생]:학번(PK),성명,학과번호
[학과]:학과번호(PK),학과명
[교수]:LAB실이용승인교수번호(PK),LAB실이용승인교수명
[LAB실이용신청]:학번(PK),LAB실이용신청일(PK),LAB실이용시작일,LAB실이용만기일,LAB실승인교수번호
[대출]:대출번호(PK),대출자번호,대출자신분구분,대출일자
[대출도서]:대출번호(PK),대출도서번호,반납일자
[도서]:대출도서번호(PK),대출도서명,출판사명,출판년월,대표저자명,ISBN
데이터베이스 설계에서 정규화를 통해 분리된 테이블을 특정 성능 향상이나 시스템 요구에 따라 다시 결합하거나 중복 데이터를 허용하는 과정이다. 성능 최적화와 효율적인 데이터 엑세스를 위해 데이터 모델을 조정하는 것이다.
반정규화의 필요성은 다음과 같다.
실시간으로 다수의 트랜잭션을 처리하는 시스템으로, 주로 운영 환경에서 사용한다. 데이터의 입력, 저장, 수정 및 조회를 빠르게 처리하며, 은행, 전자상거래, 예약 시스템 등에 활용된다.
주요 특징으로는 다음과 같다.
구성 요소로는 다음과 같다.
대규모 데이터를 분석하고 요약 정보와 통찰력을 제공하는 시스템이다. 데이터 분석, 보고서 생성, 비즈니스 인사이트를 제공하며, 데이터 마트, 비즈니스 인텔리전스, 대시보드 시스템 등에 활용된다.
주요 특징으로는 다음과 같다.
구성 요소로는 다음과 같다.
Oracle에서 비정형 데이터를 다루기 위한 LOB 타입이 있다.
OLTP는 데이터 생성, OLAP는 데이터 활용을 위한 시스템이다. 즉, OLTP에서 생성된 데이터를 OLAP로 추출하여 분석한다.
ETL(Extract, Transform, Load) 프로세스란 데이터 웨어하우스로 데이터를 전송하기 위한 과정이다.
OLTP ETS OLAP.
데이터베이스 설계의 한 단계로 데이터의 구조와 관계를 기술하는 모델이다. 특정 DBMS에 종속되지 않으며 데이터의 논리적 구조를 나타낸다.
엔터티(Entity)와 속성(Attribute)을 정의하며, 관계(Relationship)와 제약 조건을 표현한다. 데이터 중복 제거를 위한 정규화를 적용한다.

데이터베이스 설계의 최종 단계로 특정 DBMS에 종속적인 데이터 구조를 정의하는 모델이다. 데이터의 저장소, 성능, 보안을 고려하여 실제로 구현한다.
데이터 타입과 제약 조건을 지정하고, 인덱스와 파티션, 저장소 구조를 설계한다. 또한 DBMS의 기술적 제약 및 성능 최적화를 반영한다.

논리 모델에서 정의된 엔터티와 관계를 기반으로 물리적 테이블을 생성한다. 속성은 데이터 타입와 제약 조건으로 매핑하며, 데이터베이스의 성능을 고려하여 인덱스와 파티션을 추가한다.
변환 시 고려사항으로는 다음과 같다.
개념적 설계 논리적 설계 물리적 설계.
데이터베이스를 관리하고 조작하기 위한 언어이다. 관계형 데이터베이스에서 데이터를 검색, 추가, 수정, 삭제(CRUD)하는 데 사용하며, 데이터를 정의, 조작, 제어하기 위한 명령어 집합을 제공한다.
데이터베이스 객체를 정의하거나 변경하는 데 사용한다.
CREATE : 테이블, 뷰, 인덱스 생성.ALTER : 기존 객체 수정.DROP : 객체 삭제.TRUNCATE : 테이블 데이터 초기화.
CREATE TABLE AS SELECT: 다른 테이블이 있는 데이터를 복사하여 새로운 테이블을 생성.
CREATE 예시는 다음과 같다.
CREATE TABLE CUSTOMERS (
CUSTOMER_ID NUMBER PRIMARY KEY,
NAME VARCHAR2(50) NOT NULL,
EMAIL VARCHAR2(100) UNIQUE,
PHONE VARCHAR2(15),
CREATED_AT DATE DEFAULT SYSDATE
);
VARCHAR: MySQL.
VARCHAR2: Oracle.
현업에서
NOT NULL은 오류를 방지하기 위해 자주 사용하지 않는다.
ALTER 예시는 다음과 같다.
--컬럼 추가
ALTER TABLE CUSTOMERS ADD ADDRESS VARCHAR2(200);
--컬럼 사이즈 or 데이터 타입 변경
ALTER TABLE CLIENTS MODIFY CONTACT_EMAIL VARCHAR2(200);
--컬럼 삭제
ALTER TABLE CUSTOMERS DROP COLUMN PHONE;
--컬럼명 변경
ALTER TABLE CLIENTS RENAME COLUMN NAME TO FULL_NAME;
--테이블명 변경
ALTER TABLE CUSTOMERS RENAME TO CLIENTS;
DROP과 TRUNCATE 예시는 다음과 같다.
--테이블 삭제
DROP TABLE CUSTOMERS;
--테이블 데이터 초기화
TRUNCATE TABLE CUSTOMERS;
데이터베이스의 데이터를 조작하는 데 사용한다.
SELECT : 데이터 검색.INSERT : 데이터 삽입.UPDATE : 데이터 수정.DELETE : 데이터 삭제.INSERT와 SELECT 예시는 다음과 같다.
--데이터 삽입
INSERT INTO CUSTOMERS (CUSTOMER_ID, NAME, EMAIL, PHONE)
VALUES (1, 'JOHN DOE', 'JOHN.DOE@EXAMPLE.COM', '555-1234');
--데이터 조회
SELECT NAME, EMAIL
FROM CUSTOMERS
WHERE PHONE = '555-1234';
UPDATE와 DELETE 예시는 다음과 같다.
--데이터 변경
UPDATE CUSTOMERS
SET EMAIL = 'JOHN.NEW@EXAMPLE.COM'
WHERE CUSTOMER_ID = 1;
--데이터 삭제
DELETE FROM CUSTOMERS
WHERE CUSTOMER_ID = 1;
DELETE는TRUNCATE와는 다르게ROLLBACK이 가능하기 때문에 더 느리다.
데이터베이스 접근 권한을 관리한다.
GRANT : 권한 부여.REVOKE : 권한 회수.GRANT와 REVOKE 예시는 다음과 같다.
--권한 부여
GRANT SELECT ON CUSTOMERS TO USER1;
--권한 회수
REVOKE SELECT ON CUSTOMERS FROM USER1;
트랜잭션 관리를 위한 명령어를 제공한다.
COMMIT : 트랜잭션 확정.ROLLBACK : 트랜잭션 취소.SAVEPOINT : 특정 지점 저장.
COMMIT과ROLLBACK을 하지 않을 경우 휘발된다.
COMMIT와 ROLLBACK 예시는 다음과 같다.
--트랜잭션 확정
INSERT INTO CUSTOMERS (CUSTOMER_ID, NAME)
VALUES (2, 'JANE DOE');
COMMIT;
--트랜잭션 취소
DELETE FROM CUSTOMERS
WHERE CUSTOMER_ID = 2;
ROLLBACK;
SELECT 기초SELECTSQL에서 데이터를 검색하는 명령어이다. 테이블에서 원하는 데이터를 추출하며, 조건, 정렬, 그룹핑 등을 사용하여 복잡한 질의가 가능하다.
다음과 같이 사용한다.
SELECT 컬럼명 FROM 테이블명;
--예시
SELECT * FROM EMPLOYEES;
SELECT NAME, SALARY FROM EMPLOYEES;
특정 컬럼명을 사용하는 것과 전체 컬럼을 가져오는 것은 성능이 동일하다. DB는 Block을 기준으로 데이터를 저장하며 하나의 Block는 여러 행들을 수평으로 이어서 저장하기 때문에, 성능에 큰 차이가 없다.
SQL 쿼리에서 컬럼이나 테이블에 부여하는 임시 이름이다. 결과 집합의 가독성을 높이고 복잡한 쿼리를 간결하게 작성할 수 있도록 돕는 기능이다.
ALIAS의 특징은 다음과 같다.
AS 키워드를 사용하지만 생략도 가능.컬럼 ALIAS는 연산 결과에 의미를 부여하며 이를 통해 가독성을 높인다. 다음과 같이 사용한다.
SELECT 컬럼명 (AS) 별칭 FROM 테이블명;
--예시
SELECT NAME AS EMPLOYEE_NAME, SALARY AS MONTHLY_SALARY FROM EMPLOYEES;
--연산 결과에 ALIAS 추가
SELECT SALARY * 12 AS ANNUAL_SALARY FROM EMPLOYEES;
테이블 ALIAS는 테이블 이름이 길거나 복잡할 때 간결한 이름으로 대체하며, JOIN 쿼리에서 테이블 이름을 축약하여 사용한다.
SELECT 컬럼명 FROM 테이블명 별칭;
--예시
--단일 테이블 사용
SELECT E.NAME, E.SALARY FROM EMPLOYEES E;
--JOIN 쿼리에서 사용
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
--조합 사용
SELECT E.NAME AS EMPLOYEES_NAME, D.DEPARTMENT_NAME AS DEPT_NAME
FROM EMPLOYEES E, DEPARTMENT D
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID;
--특수문자 또는 공백, 한글 포함
SELECT NAME AS "이름", SALARY AS "급여" FROM EMPLOYEES;
ALIAS를 설정하고 사용하지 않으면
부적합한 식별자에러가 발생한다.
JOIN시에WHERE절을 사용하지 않으면 CROSS JOIN이 된다.
NULL데이터베이스에서 NULL은 "값이 없음"을 의미한다. 숫자나 문자 등 어떠한 데이터도 저장되지 않은 상태이며, 이는 0이나 빈 문자열("")과는 다르다.
NULL 연산의 특징은 다음과 같다.
NULL 값은 다른 값과 비교할 수 없음.=, <>, <, >, <=, >=)을 수행하면 항상 FALSE를 반환.SELECT * FROM EMPLOYEES WHERE SALARY = NULL; --FALSE를 반환
SELECT * FROM EMPLOYEES WHERE SALARY IS NULL;
WHEREWHERE조건을 지정하여 데이터를 필터링한다. SELECT, UPDATE, DELETE와 함께 사용한다.
SELECT NAME FROM EMPLOYEES WHERE SALARY > 50000;
SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 10;
다양한 연산자를 활용하여 복잡한 조건 설정이 가능하다.
= : 값이 같은지 비교.<> : 값이 다른지 비교.>, < : 값이 크거나 작은지 비교.>=, <= : 값이 크거나 같음 또는 작거나 같음을 비교.SELECT * FROM EMPLOYEES WHERE SALARY > 50000;
AND여러 조건이 모두 TRUE인 경우만 결과를 반환한다.
SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 10 AND SALARY > 50000;
OR여러 조건 중 하나만 TRUE인 경우 결과를 반환한다.
SELECT * FROM EMPLOYEES WHERE DEPARMENT_ID = 10 OR DEPARTMENT_ID = 20;
NOT조건의 결과를 반전시킨다.
SELECT * FROM EMPLOYEES WHERE NOT SALARY > 50000;
LIKE특정 패턴을 가진 데이터를 검색한다. 와일드카드를 활용한다.
% : 0개 이상의 문자를 대체._ : 1개의 문자를 대체.%, _가 포함된 패턴을 찾을 때 활용.SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 LIKE '패턴' ESCAPE '문자';문제
파일명이Data_2024로 시작하는 데이터를 검색하시오.SELECT FILE_NAME FROM FILES WHERE FILE_NAME LIKE 'Data\_2024%' ESCAPE '\';
IN지정된 값 중 하나와 일치하는 데이터를 찾는다. OR 조건으로 대체 가능하다.
SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID IN (10, 20, 30);
IN연산자와OR연산자는 내부적으로 동일한 성능을 갖는다.
BETWEEN지정된 범위 내에 있는 값을 찾으며, 범위는 시작값과 끝값을 포함한다.
SELECT * FROM EMPLOYEES
WHERE SALARY BETWEEN 30000 AND 50000;
초과, 미만이 아닌 이상, 이하이다.
IS NULLNULL 값을 가진 데이터를 찾는다.
SELECT * FROM CUSTOMERS WHERE EMAIL IS NULL;
SELECT * FROM CUSTOMERS WHERE EMAIL IS NOT NULL;
| 우선순위 | 연산자 |
|---|---|
| 1 | 괄호 (, ) |
| 2 | 비교 연산자 =, <>, <, >, <=, >= |
| 3 | 논리 연산자 NOT |
| 4 | 논리 연산자 AND |
| 5 | 논리 연산자 OR |
데이터베이스에서 하나의 논리적인 작업 단위를 의미한다. 일련의 작업이 모두 성공하거나 실패하는 것을 보장하며, 데이터의 무결성과 일관성을 유지하기 위한 기본 단위이다.
ROLLBACK하여 원래 상태로 복구.