728x90

1. 개요

- 자재관리(Materials Management, MM) 모듈은 기업의 구매, 자재관리 업무를 지원한다.

- 자재구매계획(inventory planning), 구매관리, 자재관리, 송장검증 등으로 구성

- 대금지급은 송장(대금청구서) 이검증된 금액에 대해 대금을 지불하는 업무 -> 회계부서에서 수행(FI 모듈)

 

 

 

2. 프로세스

  •  재고의 구분 
    • 원재료 : 제품 생산에 사용하기 위해 구매된 자재
    • 재공품 : 제조과정 중에 있는 재고
    • 제품 : 판매 가능한 완성된 상태의 완성품
    • 상품 : 판매를 목적으로 매입한 제품

2-1. 자재구매계획(Inventory Planning)

- 재고의 최적 수량 및 적절한 구매 시기를 결정하는 것

- 자재소요계획(MRP), 소비기준계획(CBP) 등에서 산출한 자재요구량에 근거하여  자재구매계획 수립

- 자재요구목록 생성하고 소스리스트(source list)와 연계하여 구매요청서 자동 생성 기능 제공

- 자재요구량 산출방식에는 MRP, CBP 방식 등이 있으며 CBP에는 다양한 방식이 있다.

    - 재주문점방식(수작업/자동), 기간별 재주문 방식, 수요예측모형 방식 등

 

2-2. 구매관리(Purchasing Management)

- 생산용 자재 뿐만 아니라 고정자산, 비품, 공기구 등의 일반 물품들을 구매하는 일련의 과정

- 구매요청, 견적요청, 업체선정, 계약 및 주문 등의 업무를 포함한다.

구매관리 프로세스

1) 구매요청(Purchase Requisition, PR) 관리

- 물품에 대한 구매요청, 직접 입력하거나 생산관리,설비관리, 프로젝트 등의 모듈 등에서 연계하여 생성되어 구매부서에 요청된다.

- 생성된 구매요청은 견적요청서(RFQ), 구매주문 또는 구매계약의 소스로 활용된다(구매주문관리 업무의 자동화를 지원)

2) 견적요청서 : 공급업체들에게 보내져 견적서로 되돌아오고 업체선정을 위해 관리/사용된다.

3) 업체선정지원

4) 구매주문(Purchase Order, PO)

- 특정 공급업체에 구매를 위한 주문을 하는 행위

- 직접 입력하거나 구매요청, 견적요청서, 구매계약 등을 참조하여 선정된 공급업체를 상대로 구매주문 자동생성
- 구매요청과 구매주문은 N:M 관계이다. 여러 요청이 하나의 주문으로 해결될 수도 있고, 하나의 요청이 여러 주문으로 처리되어야 할 수도 있기 때문이다.

5) 총괄 구매주문(Blanket PO)

- 소모품 구매 경우와 같이 엄격한 재고관리나 구매관리가 필요하지 않은 경우에 사용되는 방식

- 견적요청서나 입고 등의 과정을 생략하고 구매요청 -> 구매주문 -> 송장검증의 단계로 간소화하여 진행한다.

6) 단가계약방식 : 품목에 대한 구매계약을 맺어 주문지시서(Release Order)로 구매 처리를 하는 방식

 

2-3. 자재관리(Materials Management)

- 생산활동에 필요한 자재의 입고와 출고 관리

1) 자재입고(Goods Receipt, GR)

- 자재 입고처리 완료 시  재고 증가/채무 발생 회계처리가 필요하다 

-> 자재 입고 시 재고수량이 증가하고 입고 가계정(GR clearing account, GR/IR 계정)로 자동회계 전표가 생성, 반영된다.

but, 비평가자재인 경우 회계문서 없이 자재문서만 생성된다.

-> 송장 검증 시 가계정의 금액이 소멸하는 형태로 회계처리가 수행된다.

- 가계정이란 계정과목이나 금액이 확정될 때까지 잠정적으로 회계 처리하여 두는 계정을 의미

- 재고자산 평가방법으로는 개별법, 선입선출법, 후입선출법, 총평균법, 이동평균법 등이 있다.

 

2) 자재 생산출고(Good Issue)

- 생산을 위한 출고, 판매를 위한 출고 등 모두 포함된다.

- 출고처리는 2가지 방법이 있다.

    - 불출 시점에 실제 출고량을 생산출고로 처리하는 방법

    - 생상된 제품 수량에 따라 소요된 자재 사용실적을 backflush하는 방법

3) 자재이송(Goods Transfer)

4) 배치(Batch)관리 및 일련번호관리

 - 플랜트 -> 저장위치 -> 배치 순서로 하위 분류라고 생각하면 편함.

 - 배치관리는 식품처럼 같은 제품이라도 상이한 유통기한을 가지는 자재들을 분류하여 관리하기 위해 사용

5) 재고실사

6) 재고 이전(Stock Transfer)

 - 플랜트 단위로 재고자산을 평가하므로 플랜트 간 자재 이전은 자재문서와 회계문서 둘 다 발생시킴

 7) Transforing Postring(자재 상태변경)

 - 품질재고, 가용재고, 보류재고 등으로 자재의 상태를 변경함

 - Material to Material : 자재를 다른 자재 항목으로 옮기는 것(자재 마스터 등의 데이터에 문제가 있는 경우 등에 사용)

  -> 재고 평가 차이 문제 발생 가능성이 있어 해당 업무를 진행할 때는 회계팀 등에 문의해야함.

 

2-4. 송장검증(Invoice Verification)

- 구매물품에 대한 정확한 대금지급을 위해 공급업체가 보내온 송장(세금계산서)과 실제 구매 사항을 확인하는 활동을 말한다.

- 입고기준 송장검증/송장보류 기능/자동송장검증(ERS)

- 송장검증이 완료되면 가계정을 소멸하기 위한 자동 회계전표가 발생하고 매입채무가 재무회계 상에 반영된다.

- 정발행 : 공급업체가 당사에게 송장(세금계산서)를 발행할때, 역발행 : 당사가 공급업체라서 송장(세금계산서)를 발행해서 줄 때

- 자동송장처리(ERS) : 입고문서 기반으로 송장으로 자동으로 생성/처리

- 수령 송장 입력(T-CODE : MIRO)

- 일반적으로 해당 vendor별로 PO기반 송장(세금계산서)을 월초에 입력 -> 외상매입금이 발생하게 된다.

 

 

 

3. 마스터데이터

1. 자재마스터(Material Master)

- 자재, 상품, 제품 등에 대한 광범위한 정보가 관리된다.

- 각 업무 부서별로 나누어진 view로 관리된다.

2. 공급업체마스터(Vendor Master)

- 공급업체에 대한 기준 정보 , 재무회계 모듈의 채무관리의 마스터로도 관리된다.

- 일반데이터, 회사코드데이터, 영업데이터로 나누어진다.

3. 소스리스트(Source List)

- 특정 공장의 특정 자재들에 대하여 자재를 조달할 수 있는 공급업체의 목록

- 자재소요계획(MRP)의 정보를 가지고 자동으로 구매요청서 생성을 가능하게 하는 마스터데이터이다.

4. 구매정보레코드(Purchasing Info Record)

- 특정 공급업체의 특정자재 공급과 관련한 가격을 포함한 구매조건 정보들을 관리 ex) 가격, 납기, 세금코드 및 각종 설정값

- 주문과 같은 구매문서들의 초기 기본값을 제공한다.

728x90
728x90

영업유통(Sales and Distribution,SD)

  • 기업의 영업 및 제품 출하부서의 업무를 지원하는 모듈
  • 사전 영업활동, 판매주문처리, 출하관리, 대금청구 및 판매분석

SD 모듈 기능 구성

영업관리(Sales Management)

  • 마케팅 및 영업활동관리, 판매주문처리, 출하관리 등의 업무로 구성
  • 사전영업활동(pre-sales activities) : 판매 주문처리 이전의 영업활동으로 고객정보분석, 고객상담/문의, 견적활동, 경쟁사 및 경쟁제품 관리 등
    • 가격리스트를 통하여 가격정보 제공
    • 가용성 점검(Available To Promise, ATP)
    • 출하 스케줄링 기능
    • 견적서(Quotation) 생성 : 특정기간에 사전에 제안한 가격, 제품이나 서비스에 제공에 대한 제안서
  • 판매주문관리 : 견적서의 승인이나 주문요청이 들어오면 이를 근거로 판매주문을 생성하는 활동
    • 주화면은 헤더정보(header)와 라인 아이템(line items) 영역으로 구분된다
    • 헤더 영역은 고객코드, 고객명, 합계금액 등의 정보 관리되어진다
    • 라인 아이템 영역은 제품코드, 제품명, 수량, 단가 등이 관리되어진다
    • 부화면은 납품정보에 대한 스케줄 라인(schedule lines) 영역을 보여주기 위한 화면, 납품일정 및 납품장소 등의 정보 관리

판매주문의 화면 구성(주화면)

  • 라인 아이템의 정보와 스케줄 라인의 정보의 관계는 1대N 관계를 갖는다(하나의 제품이 여러 납품일정과 납품장소를 가질 수 있으므로)

판매주문의 기능 구성

  • 판매주문관리
    • 판매주문 처리 시 다양한 형태의 판매 주문 처리 가능
      • 일반판매주문(Standard Order) : 재고생산 또는 주문자생산방식 혹은 상품판매의 일반적인 형태
      • 현금판매주문(Cash Order) : 주문과 동시에 대금이 지불되는 경우
      • 긴급판매주문(Rush Order) : 긴급한 출하배송, 주문과 동시에 출하지시서 생성 및 출하작업, 대금청구 실행
      • 위탁판매주문(Consignment Order) : 제품이 위탁상에 이동되어 실제 고객에게 판매되었을 때 매출 인식
      • 제3자 직송주문(3rd Party Order) : 제3자의 제품을 구매하여 직접배송하게 하는 방식
      • 무상출고(Free Of Charge Delivery) : 제품의 가격 없이 물건이 출고(견본품 제공 등)
      • 반품(Return) : 판매된 제품의 반품 처리
      • 매출조정(CR/DR memo request) : 제품의 이동 없이 매출에 대한 조정(제품 하자로 인한 할인, 단가 사후변경, 판매가격 등록 오류 등의 경우 발생)
      • 계약(Contract)형태를 주문유형으로 처리하는 경우
        • 일괄계약 : 포괄적인 계약 내용 -> 납품은 세부적인 주문으로 처리(주문지시서release order 사용), 출하를 위해 또 다른 주문생성 필요
        • 납품일정계획(Scheduling Agreement) : 자세한 납품일정이 포함된 주문유형 -> 별도의 주문처리 없이 납품일정에 따라 출하지시로 배송처리
      • 변형구성(Variant Configuration) 기능 : 제품의 변형구성 기능(variant BOM을 통해 자동 제공), 맞춤형 주문 생산
      • 자재의 기본단위, 판매단위 다를 수 있음 -> 판매단위는 판매오더 생성 시 쓰이는 단위 (ex)기본단위는 EA, 판매단위는 BOX ), 판매단위 없으면 기본단위로 자동 세팅됨
    • 가격결정(Pricing) : 고객별, 지역별, 영업 조직별로 제품들에 대한 다른 단가 체계 지원
      • 가격기준정보로 마스터데이터에서 관리, 주문처리 시, 수주활동지원을 위한 자동 가격결정 기능 지원
      • 고객 맞춤형 주문제품에 대한 가격결정 지원
    • 예상손익분석기능
      • 판매주문 시점에 주문 성사여부를 결정하기 위한 핵심적인 기능
      • MM, PP, CO 모듈과 연계하여 예상손익 계산
      • 예상손익 = 판매가격 + 할증금액 - 할인금액 - 총투입원가(= 제품단가 * 수량 + 판매비용)
    • 가용성 점검 기능 및 출하 스케줄링 기능
      • 가용성 점검(ATP) : 가용수량 = 현 재고 수량 - 출고예정 수량 + 입고예정 수량 <- MM, PP 모듈과 연계
      • 출하 스케줄링
        • 피킹/포장시간
        • 운송리드타임
        • 적재시간
        • 배송시간
        • 후진 스케줄링 : 고객이 희망한 납기일자에 납품이 가능한지 점검하기 위한 스케줄링 방식
        • 전진 스케줄링 : 고객에게 납기가능일자를 제시할 때 사용되는 스케줄링 방식
    • 고객 신용체크(credit limit check) : 판매주문과 제품출고 시점에 자동으로 신용 체크(FI 모듈 연계)
    • 주문 완료 후 자동 생산계획반영 : PP 모듈의 주생산계획(MPS) 기능에 연계
  • 출하관리
    • 출하지시 기능 : 출하지시서(delivery note) 생성
      • 주문결합(Order Combination) 출하 : 주문 여러개를 하나의 출하로
      • 분할납품(Partial Delivery) 출하 : 하나의 주문을 여러개의 출하로
      • 완전납품(Complete Delivery) 출하 : 주문과 출하 1대1
    • 피킹 : 저장창고에서 꺼내는 것, 배치(batch)번호 혹은 일련번호로 품목 관리, 크로스도킹(중간 저장창고 없이 배송)
    • 포장
    • 출고(Goods Issue, GI) : 출고처리 시 MM모듈의 자재 수량 감소, 회계전표 발생 -> FI 모듈 전송
  • 대금청구 및 입금관리
    • 송장 : 대금청구를 위한 서류, 국내에서는 세금계산서로 대신한다.
    • 대금청구(billing) : 출고처리 완료 후 송장을 생성하여 고객에게 대금 청구, 매출과 채권이 동시에 발생 -> FI 모듈로 외상매출금과 매출회계전표를 발생시켜 전송
      • 출하근거 대금청구
      • 통합 대금청구
      • 분할 대금청구
    • 입금관리 : 고객이 지급한 금액을 입금처리 -> 현금 증가, 외상매출금 감소 회계전표 생성

SD 모듈 조직 구조

영업조직 - sd 최상위 레벨 조직
유통경로 - 내수/직수출
제품군  - 영업을 목적으로 제품분류
영업영역 - 위 세 개랑 묶어놓은 영역 -> 마스터 생성 및 영업문서 생성 등에서 반드시 선택되어야 하는 정보들의 묶음
회사코드 : 영업조직 = 1 : N
영업조직 : 플랜트  = 1:N

영업소(사업장 optional) -> 영업소가 있다면 반드시 영업영역에 지정되어야한다.
영업그룹 : optional, 영업소의 하위개념 -> 영업그룹은 영업소에 지정이 되어야 한다.

 

- 플랜트 : 공장, 창고, 물류센터 셋 중에 하나면 대충 플랜트라고 부른다.

- 저장 위치 : 재고 관리를 위한 조직구조, 하나의 플랜트에 설정이 된다.

- 출하 지점 : 출하 업무를 진행하기 위한 장소, 물리적으로 존재하지 않아도 비즈니스 프로세스 처리를 위해 시스템 내에 반드시 존재해야 한다,  납품문서 생성

SD 모듈 마스터데이터

  • 고객마스터(Customer Master)
    • 일반 데이터(general data) : 일반적인 정보
    • 영업영역 데이터(sales area data) : 가격, 선적 조건등의 영업 정보
    • 회사코드데이터(company code data) : 계정, 보험 등 회계에 관한 정보 관리
    • FD01에서 일반데이터와 회사코드데이터 생성
    • XD01에서 일반, 영업영역데이터 생성
    • VD01 에서 영업영역 데이터 생성
    • 고객 마스터의 계정 지정 그룹은 회계 전표에서 계정 지정 기준으로 사용됨
    • 비즈니스 파트너 : 고객사이의 연관관계 설정, 주문처와 납품처를 따로 설정할 수 있도록..
  • 조건마스터(condition Master) : 판매조건과 관련된 정보 관리
    • 가격, 할증/할인, 운송조건(freights), 세금 정보 등
  • 고객-자재 정보 레코드(Customer-Material Info Record) : 특정 고객을 위하여 사전에 정의된 제품 주문, 배송과 관련한 정보
    • 제품단가, 할인, 할증, 출하정보, 창고, 납품장소 등을 포함 -> 판매주문 등록 시 default value로 제공된다
728x90

'OLD' 카테고리의 다른 글

1. 컴퓨터 구조를 공부하는 이유  (0) 2023.11.16
SAP ERP 개론 - 3. MM 모듈 개요  (0) 2023.06.14
SAP ERP 개론 - 1. SAP에 대하여  (0) 2023.06.11
MyBatis의 fluchCache옵션에 대하여  (0) 2023.04.11
SQLD 정리 2  (1) 2023.03.18
728x90

ERP 시스템이란

  • Enterprise Resource Planning(전사적 자원관리), ERP 시스템은 자원을 효율적으로 사용하기 위해 판매 주문에서 제품생산, 출하까지의 공급사슬(SCM)과 회계관리, 인적자원관리를 포함한 기업의 전체 업무를 통합 관리하는 정보 시스템이다.
  • SAP ERP이 제공하는 모듈
    • 영업 및 유통(Salses and Distribution, SD)
      • 기업의 영업부서 및 제품 출하 업무를 지원하는 모듈
      • 사전 영업활동, 판매주문처리, 출하/운송, 대금청구 및 입금관리, 판매 분석 등의 업무 지원
      • 다양한 형태의 주문 처리 기능 제공, 자동 여신 관리, 납기에 대한 가용성 검사 실시간 수행, 출고 및 매출처리 시 자동 회계처리 기능 등을 제공
    • 자재관리(Materials Management, MM)
      • 구매와 자재관리 업무 지원
      • 자재소요량 산출, 구매요청, 발주, 입고, 출고 및 대금지급 등의 업무 지원
      • 자재소요계획(Material Requirements Planning, MRP)과 소비기준계획에 근거한 자재구매 계획 수립, 구매요청, 견적서 요청 생성, 업체선정, 구매계약 및 주문 처리 기능, 송장 자동 검증 기능 제공 및 송장 검증 시 자동회계처리 기능 제공
    • 생산관리(Production Planning, PP)
      • 기업의 생산계획 수립 및 생산활동에 대한 관리업무 지원
      • 자재구성표(Bill Of Materials, BOM), 공정(Routing) 및 작업장과 같은 생산활을 위한 기준 정보 관리
      • 생산계획 수립, 자재소요량계획, 생산지시, 실적관리, 생산능력계획 기능 등을 제공
    • 품질관리(Quality Management, QM)
      • 제품의 전 수명주기에 걸치는 품질관리 업무 지원
      • 감사관리, 품질 엔지니어링, 품질 통제 및 보증, 품질개선 등의 기능 제공
    • 설비관리(Plant Management, PM)
      • 생산계획 달성, 품질 향상, 원가 절감, 설비 보전관리 등의 업무 지원
    • 인적자원관리모듈(Human Resources, HR)
      • 조직관리, 인사관리, 급여관리, 복리후생관리 기능 등을 지원
    • 재무회계(Financial Accounting, FI)
      • 기업의 재무회계 업무 지원
      • 제무제표 작성, 각종 보고서 작성, 채권 및 채무 관리 기능, 실시간 조회 및 분석 기능
    • 관리회계(Controlling, CO)
      • 기업의 전략적 계획과 내부 의사결정에 필요한 정보를 제공하는 모듈
      • 재무회계를 포함한 타 모듈과의 실시간 통합성을 기반으로 간접비관리, 표준원가, 실제원가계산, 원가 차이분석, 원가중심점별 비용관리, 내부오더 관리, 활동회계원가, 수익성분석, 이익중심점회계 등의 기능 제공
    • 자금관리(Treasury, TR)
      • 기업의 현금관리와 유동성 예측을 지원하는 모듈
      • 다양한 금융상품에 대한 거래 및 관리 지원 및 자동 회계처리, 시뮬레이션 기능 등 제공
    • 프로젝트시스템(Project System, PS)
      • 수주 생산 프로젝트, 신제품 개발 및 연구 개발, 마케팅 캠페인 등과 같은 프로젝트성 업무 지원 모듈
      • 일정계획, 원가관리, 자원관리, 예산관리, 진척관리 등의 프로세스 지원
    • 워크플로우(Workflow, WF)
      • SAP ERP시스템 내 문서전달에 대한 자동화를 지원하는 모듈
      • 시스템의 문서나 도면을 자동으로 또는 사용자가 원하는 시점에 배부하는 기능 수행
      • 수신처들을(내부, 외부) 미리 정의하여 관리 가능
  • 3 Tier Architecture(3계층 구조)

3 Tier Architecture

  • Presentation Layer(표현층) : SAP GUI라는 프로그램을 통해 사용자 인터페이스와 화면처리를 수행 
  • Application Layer(응용층) : 업무 로직 처리 담당 계층
    • 서버 내부에는 Dispatcher(분배기)와 작업 프로세스들로 구성
    • Dispatcher는 SAP GUI와의 통신 및 미들웨어로서 부하를 분산하는 기능 제공
    • 작업프로세스들은 실제로 업무처리를 위한 트랜잭션들을 수행, 이 프로그램들은 ABAP이란 언어로 작성
  • Database Layer : DBMS가 탑재된 서버

Database Layer

  • SAP에서 쓰이는 Open SQL은 인터페이스를 거쳐 Native SQL로 변환되어 사용되어진다.
  • Open SQL을 사용하면 DB Vendor에 독립적이다.

 

SAP ERP의 조직구조

  • 클라이언트(Client)
    • SAP ERP에서 사용되는 고유 용어, 컴퓨터공학에서의 Client와는 다른 의미를 지닌다
    • SAP ERP 시슽메에서의 클라이언트는 서로 독립적인 비즈니스 데이터를 저장, 관리할 수 있는 단위로 하나의 SAP ERP 시스템은 여러 개의 클라이언트를 구성할 수 있다.
    • 클라이언트는 실질적인 SAP ERP 조직구조의 최상위 요소로, 하나의 클라이언트에는 다수의 회사를 관리할 수 있는 구조로 되어 있다.
  • SAP ERP 조직구조

SAP ERP 조직구조

  • 회사 - 연결재무제표를 만드는 단위
  • 회사코드 - 법적으로 독립된 법인
  • 공장 - 제품과 서비스 생산, 자재소요량 계획(MRP) 운영단위
  • 저장창고 - 자재와 제품을 보관하는 장소

 

SAP ERP의 마스터 데이터

  • 마스터 데이터(Master Data)
    • 해당업무처리를 위해 기본적으로 필요한 데이터를 의미
    • 업무처리 과정에서 발생하는 데이터를 트랜잭션 데이터(Transaction Data)와 성격이 다른 데이터
    • 고객 마스터, 공급업체 마스터, 자재 마스터, 자재구성표(BOM), 작업장, 라우팅, 계정과목, 원가요소, 직무, 포지션, 종업원 마스터, 설비 마스터 등이 있다.
728x90

'OLD' 카테고리의 다른 글

SAP ERP 개론 - 3. MM 모듈 개요  (0) 2023.06.14
SAP ERP 개론 - 2. SD 모듈 개요  (0) 2023.06.12
MyBatis의 fluchCache옵션에 대하여  (0) 2023.04.11
SQLD 정리 2  (1) 2023.03.18
SQLD 정리 1  (0) 2023.02.09
728x90

Instance의 equality

  • MyBatis에서 같은 parameter를 가지고 같은 SQL을 호출하게 되면 MyBatis는 이전과 같은 결과를 출력해야 하므로 실행 시간 단축과 자원 절약을 위해
    객체를 새로 생성하지 않고 cache에 저장된 객체를 가져와 재활용한다.
  • MyBatis는 Statement를 생성하여 sql문과 함께 parameter를 가지고 있다가 이를 기반으로 JDBC로 접근한다. 이 때 PreparedStatement를 생성하고 cache에 저장한다.
  • <select id="selectUserById" resultType="User" flushCache="true">
  • flushCache 옵션을 사용하여 캐시를 비우고 sql문을 실행하도록 할 수 있다.
    즉, 같은 쿼리를 중복 실행하도록 할 수 있다.
728x90

'OLD' 카테고리의 다른 글

SAP ERP 개론 - 3. MM 모듈 개요  (0) 2023.06.14
SAP ERP 개론 - 2. SD 모듈 개요  (0) 2023.06.12
SAP ERP 개론 - 1. SAP에 대하여  (0) 2023.06.11
SQLD 정리 2  (1) 2023.03.18
SQLD 정리 1  (0) 2023.02.09
728x90

sqld-2

SQL 기본

관계형 데이터베이스

  • 계층형 데이터베이스
  • 네트워크형 데이터베이스
  • 관계형 데이터베이스
  • 집합연산
    • 합집함
    • 차집함
    • 교집합
    • 곱집합
  • 관계연산
    • 선택연산
    • 투영연산
    • 결합연산
    • 나누기연산
  • 테이블 구조
    • 릴레이션 → 테이블
    • 기본키 : unique, 최소성, not null
    • 행 = 튜플
    • 컬럼 = 필드 = 속성
    • 외래키 : 다른 테이블의 기본키 참조
  • SQL 종류
    • DDL
    • DML
    • DCL
    • TCL
  • 트랜잭션 : 트랜잭션은 데이터베이스의 작업을 처리하는 단위
    • 트랜잭션의 특성
      • 원자성(Atomicity) : 트랜잭션은 연산의 전부가 실행되거나 전혀 실행되지 않아야 한다(all or nothing)
      • 일관성(Consistency) : 트랜잭션 실행 결과로 데이터베이스의 상태가 모순되지 않아야 한다.
      • 고립성(Isolation) : 트랜잭션 실행 중에 연산의 중간결과는 다른 트랜잭션이 접근할 수 없다.
      • 영속성(Durability) : 트랜잭션이 성공적으로 실행되면 그 결과는 영구적으로 보장되어야 한다.
  • SQL 실행 순서
    1. 파싱(Parsing) : 문법을 확인하고 구문 분석
    2. 실행(Execution) : 옵티마이저가 수립한 실행 계획에 따라 SQL 실행
    3. 인출(Fetch) : 데이터 읽어서 전송

DDL

CREATE TABLE DEPT(
        deptno   varchar2(4) primary key
    , deptname varchar2(20)
);

CREATE TABLE EMP (
        empno      number(10)
    , ename      varchar2(20)
    , sal        number(10,2) default 0
    , deptno     varchar2(4) not null
    , createdate date default sysdate
    , constraint emppk primary key(empno)
  , constraint deptfk foreign key(deptno) references dept(deptno) ON DELETE CASCADE -- 자동으로 자신도 삭제
);
ALTER TABLE EMP RENAME TO NEW_EMP;

ALTER TABLE EMP ADD (age number(2) default 1);

ALTER TABLE EMP MODIFY (ename varchar2(40) not null); -- 컬럼 변경

ALTER TABLE EMP DROP COLUMN age;

ALTER TABLE EMP RENAME COLUMN ename TO new_ename; -- 컬럼명 변경

ALTER TABLE EMP
ADD CONSTRAINT EMPNO_PK PRIMARY KEY (EMPNO);
DROP TABLE EMP;

DROP TABLE EMP CASCADE CONSTRAINT; -- 해당 테이블의 데이터를 외래키로 참조한 슬레이브 테이블과 관련된 제약사항도 삭제
-- 외래키(Foreign key)로 물린 하위 테이블들 까지 함께 삭제된다. DEPT 삭제 시 EMP 도 삭제된다는 뜻

VIEW

  • 테이블로부터 유도된 가상의 테이블
  • 데이터 딕셔너리에 SQL문 형태로 저장하되 실행 시에 참조된다
  • 특징
    • 참조한 테이블이 변경되면 뷰도 변경
    • 뷰에 대한 입력 수정 삭제에는 제약 있음
    • 특정 컬럼만 조회시켜 보안을 향상
    • 한번 생성된 뷰는 변경 불가 → 삭제하고 재생성해야 한다(ALTER 불가)
CREATE VIEW T_EMP AS
    SELECT * FROM EMP;

DROP VIEW T_EMP;
  • 뷰의 장단점
    • 장점
      • 특정 컬럼만 조회 → 보안성 향상
      • 데이터 관리가 간단
      • select 문이 간단해짐
      • 하나의 테이블에 대해 여러 개의 뷰 생성 가능
    • 단점
      • 독자적인 인덱스를 만들 수 없음
      • 삽입 수정 삭제가 제한
      • 데이터 구조를 변경할 수 없음

DML

  1. INSERT
INSERT INTO EMP(EMPNO, ENAME) VALUES(1000, 'TOTO');

INSERT INTO DEPT2
         SELECT *
         FROM DEPT;

set autocommit on;
set autocommit off;
show autocommit;

ALTER TABLE DEPT NOLOGGING;
  • Nologging
    • Nologging 옵션은 로그파일의 기록을 최소화 → 입력 성능 향상
    • Buffer Cache라는 메모리 영역을 생략하고 기록한다.
  1. UPDATE
UPDATE EMP 
   SET ENAME = 'TOTO'
 WHERE EMPNO = 100;
  1. DELETE
DELETE FROM EMP
 WHERE EMPNO =100;
  • 테이블 용량이 초과되지 않는다?
    • 테이블에 데이터가 입력되면 Extent에 저장된다
    • 만약 Extent의 크기가 MAX_EXTENTS를 넘어가면 용량 초과 오류 발생 → 최대로 저장할 수 있는 공간의 의미
    • DELETE문으로 데이터를 삭제하면 용량이 감소하지 않고 삭제 여부만 표시하고 용량은 초기화되지 않는다.
    • Data Dictionary에서 테이블 정보 조회 가능
    • SELECT TABLE_NAME , MAX_EXTENTS FROM USER_TABLES
  • → Oracle 데이터베이스는 저장공간을 할당할 때 Extent 단위로 할당한다.
  • 테이블의 모든 데이터 삭제
DELETE FROM TBL;    -- 모든 데이터 삭제, 용량 감소 X
TRUNCATE TABLE TBL; -- 모든 데이터 삭제, 용량 감소 O

인덱스

  • Oracle 데이터베이스는 정렬을 위해 메모리 내부에 할당된 SORT_AREA_SIZE를 사용 → 너무 작으면 성능 저하 발생
  • 정렬을 회피하기 위해 INDEX를 생성할 때 사용자가 원하는 형태로 오름차순 혹은 내림차순으로 생성해야 한다.
  • 정렬은 부하를 주므로 인덱스를 사용해 ORDER BY를 회피할 수 있다.
-- 힌트 사용
SELECT /*+ INDEX_DESC(A) */ * -- 내림차순
  FROM EMP A;

-- index_asc, index 힌트 : 인덱스 영역에서 순방향으로 스캔 하라는 뜻

SELECT /*+ index_asc(e idx_myemp1_ename)  */
      EMPNO, ENAME, SAL FROM MYEMP1 e
WHERE ENAME >= '가'

WHERE

  • 부정비교 연산자
    • != : 같지 않은 것을 조회
    • ^= : 같지 않은 것을 조회
    • <> : 같지 않은 것을 조회
    • NOT 컬럼명 = : 같지 않은 것을 조회
    • NOT 컬럼명 > : 크지 않은 것을 조회
  • 논리연산자
    • AND
    • OR
    • NOT
  • SQL 연산자
    • LIKE ‘%문자열%’
    • BETWEEN A AND B : A이상 B이하
    • NOT BETWEEN A AND B : A미만 B초과
-- IN 사용법

SELECT *
  FROM EMP
WHERE (JOB, SAL) IN
        (
           ('CLERK', 800)
         , ('CLERK', 1300)
        )
;
  • NULL
    • 모르는 값
    • 값의 부재
    • NULL 과 숫자 혹은 날짜를 더하면 NULL
    • NULL과 어떤 값을 비교하면 ‘알 수 없음’ 반환
    • IS NULL, IS NOT NULL 사용
  • NULL 관련 함수
    • NVL : NULL 값을 다른 값으로 대체
      • 사용 방법 : NVL(컬럼명, 대체할 값)
      • 예시 : SELECT NVL(job, 'Unknown') FROM emp;
    • NVL2 : NULL 값일 경우와 NULL이 아닐 경우에 따라 다른 값을 반환
      • 사용 방법 : NVL2(컬럼명, NULL이 아닐 경우 반환할 값, NULL일 경우 반환할 값)
      • 예시 : SELECT NVL2(job, 'Job exists', 'No job exists') FROM emp;
    • NULLIF : 두 값이 같으면 NULL 반환, 다르면 첫 번째 값 반환
      • 사용 방법 : NULLIF(비교할 값1, 비교할 값2)
      • 예시 : SELECT NULLIF(job, 'CLERK') FROM emp;
    • COALESCE : NULL이 아닌 첫 번째 값을 반환, 모두 NULL이면 NULL 반환
      • 사용 방법 : COALESCE(컬럼명1, 컬럼명2, ..., 컬럼명n)
      • 예시 : SELECT COALESCE(job, ename, 'Unknown') FROM emp;

GROUP BY

  • 집계 함수 종류
    • COUNT()
    • SUM()
    • AVG()
    • MAX(), MIN()
    • STDDEV()
    • VARIAN()
    • SELECT deptno, COUNT(*) AS count FROM emp GROUP BY deptno; SELECT deptno, SUM(sal) AS total_salary FROM emp GROUP BY deptno; SELECT deptno, AVG(sal) AS average_salary FROM emp GROUP BY deptno; SELECT deptno, MAX(sal) AS max_salary, MIN(sal) AS min_salary FROM emp GROUP BY deptno; SELECT deptno, STDDEV(sal) AS salary_stddev FROM emp GROUP BY deptno; SELECT deptno, VARIANCE(sal) AS salary_variance FROM emp GROUP BY deptno;
    • 다음은 GROUP BY를 사용하여 위 함수들의 예시
  • SELECT 문 실행 순서
  1. FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

형변환

데이터 타입이 서로 다른 컬럼간의 연산 예시

문자열과 숫자를 더하는 쿼리

SELECT '100' + 200 FROM dual;

위 쿼리는 ORACLE DATABASE에서 에러가 발생합니다.

따라서, TO_CHAR 혹은 TO_NUMBER 함수를 이용하여 데이터 타입을 변환하여야 합니다.

-- TO_CHAR 함수를 이용한 문자열과 숫자를 더하는 쿼리
SELECT TO_CHAR(100) || 200 FROM dual;

-- TO_NUMBER 함수를 이용한 문자열과 숫자를 더하는 쿼리
SELECT TO_NUMBER('100') + 200 FROM dual;

날짜 비교를 위한 암시적 형변환 예시

SELECT *
FROM emp
WHERE hiredate >= '01-JAN-90';
  • 인덱스 칼럼에 형변환을 수행하면 인덱스를 사용하지 못한다
  • 명시적 형변환으로 해결한다.
    • EX) WHERE EMPNO = TO_NUMBER(’100’)

내장형 함수

ORACLE의 내장형 함수 중 문자열 함수는 다음과 같습니다.

  • CONCAT() : 문자열을 합칩니다.
SELECT CONCAT('Hello', ' World') FROM dual;
  • LENGTH() : 문자열의 길이를 반환합니다.
SELECT LENGTH('Hello World') FROM dual;
  • UPPER() : 문자열을 대문자로 변환합니다.
SELECT UPPER('hello world') FROM dual;
  • LOWER() : 문자열을 소문자로 변환합니다.
SELECT LOWER('HELLO WORLD') FROM dual;
  • TRIM() : 문자열의 양쪽 끝에서 공백을 제거합니다.
SELECT TRIM('   Hello World   ') FROM dual;
  • SUBSTR() : 문자열의 일부를 반환합니다. 첫 번째 매개변수는 문자열이고, 두 번째 매개변수는 시작 위치, 세 번째 매개변수는 반환할 문자열의 길이입니다.
SELECT SUBSTR('Hello World', 7, 5) FROM dual;
  • INSTR() : 문자열에서 첫 번째로 나타나는 문자열의 위치를 반환합니다. 첫 번째 매개변수는 대상 문자열, 두 번째 매개변수는 찾을 문자열입니다.
SELECT INSTR('Hello World', 'Wo') FROM dual;
  • REPLACE() : 문자열에서 특정 문자열을 대체합니다. 첫 번째 매개변수는 대상 문자열, 두 번째 매개변수는 변경할 문자열, 세 번째 매개변수는 대체될 문자열입니다.
SELECT REPLACE('Hello World', 'Hello', 'Hi') FROM dual;
  • ASCII() : 문자의 아스키 코드 값을 반환합니다.
SELECT ASCII('A') FROM dual;
  • CHAR() : 아스키 코드 값을 문자로 변환합니다.
SELECT CHR(65) FROM dual;
SELECT SYSDATE
     , EXTRACT(YEAR FROM SYSDATE)  AS YEAR
     , EXTRACT(MONTH FROM SYSDATE) AS MONTH
     , EXTRACT(DAY FROM SYSDATE)   AS DAY
 FROM DUAL
;
  • ABS() : 절대값을 반환합니다.
SELECT ABS(-100) FROM dual;
  • CEIL() : 인수보다 크거나 같은 최소 정수를 반환합니다.
SELECT CEIL(3.14) FROM dual;
  • FLOOR() : 인수보다 작거나 같은 최대 정수를 반환합니다.
SELECT FLOOR(3.14) FROM dual;
  • MOD() : 나머지를 반환합니다.
SELECT MOD(10, 3) FROM dual;
  • POWER() : 제곱 값을 반환합니다.
SELECT POWER(2, 3) FROM dual;
  • ROUND() : 인수를 반올림합니다. 두 번째 매개변수를 사용하여 소수점 이하 자리 수를 지정할 수 있습니다.
SELECT ROUND(3.141592, 2) FROM dual;
  • SIGN() : 인수의 부호를 반환합니다.
SELECT SIGN(-100) FROM dual;
  • SQRT() : 제곱근 값을 반환합니다.
SELECT SQRT(16) FROM dual;
  • TRUNC() : 인수에서 소수점 이하를 제거합니다. 두 번째 매개변수를 사용하여 자리 수를 지정할 수 있습니다.
SELECT TRUNC(3.141592, 2) FROM dual;

DECODE AND CASE

DECODE

DECODE 함수는 값에 따라 다른 값을 반환합니다. 다음은 DECODE 함수의 구조입니다.

DECODE(expression, search1, result1, search2, result2, ..., default)
  • expression : 비교할 값
  • search1, search2, ... : 비교할 값의 목록
  • result1, result2, ... : search에 일치할 때 반환할 값
  • default : search와 일치하는 값이 없을 때 반환할 값

DECODE 함수는 가독성이 떨어지므로, CASE 함수를 사용하는 것을 권장합니다.

CASE

CASE 함수는 DECODE 함수와 유사하지만, 더 다양한 조건을 처리할 수 있습니다. 다음은 CASE 함수의 구조입니다.

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default
END
  • condition1, condition2, ... : 비교할 조건
  • result1, result2, ... : 조건에 일치할 때 반환할 값
  • default : 모든 조건과 일치하지 않을 때 반환할 값

CASE 함수는 다음과 같은 방식으로 사용할 수 있습니다.

SELECT
    CASE
        WHEN job = 'MANAGER' THEN 'Manager'
        WHEN job = 'CLERK' THEN 'Clerk'
        ELSE 'Other'
    END AS job_title
FROM emp;

SELECT ENAME, JOB, SAL,
       CASE JOB
         WHEN 'MANAGER' THEN SAL * 1.2
         WHEN 'SALESMAN' THEN SAL * 1.1
         ELSE SAL
       END AS "Adjusted Salary"
FROM EMP;

위 쿼리는 job 컬럼의 값이 'MANAGER'일 경우 'Manager', 'CLERK'일 경우 'Clerk', 그 외의 경우 'Other'를 반환합니다.

  • ROWNUM: 쿼리 결과 집합에서 반환되는 각 행의 고유 번호입니다. 즉, SELECT 문이 반환하는 결과 집합에서 각 행의 번호를 매기는 열입니다.
  • ROWID: 테이블에서 각 행을 고유하게 식별할 수 있는 식별자입니다. 이 값은 해당 행의 저장 위치를 나타내는 값으로, ROWID 값을 사용하여 테이블에서 특정 행을 참조할 수 있습니다.
SELECT ROWNUM AS "Row Number", ENAME, JOB, SAL
FROM EMP
WHERE ROWNUM <= 3;

SELECT ROWID, ROWNUM AS "Row Number", ENAME, JOB, SAL
FROM EMP
WHERE ROWID = 'AAAHQJAAEAAAB4vAAA';

/*
데이터 파일 번호: 'AAA' (10진수로 0)
블록 번호: 'HQJ' (10진수로 2891)
블록 내 위치: 'AAA' (10진수로 0)
행 번호: 'B4v' (16진수로 AA B4v를 10진수로 변환하면 4703)
즉, 이 ROWID 값은 데이터 파일 0의 2891번 블록 내의 4703번 행을 식별합니다.
첫 번째 AAA는 데이터 파일 번호를 나타내며,
두 번째 AAA는 블록 내에서의 행의 위치를 나타내는 것입니다. 
마지막 AAA는 데이터 파일 내에서 블록의 위치를 나타낸다.
*/
-- SQL Server 
SELECT TOP(10) FROM EMP; -- 10명만 FETCH

-- MySQL
SELECT * FROM EMP LIMIT 10;
  • WITH 구문
WITH VIEWDATA AS 
    ( SELECT * FROM EMP
       UNION ALL
      SELECT * FROM EMP
     )

SELECT * FROM VIEWDATA WHERE EMPNO = '7369'
;

DCL

  • GRANT
GRANT privileges ON object TO user;

GRANT SELECT ON employees TO user1;
GRANT INSERT ON employees TO user2;
GRANT UPDATE ON employees.salary TO user3; -- 특정 컬럼만 UPDATE 가능
GRANT DELETE ON employees TO user4;

GRANT REFERENCES ON departments(dept_id) TO user5; 
-- REFERENCES 권한은 외래 키 제약 조건을 설정하는 데 사용

GRANT EXECUTE ON stored_proc TO user6;
-- 'stored_proc' 저장 프로시저에 대해 EXECUTE 권한을 'user6' 사용자에게 부여함
-- EXECUTE 권한은 저장 프로시저, 함수, 프로시저 등을 실행하는 데 사용
  • WITH GRANT OPTION
    • 특정 사용자에게 권한을 부여할 수 있는 권한 부여
    • 부여자에 대한 권한을 회수하면 부여자가 부여한 권한을 가진 유저에게서도 권한을 회수한다.
  • WITH ADMIN OPTION
    • 테이블에 대한 모든 권한 부여
    • 부여자에 대한 권한을 회수하면 부여자에 대한 권한만 회수한다.
GRANT SELECT, INSERT, UPDATE, DELETE ON EMP TO USER1 WITH GRANT OPTION;
REVOKE privileges ON object FROM user2;

TCL

  • COMMIT은 INSERT, UPDATE, DELETE문으로 변경한 데이터를 데이터베이스에 반영한다.
  • COMMIT이 완료되면 데이터베이스 변경으로 인한 LOCK이 해제된다(UNLOCK)
  • COMMIT이 완료되면 다른 모든 데이터베이스 사용자는 변경된 데이터를 조작할 수 있다.
  • COMMIT을 실행하면 하나의 트랜잭션 과정을 종료한다.
  • ROLLBACK을 실행하면 데이터에 대한 변경 사용을 모두 취소하고 트랜잭션을 종료한다.
  • 이전에 COMMIT한 곳까지만 복구한다
  • ROLLBACK을 실핸한 후 LOCK이 해제된다
  • SAVEPOINT은 트랜잭션을 작게 분할하여 관리하는 것
  • ROLLBACK TO SAVEPOINT명;
BEGIN TRANSACTION;

INSERT INTO employees (id, name, age, department) VALUES (1, 'John Doe', 30, 'Sales');
SAVEPOINT before_update;
UPDATE employees SET age = 35 WHERE id = 1;
INSERT INTO employee_sales (id, amount) VALUES (1, 10000);

-- 에러가 발생하여 롤백을 해야 할 때
ROLLBACK TO before_update;

COMMIT;

SQL 활용

JOIN

SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO (+)
;

SELECT *
FROM EMP
LEFT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO
;

SELECT *
FROM EMP
RIGHT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO
;

SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO (+) = DEPT.DEPTNO
;

-- 교집합
SELECT DEPTNO FROM EMP
INTERSECT 
SELECT DEPTNO FROM DEPT
;

UNION

  • UNION ALL은 정렬은 유발하지 않는다.
  • MINUS 연산은 차집합 조회
  • MS-SQL에서는 MINUS와 동일한 연산이 EXCEPT이다
SELECT DEPTNO FROM DEPT
MINUS
SELECT DEPTNO FROM EMP
;

CONNECT BY

CONNECT BY를 사용하면, 각 노드와 부모 노드 간의 관계를 사용하여 계층 구조를 생성하고 순회할 수 있습니다.

이를 위해서는, 일반적으로 CONNECT BY 조건에 부모와 자식 노드 간의 관계를 나타내는 조인 조건을 지정해주어야 합니다.

SELECT EMP.EMPNO, EMP.ENAME, EMP.MGR, LEVEL
FROM EMP
CONNECT BY PRIOR EMP.EMPNO = EMP.MGR -- PRIOR 키워드는 이전 행을 의미한다. 부모 노드의 EMPNO가 나의 MGR인 것을 찾음
START WITH EMP.MGR IS NULL -- MGR이 NULL인 곳에서 시작
ORDER BY LEVEL; 
EMPNO ENAME MGR LEVEL
7839 KING NULL 1
7566 JONES 7839 2
7698 BLAKE 7839 2
7782 CLARK 7839 2
7902 FORD 7566 3
7521 WARD 7698 3
7900 JAMES 7698 3
7934 MILLER 7782 3
7499 ALLEN 7698 3
7788 SCOTT 7566 3
7654 MARTIN 7698 3
7844 TURNER 7698 3
7876 ADAMS 7788 4
7369 SMITH 7902 4
  • CONNECT BY 키워드
LEVEL 검색 항목의 깊이
CONNECT_BY_ROOT 계층 구조에서 최상위
CONNECT_BY_ISLEAF 계층 구조에서 가장 최하위이면 1 아니면 0
SYS_CONNET_BY_PATH 계층 구조의 전체 전개 경로
NOCYCLE 순환 구조가 발생지점까지만 전개
CONNECT_BY_ISCYCLE 순환 구조 발생 지점을 표시
SELECT empno, ename, job, mgr, LEVEL, 
SYS_CONNECT_BY_PATH(ename, '/') AS path
FROM emp
CONNECT BY PRIOR empno = mgr
START WITH mgr IS NULL;
EMPNO ENAME JOB MGR LEVEL PATH
7839 KING PRESIDENT 1 /KING
7566 JONES MANAGER 7839 2 /KING/JONES
7788 SCOTT ANALYST 7566 3 /KING/JONES/SCOTT
7876 ADAMS CLERK 7788 4 /KING/JONES/SCOTT/ADAMS
7902 FORD ANALYST 7566 3 /KING/JONES/FORD
7369 SMITH CLERK 7902 4 /KING/JONES/FORD/SMITH
7698 BLAKE MANAGER 7839 2 /KING/BLAKE
7499 ALLEN SALESMAN 7698 3 /KING/BLAKE/ALLEN
7521 WARD SALESMAN 7698 3 /KING/BLAKE/WARD
7654 MARTIN SALESMAN 7698 3 /KING/BLAKE/MARTIN
7844 TURNER SALESMAN 7698 3 /KING/BLAKE/TURNER
7900 JAMES CLERK 7698 3 /KING/BLAKE/JAMES
7782 CLARK MANAGER 7839 2 /KING/CLARK
7934 MILLER CLERK 7782 3 /KING/CLARK/MILLER

Subquery

  • FROM구에 SELECT문을 사용하면 Inline View
  • SELECT구에 서브쿼리를 사용하면 Scala Subquery라고 한다
  • WHERE구에 SELECT문을 사용하면 Subquery 라고 한다.( 밖에 있는 SELECT는 Main query)
SELECT *
FROM EMP
WHERE SAL > ANY (SELECT AVG(SAL) FROM EMP GROUP BY DEPTNO); 
-- 부서별 평균 급여 중 가장 작은 것 보다 크면 출력됨

SELECT *
FROM EMP
WHERE SAL > ALL (SELECT AVG(SAL) FROM EMP GROUP BY DEPTNO);
-- 가장 큰 것보다 커야함

SELECT *
FROM EMP
WHERE EXISTS (SELECT 1 FROM DEPT WHERE DEPTNO = EMP.DEPTNO AND LOC = 'NEW YORK');
-- DEPTNO = EMP.DEPTNO인 직원의 부서가 NEW YORK에 위치하면 출력.. -> 즉, NEW YORK에 부서가 위치한 사람만 출력
  • ROLLUP을 사용하면 GROUP BY 절에서 지정한 컬럼을 기준으로 서브 토탈을 계산하고 전체 토탈까지 계산
SELECT DECODE(GROUPING(dname), 1, 'ALL', dname) dname,
       DECODE(GROUPING(job), 1, 'ALL', job) job,
       COUNT(*) cnt
FROM   emp e, dept d
WHERE  e.deptno = d.deptno
GROUP BY ROLLUP(dname, job);
  • GROUPING은 GROUP BY 구문에서 사용되는 집계 함수 중 하나로, 데이터를 그룹화하여 집계를 수행할 때 NULL 값을 가지는 데이터를 대표하는 값을 반환
  • GROUPING SETS는 GROUP BY를 사용하여 그룹화할 컬럼들의 집합을 나타냅니다.

위의 예시에서는 deptno와 job으로 묶인 그룹, deptno로 묶인 그룹, 전체 데이터에 대한 그룹을 나타내는 3개의 그룹으로 나누어 집계를 수행

SELECT deptno, job, SUM(sal)
FROM emp
GROUP BY GROUPING SETS ((deptno, job), (deptno), ())
ORDER BY deptno, job NULLS FIRST;

SELECT deptno, job, SUM(sal), GROUPING(deptno), GROUPING(job)
FROM emp
GROUP BY GROUPING SETS ((deptno, job), (deptno), ())
ORDER BY deptno, job;
  • CUBE : CUBE는 GROUP BY 절에서 집계 함수를 사용할 때, 지정된 열에 대해 가능한 모든 조합을 대상으로 집계를 수행하는 기능
SELECT Region, Product, SUM(Sales)
FROM Sales
GROUP BY CUBE(Region, Product)
ORDER BY Region NULLS LAST,Product NULLS LAST;
REGION PRODUCT SUM(SALES)
EAST A 100
EAST B 200
EAST 300
WEST A 150
WEST B 250
WEST NULL 400
NULL A 250
NULL B 450
NULL NULL 700

Window Function

SELECT WINDOW_FUNCTION(ARGUMENTS)
             OVER (PARTITION BY COLUMN ORDER BY WINDOWING절)
  FROM TBL_NAME
;
  • 윈도우 함수 구조
구조 설명
ARGUMENTS 윈도우 함수에 따라서 인수 설정
PARTITION BY 전체 집합을 기준에 의해 소그룹
ORDER BY 어떤 항목에 대해 정렬
WINDOWING절 행 기준의 범위를 정한다.
ROWS는 물리적 결과의 행 수
RANGE는 논리적인 값에 의한 범위이다.
- WINDOWING
구조 설명
ROWS BETWEEN 행을 기준으로 어느 범위까지 함수를 적용할지 설정
RANGE BETWEEN 데이터의 순서를 기준으로 어느 범위까지 함수를 적용할지 설정
UNBOUNDED PRECEDING/FOLLOWING 해당 창의 시작점이나 끝점까지 함수를 적용
CURRENT ROW 현재 처리 중인 행에 대해서만 함수를 적용
-- 전체 행 
SELECT EMPNO, ENAME, SAL
     , SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) TOTAL_SAL
  FROM EMP
;

-- 현재까지의 합(누적 합계)
SELECT EMPNO, ENAME, SAL
     , SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) TOTAL_SAL
  FROM EMP
;

RANK Function

SELECT ENAME, JOB, SAL
     , RANK() OVER (ORDER BY SAL DESC) ALL_RANK
     , DENSE_RANK() OVER (ORDER BY SAL DESC) ALL_DENSE_RANK
     , ROW_NUMBER() OVER (ORDER BY SAL DESC) ROW_NUM
     , RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK
  FROM EMP
  • DENSE_RANK 는 동일한 순위를 하나의 건수로 계산
  • ROW_NUMBER는 동일한 순위에 대해서 고유의 순위 부여
  • AGGREGATE Function
SELECT ENAME, JOB, SAL
     , SUM(SAL) OVER (PARTITION BY JOB) SUM_JOB
     , ROUND(AVG(SAL) OVER (PARTITION BY JOB),2) AVG_JOB
     , COUNT(SAL) OVER (PARTITION BY JOB) COUNT_JOB
     , MAX(SAL) OVER (PARTITION BY JOB) MAX_JOB
     , MIN(SAL) OVER (PARTITION BY JOB) MIN_JOB
  FROM EMP
;
  • 행 순서 관련 함수
SELECT DEPTNO, ENAME, SAL
     , FIRST_VALUE(ENAME) OVER (PARTITION BY DEPTNO 
                                    ORDER BY SAL DESC 
                                    ROWS UNBOUNDED PRECEDING) AS DEPT_TOP
     , LAST_VALUE(ENAME) OVER (PARTITION BY DEPTNO 
                                    ORDER BY SAL DESC 
                                    ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS DEPT_LOWEST
  FROM EMP
 ;

SELECT DEPTNO, ENAME, SAL
     , LAG(SAL) OVER(ORDER BY SAL DESC) AS PRE_SAL
     , LEAD(SAL, 2) OVER(ORDER BY SAL DESC) AS PRE_SAL_2 -- 다음 2번째
  FROM EMP;
  • 비율 관련 함수
SELECT DEPTNO, ENAME, SAL
     , PERCENT_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS PERCENT_SAL -- 순위가 차지하는 퍼센트
     , NTILE(5) OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS N_TILE -- 5개의 그룹으로 나눈 분포
     , CUME_DIST() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS CUME_DIST -- 누적 퍼센트
     , RATIO_TO_REPORT(SAL) OVER(PARTITION BY DEPTNO) AS RATIO_TO_REPORT -- SUM에서 차지하는 퍼센트
  FROM EMP
;

테이블 파티션

  • Partition 기능
    • 대용량의 테이블을 여러 개의 데이터 파일에 분리해서 저장
  • Range Partition
    • 테이블의 칼럼 중에서 값의 범위를 기준으로 여러 개의 파티션으로 데이터를 나누어 저장하는 것
  • List Partition
    • 특정 값을 기준으로 분할
  • Hash Partition
    • 내부적으로 해시 함수를 사용해서 데이터를 분할, DBMS가 알아서 한다.
  • Composite Partition은 여러 개의 파티션 기법을 조합해서 사용
  • Partition Index
    • Global Index : 여러 개의 파티션에서 하나의 인덱스를 사용
    • Local Index : 해당 파티션 별로 각자의 인덱스를 사용
    • Prefixed Index : 파티션 키와 인덱스 키가 동일하다
    • Non Prefixed Index : 파티션 키와 인덱스 키가 다르다

SQL 최적화의 원리

  • Optimizer
    • SQL의 실행 계획을 수립하고 SQL을 실행하는 DBMS의 소프트웨어
    • Data Dictionary에 있는 오브젝트 통계, 시스템 통계 등의 정보를 사용해서 비용을 산정
    • 실행계획을 PLAN_TABLE에 저장 → 조회해서 실행 계획 확인 가능
  • 옵티마이저 실행 방법
    1. Parsing 해서 SQL 문법 검사 및 구문 분석 수행
    2. 구문 분석이 완료되면 Rule Based 혹은 Cost Based로 실행 계획 수립
    3. 기본적으로 Cost Based 사용
    4. 실행 계획 수립 완료 후 SQL 실행 → fetch data
  • 옵티마이저 엔진
    • Query Transformer : 효율적인 실행을 위해 SQL을 변환
    • Estimator : 통계정보를 사용해서 SQL 실행비용 계산
    • Plan Generator : SQL을 실행할 실행 계획 수립

인덱스

  • 인덱스는 데이터를 빠르게 검색할 수 있는 방법 제공
  • 인덱스는 여러 개의 칼럼으로 구성될 수 있다.
  • PK는 자동으로 인덱스가 만들어진다
  • 인덱스의 구조
    • Root Block : 인덱스 트리에서 가장 상위에 있는 노드
    • Branch Block : 다음 단계의 주소를 가지고 있는 Pointer로 되어 있다.
    • Leaf Block
      • 인덱스 키와 ROWID로 구성되고 인덱스 키는 정렬되어 저장되어 있다.
      • Double Linked List 형태로 되어 있어 양방향 탐색 가능
  • 인덱스 생성
CREATE INDEX IND_EMP ON EMP (ENAME ASC, SAL DESC);
  • 인덱스 스캔
    • 인덱스 유일 스캔(Index Unique Scan)
      • 인덱스 키 값이 중복되지 않는 경우
    • 인덱스 범위 스캔(Index Range Scan)
      • SELECT문에서 특정 범위를 조회하는 WHERE문을 사용할 경우 발생
      • LIKE, BETWEEN이 그 예
    • 인덱스 전체 스캔(Index Full Scan)
      • 검색되는 인덱스 키가 많은 경우 Leaf Block 전체 읽어 들임
      • High Watermark : 테이블에 데이터가 저장된 블록에서 최상위 위치를 의미 → 이것 이하까지만 Table Full Scan을 함

옵티마이저 조인

  • Nested Loop 조인

    • 하나의 테이블에서 데이터를 먼저 찾고 그 다음 테이블을 조인 하는 방식

    • 먼저 조회되는 테이블을 외부 테이블(Outer Table), 나중 테이블을 내부 테이블(Inner Table)

    • RANDOM ACCESS 발생 → 많으면 많을수록 성능 지연

    • orered 힌트는 FROM절에 나오는 테이블 순서대로 조인을 하게 하는 것

      • use_nl, use_merge, use_hash 힌트와 함께 사용
      SELECT /*+ ORDERED USE_NL(B) */ *
      FROM EMP  A
         , DEPT B
      WHERE A.DEPTNO = B.DEPTNO
       AND A.DEPTNO = 10
      ;

  • Sort Merge 조인

    • 두 개의 테이블에 SORT_AREA라는 메모리 공간에 모두 Loading하고 SORT 수행
  • Hash 조인

    • Hash 메모리에 로딩하고 해시 테이블 생성
    • CPU 연산을 많이 한다
728x90

'OLD' 카테고리의 다른 글

SAP ERP 개론 - 3. MM 모듈 개요  (0) 2023.06.14
SAP ERP 개론 - 2. SD 모듈 개요  (0) 2023.06.12
SAP ERP 개론 - 1. SAP에 대하여  (0) 2023.06.11
MyBatis의 fluchCache옵션에 대하여  (0) 2023.04.11
SQLD 정리 1  (0) 2023.02.09
728x90

sqld-1

1과목 Section 01 Data Modeling

데이터 모델링의 특징

  1. 추상화 : 공통적인 특징을 찾고 간략하게 표현
  2. 단순화 : 누구나 이해할 수 있게 표현
  3. 명확 : 모호하지 않고 명확하게 해석되어야 한다.→ 한 가지 의미를 지녀야 한다.

데이터 모델링의 단계

  1. 개념적 모델링
    1. 추상화 수준이 가장 높은 업무 측면에서의 모델링
  2. 논리적 모델링
    1. 식별자 정의, 관계, 속성 등을 표현
    2. 정규화를 통해 재사용성 높임
  3. 물리적 모델링
    1. 테이블, 인덱스 등을 생성
    2. 성능, 보안, 가용성 등을 고려하여 데이터베이스 구축

데이터모델링 관점

  • 데이터 : 구조 분석, 정적 분석
  • 프로세스 : 시나리오 분석, 도메인 분석, 동적 분석
  • 데이터와 프로세스 : CRUD 분석

ERD 작성 절차

  1. 엔터티 도출하고 그린다
  2. 엔터티 배치한다
  3. 엔터티 간의 관계를 설정한다
  4. 관계명을 서술한다.
  5. 관계 참여도를 표현한다.
  6. 관계의 필수 여부를 표현한다.

데이터 모델링 고려사항

  1. 데이터 모델의 독립성
    1. 중복된 데이터 제거 by 정규화
  2. 고객 요구사항 표현
  3. 데이터 품질 확보
    1. 데이터 표준을 정의하고 표준 준수율 관리

3층 스키마(3-Level Schema) = 3 view layers

  • 데이터베이스의 독립성 확보 → 데이터 복잡도 감소, 데이터 중복 제거, 사용자 요구사항 변경 대응력 향상, 관리 및 유지보수 비용 절감 등
  • 독립성
    • 논리적 독립성 : 개념 스키마가 변경되더라도 외부 스키마가 영향을 받지 않는 것이다.
    • 물리적 독립성 : 내부 스키마가 변경되더라도 개념 스키마가 영향을 받지 않는 것이다.
  • 3층 스키마 구조
    • 외부 스키마 : 사용자 관점, 업무상 관련, 응용 프로그램이 접근하는 데이터베이스를 정의한다.
    • 개념 스키마 : 설계자 관점, 통합 데이터베이스 구조이다.
    • 내부 스키마 : 개발자 관점, 물리적 저장구조, 레코드 구조, 필드 정의, 인덱스 등을 의미

엔터디

  • 업무에서 관리해야 하는 데이터 집합

  • 엔터티의 특징

    • 식별자 : 엔터티는 유일한 식별자가 있어야한다
    • 인스턴스 집합 : 2개 시앙의 인스턴스가 있어야 한다.
    • 속성 : 엔터티는 반드시 속성을 가지고 있다.
    • 관계 : 엔터티느느 다른 엔터니와 최소한 한 개 이상의 관계가 있어야 한다.
    • 업무 : 엔터티는 업무에서 관리되어야 하는 집합이다.
  • 릴레이션 : 릴레이션에 기본키 및 제약조건을 설정하면 테이블

  • 인스턴스는 렐레이션이 가질 수 있는 값을 의미 → 행의 수

엔터티 종류

  1. 유형 무형에 따른 엔터티 종류

    1. 유형 엔터티 : 업무에서 도출, 지속적으로 사용
    2. 개념 엔터티 : 물리적 형태가 없는 엔터티
    3. 사건 엔터티 : 비즈니스 프로세스를 실행하며 생성되는 엔터티
  2. 발생 시점에 따른 분류

    1. 기본 엔터티 : 키 엔터티, 독립적으로 생성
    2. 중심 엔터티 : 기본 엔터티와 행위 엔터티 중간
    3. 행위 엔터티 : 2개 이상의 엔터티로부터 발생

속성

  • 더 이상 분리되지 않는 단위

  • 인스턴스의 구성요소, 의미적으로 더 이상 분해되지 않음

  • 특징

    • 하나의 값만 가진다
    • 주식별자에 함수적으로 종속 → 족 키가 변경되면 속성의 값도 변경된다
  • 분해 여부에 따른 속성의 종류

    • 단일 속성 : 하나의 의미로 구성
    • 복합 속성 : 여러 개의 의미가 있는 것으로 대표적으로 주소가 있다.
    • 다중값 속성 : 속성에 여러 개의 값을 가질 수 있는 것 ex) 상품리스트 → 엔터티로 분해 가능
  • 특성에 따른 속성의 종류

    • 기본 속성 : 비즈니스 프로세스에서 도출되는 본래의 속성
    • 설계 속성 : 데이터 모델링 과정에서 발생되는 속성, 유일한 값 부여
    • 파생 속성 : 다른 속성에 의해서 만들어지는 속성
  • 도메인은 속성이 가질 수 있는 값의 범위

관계의 종류

  • 존재 관계
    • 엔터티간의 상태
  • 행위 관계
    • 엔터티 간에 어떤 행위가 있는 것

관계 차수

  • 최대 기수성
    • 일대일
      • 완전 일대일, 선택적 일대일
    • 일대다
    • 다대다
      • 조인 시 카테시안 곱이 발생하므로 일대다 관계로 분해하여 해소해야함
  • 최소 기수성
    • 필수적 관계 : 반드시 하나가 있어야 함
    • 선택적 관계 : 없을 수도 있는 관계

식별 비식별

  • 식별관계란 고객 엔터티의 기본키인 회원Id를 계좌 엔터티의 기본키의 하나로 공유하는 것 강한 개체의 기본키값이 변경되면 식별 관계에 있는 엔터티의 값도 변경된다

  • 비식별 관계는 강한 개체의 기본키를 다른 엔터티의 기본키가 아닌 일반 컬럼으로 관계를 가지는 것

  • 강한 개체 : 독립적인 개체

  • 약한 개체 : 다른 개체에 그 존재가 달려 있는 개체

주식별자

  • 최소성
  • 대표성
  • 유일성 : 엔터티의 인스턴스를 유일하게 식별
  • 불변성 : 자주 변경되지 않아야 한다
  • 존재성 : pk가 지정되면 잔드시 데이터값이 존재해야한다

키의 종류

  • 기본키 : 엔터티를 대표

  • 후보키 : 유일성과 최소성 만족

  • 슈퍼키 : 유일성 만족, 최소성 불만족

  • 대체키 : 후보키 중 기본키를 제외한 것

  • 외래키 : 다른 테이블의 기본키, 참조 무결성 확인을 위해 사용

  • 대표성 여부

    • 주식별자 : 엔터티 대표, 참조 관계 연결 가능
    • 보조 식별자 : 대표성 만족 못함
  • 생성 여부

    • 내부 식별자 : 엔터티 내부에서 스스로 생성
    • 외부 식별자 : 다른 엔터티와의 관계로 생성
  • 속성의 수에 따른 종류

    • 단일 식별자 : 하나의 속성
    • 복합 식별자 : 두 개 이상의 속성
  • 대체 여부

    • 본질 식별자 : 비즈니스 프로세스에서 생성
    • 인조 식별자 : 인위적으로 생성 ex)일련번호 → 순서번호(Sequence Number)를 사용해서 식별자를 만드는 것

데이터 모델과 성능

정규화

  • 데이터 일관성, 최소 중복, 유연성을 위해 데이터를 분해

  • 데이터가 일관성이 없고 그러면 이상현상(Anomaly)

  • 정규화 절차

    1. 제1정규화 : 속성의 원자송 확보, 기본키를 설정
    2. 제2정규화 : 기본키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거(분해)한다
    3. 제3정규화 : 기본키를 제외한 칼럼 간에 종속성을 제거한다. = 이행 함수 종속성을 제거한다.
    4. BCNF : 기본키를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해한다.
    5. 제4정규화 : 여러 칼럼들이 하나의 칼럼을 종속시키는 경우 분해하여 다중값 속성을 제거한다.
    6. 제5정규화 : 조인에 의해서 종속성이 발생하는 경우 분해한다
  • 정규화의 문제

    • 조인을 유발 → CPU와 메모리를 많이 사용
    • 중첩된 루프(Nested Loop)
      • 조인은 이중 for문을 유발한다. (보통 인덱스나 옵티마이저로 이런 비효율을 막긴함)
    • 반정규화로 위와 같은 문제를 해결한다.
  • 반정규화를 수행하는 이유

    • 지나친 정규화 충실성으로 수행 속도가 느려진 경우
    • 다량의 범위를 자주 처리하는 경우
    • 특정 범위의 데이터만 자주 처리하는 경우
    • 요약/집계 정보가 자주 요구되는 경우
  • 반정규화 절차

    1. 대상 조사 및 검토 : 반정규화 대상 조사
    2. 다른 방법 검토 : 클러스터링, 뷰, 인덱스 튜닝, 응용 프로그램, 파티션 등 검토
      1. 클러스터링 : 클러스터링 인덱스란 인덱스 정보를 저장할 때 물리적으로 정렬해서 저장하는 방법 → 조회 시에 인접 블록을 연속적으로 읽기 때문에 성능이 향상된다.
    3. 반정규화 수행
  • 반정규화 기법

    • 계산된 칼럼 추가
    • 테이블 수직 분할 → 칼럼을 분할하여 새로운 테이블 생성
    • 테이블 수평 분할 → 값을 기준으로 테이블 분할(동일 속성이 됨)
  • 파티션 기법 : 논리적으로 하나의 테이블이지만 여러개의 데이터 파일에 분산되어 저장

    • Range Partition : 데이터 값의 범위를 기준으로 파티션을 수행

    • List Partition : 특정한 값을 지정하여 파티션 수행

    • Hash Partition : 해시 함수를 적용하여 파티션 수행

    • Composite Partition : 범위와 해시를 복합적으로 사용하여 파티션 수행

      장점

    • 엑세스 범위가 줄어듬 → 성능향상

    • 데이터 분할되어 있어 IO 성능 향상

    • 각 파티션별로 독립적으로 백업/복구 가능

  • 테이블 병합

    • 1대1 관계의 테이블을 하나의 테이블로 병합해서 성능 향사
    • 1대N 관계의 테이블을 병합하여 성능 향상 but 데이터 중복 발생
    • 슈퍼 타입과 서브 타입 관계가 발생하면 테이블 통합하여 성능 향상
      • 슈퍼 타입과 서브 타입
        • 고객은 슈퍼 타입 개인고객과 법인고객은 서브 타입
        • 배타적 관계 : 고객이 개인고객이거나 법인고객인 경우
        • 포괄적 관계 : 고객이 개인고객일수도 있고 법인고객일 수도 있는 것
      • 슈퍼 - 서브 타입 변환 방법
        • OneToOne Type : 슈퍼 타입과 서브 타입 개별로 테이블 도출
        • Plus Type : 슈퍼 + 서브 타입의 엔티티 여러개 생성
        • Single Type : 슈퍼 타입과 서브 타입을 하나의 테이블로 도출

분산 데이터베이스

  • 중앙 집중형 데이터베이스 : 한 대의 물리적 시스템에 데이터베이스 관리 시스템을 설치하고 여러 사용자가 그 시스템에 접속하여 데이터베이스를 사용하는 구조

  • 분산 데이터베이스 : 물리적으로 떨어진 데이터베이스들을 네트워크로 연결 → 단일 데이터베이스 이미지를 보여주고 분산 작업 처리 수행

  • 분산 데이터베이스의 투명성

    • 분할 투명성 : 고객(사용자)는 논리적 릴레이션이 여러 개로 분할되어 각 사본이 여러 시스템에 저장되어있음을 알 필요가 없다
    • 위치 투명성 : 고객이 사용하려는 데이터의 정소를 명시할 필요가 없다 → 데이터에 접근하는 방식에는 차이가 없어야 한다
    • 지역 사상 투명성 : 지역 DBMS와 물리적 데이터베이스 사이의 매핑이 보장되어야 한다.
    • 중복 투명성 : 데이터베이스 객체가 여러 시스템에 중복되어 존재해도 데이터의 일관성은 유지되어야 한다.
    • 장애 투명성 : 데이터베이스가 분산되어 있는 각 지역의 시스템이나 통신망에 이상이 발생해도 데이터의 무결성은 보장된다.
    • 병행 투명성 : 여러 응용 프로그램이 동시에 분산 데이터베이스에 대한 트랜잭션을 수행하는 경우에도 결과에 이상이 없어야 한다.
  • 분산 데이터베이스 설계 방식

    • 상향식 설계 방식 : 지역 스키마 → 전역 스키마(통합)
    • 하향식 설계 방식 : 전역 스키마 작성 → 지역 사상 스키마 작성
  • 분산 데이터베이스 장점과 단점

    • 장점
      • 신뢰성과 가용성 높음
      • 빠른 응답 가능
      • 시스템 용량 확장 용이
    • 단점
      • 관리, 통제 어려움
      • 무결성 관리 어려움
      • 설계 복잡
      • 보안 어려움
728x90

'OLD' 카테고리의 다른 글

SAP ERP 개론 - 3. MM 모듈 개요  (0) 2023.06.14
SAP ERP 개론 - 2. SD 모듈 개요  (0) 2023.06.12
SAP ERP 개론 - 1. SAP에 대하여  (0) 2023.06.11
MyBatis의 fluchCache옵션에 대하여  (0) 2023.04.11
SQLD 정리 2  (1) 2023.03.18

+ Recent posts