포스트

49회 기출문제 풀이

[1과목] 데이터모델링의 이해


이미지

  • 표기법(IE NOTAITION, BARKER)와 1, 2, 3 정규화
  • 식별자 분류, 의미
  • 두 개의 엔터티 식별, 비식별 관계 구분
  • 도메인 의미
  • 관계차수

이미지

  • BARKER 표기법(①)
    • 부서는 사원이 없을 수 있음(점선)
    • 사원은 부서가 반드시 있어야 한다.(실선)
    • 부서는 사원이 여러 명이 있을 수 있다.
    • 사원은 부서가 하나다.
    • 부서의 UID를 사원의 UID로 상속한다.
  • UID BAR - 1:M 관계에서 M쪽에 UID(#)가 있는 경우는 부적절하다.

① 부서의 UID를 사원의 UID로 상속하므로 #으로 표기

② 1:M 관계에서 M의 UID가 1에 있음

③ UID bar가 없으므로 일반 속성(*)으로 들어오며, 사원은 부서가 반드시 있어야 하므로 실선 표시, NOT NULL

④ 1:M 관계에서 M의 UID가 1에 있음


이미지

  • 엔터티2는 엔터티1을 상속받았으며, 엔터티3은 엔터티2를 상속받음(UID 속성이 PK로 그대로 들어감)
  • 엔터티2의 UID가 적어도 하나 더 있어야 하므로 엔터티2의 UID의 최소 개수는 3
  • 엔터티3의 UID 최소 개수: 4

이미지

  • IE 표기법 - 반대로 읽는다.
  • 주문과 주문상세
    • 주문은 주문상세가 반드시 있어야 함
    • 주문상세는 주문이 반드시 있어야 함
    • 실선 - 상속 → 주문의 UID를 주문상세가 상속받음
  • 상품, 쿠폰과 주문상세
    • 상품, 쿠폰은 주문상세가 없어도 됨
    • 주문상세는 상품은 반드시 있어야 하며, 쿠폰은 없어도 됨 → 상품번호는 NOT NULL, 쿠폰번호는 NULL ABLE

이미지

  • 주문은 주문 상세가 없을 수 있음
  • 주문상세는 주문번호와 상품번호를 상속받았다.
  • 주문상세의 주문번호와 상품번호는 UID(NOT NULL + UNIQUE)
    • 모두 NOT NULL, 두 개의 조합으로 UNIQUE
    • 주문1 상품1
    • 주문1 상품2
    • 주문1 상품1은 입력 자체가 되지 않는 데이터(중복) → 한 주문의 주문상세 내역에는 동일상품이 여러 번 나타날 수 없다.
  • 원래 주문합계급액은 주문과 주문상세를 조인한 후에 SUM해야한다.

이미지

  • 1정규형 - 1컬럼에 1개 값만
  • 2정규형 - 일반 속성은 UID 전체에 종속(UID 부분에 함수적 종속 x)
  • 3정규형 - 일반 속성끼리의 종속
  • 고객번호를 알면 고객명을 알 수 있음 - 3정규형 위반

이미지


이미지

  • UID
    • NOT NULL + UNIQUE
    • A와 B가 UID라면, A와 B는 각각 UNIQUE해야하는 것이 아니라 A+B 조합으로 UNIQUE 해야한다.
    • 엔터티의 주식별자는 무조건 1개만 정의 가능
    • 주식별자의 속성은 부모 엔터티의 식별자를 상속받을 수 있고, 받지 않을 수도 있음
    • UID 자체는 데이터들을 식별할 수 있는 식별자이기에 UPDATE되면 안 됨

이미지

  • 값의 범위이므로 VARCHAR2(10)은 도메인이다.
  • 컬럼의 타입과 길이, CHECK, NULL 여부로 도메인을 제한한다.

[2과목] SQL 기본과 활용


이미지

  • COMMIT, ROLLBACK 시 데이터가 어떻게 변하는지
  • 제약조건 - CHECK, NOT NULL, PK CONSTRAINT(UID)
  • HAVING절 필터링 - GROUP BY에 의한 분류 후 그룹에 대한 조건 지정
  • 계층 SQL - START WITH, CONNECT BY

이미지

  • CUBE: 조합할 수 있는 모든 조합 GROUP BY
    • CROUP BY CUBE(C1, C2)의 경우
      • (C1, C2)
      • C1
      • C2
      • () - 전체로 GROUP BY
  • GROUP BY GROUPING SETS()
    • 쓴 조합 그대로 GROUP BY

이미지

  • ROLLUP: 오른쪽부터 하나씩 지워가며 GROUP BY
    • GROUP BY ROLLUP(C1, C2)의 경우
      • (C1, C2)
      • C1
      • ()

이미지

  • 괄호로 한 번 더 묶음 - 괄호를 하나의 컬럼으로 취급함
    • GROUP BY ROLLUP((C1, C2))의 경우
      • (C1, C2)
      • () - 오른쪽부터 지워가므로 괄호 전체가 사라짐

이미지

  • GROUPING_ID: GROUP BY에 참여하지 않을 시 어떤 값을 줌
    • GROUPING_ID(C1, C2, C3)의 경우
      • C3의 값이 NULL이면(참여하지 않으면), 2의 0승인 1을 줌
      • C2의 값이 NULL이면 2의 1승인 2를 줌
      • C1의 값이 NULL이면 2의 2승인 4를 줌
      • C2와 C3가 참여하지 않고, C1만 참여했을 경우, 2+1 = 3을 줌
      • C1, C2, C3 전부 참여하지 않을 경우, 4 + 2 + 1 = 7을 줌
  • C1, C2가 없으면 3, C2가 없으면 2 → C1은 2의 0승인 1 ⇒ GROUPING_ID(C2, C1)이 됨
  • C1이 참여하지 않으면 2의 0승인 1을 주고, C2가 참여하지 않으면 2의 1승인 2를 줌
  • 전부 참여하지 않으면 3이 나옴

이미지

이미지

  • 윈도잉들은 무조건 시작 지점과 종료 지점이 있어야 한다.
  • LAST_VALUE: 윈도잉으로 볼 수 있는 값의 범위가 있으면, 마지막을 주는 것
  • RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: 파티션에서 내가 볼 수 있는 윈도우의 첫 번째 범위부터 현재 ROW까지
    • 이 윈도우의 첫 번째 값인 800이라는 값 범위부터 현재 ROW의 값 800까지의 범위 중 LAST_VALUE → 800
    • 800부터 1100까지의 범위 중 LAST_VALUE → 1100
  • RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING: 현재 ROW부터 해당 파티션 마지막까지
    • 800, 1100 이 두 가지 ROW 중에 ORDER BY SAL → 마지막 ROW 1100
    • 두 번째 ROW에서도 현재 ROW부터까지이므로 나만 존재하는 것 → 마지막이 1100
  • 윈도우함수
    • rows between and 값이 증가한다.
      • rows between UNBOUNDED PRECEDING and CURRENT ROW) as “직업별 합계”
      • rows between 1 PRECEDING and 1 FOLLOWING) as “위아래 합계”
    • range between and 값이 동일하다
      1. UNBOUNDED PRECEDING : 최종 출력될 값의 맨 처음 row의 값(Partition by 고려)
      2. CURRENT ROW : 현재 row의 값
      3. UNBOUNDED FOLLOWING : 최종 출력될 값의 맨마지막(Partition by 고려)

이미지


이미지

  • 전체에 대해서 SAL의 평균값(AVG)을 구함
  • ROWS BETWEEN 1 RPECEDING AND 1 FOLLOWING: 내가 볼 수 있는 값의 범위는 내가 읽은 ROW 기준으로 1줄 위부터 1줄 다음까지
  • FORD일 때, AVG를 구하는 것이므로 값은 3000, 3000 → AVG = 3000

이미지

  • 인라인 뷰 먼저 보기 - DEPTNO = 20이 아닌 것 제외
  • NTILE(2) - ROW 건수 기준으로 최대한 균등하게 2개의 그룹으로 묶는 것
  • 1번부터 값을 메워간다.
  • C1 컬럼의 그룹 번호가 나눠짐

이미지

  • 트리구조 연결
    • START WITH: 계층쿼리를 풀 시작점
    • CONNECT BY: 결과가 나오지 않을 때까지 재귀호출
    • MGR = PRIOR EMPNO
      • 내가 읽은 MGR과 이전에 읽은 EMPNO와 조인하는 것
      • 읽은 데이터가 메모리에 있다고 생각하고 이전에 읽은 EMPNO로 나의 MGR 찾아가고, 없으면 멈추기
      • LEVEL 1, 2, 3 LEVEL 2, 3

이미지

  • MGR = PRIOR EMPNO
    • 나부터 내 부하직원까지 계속 트리구조로 내려감
  • ISLEAF
    • 내가 읽은 데이터가 자식이 없으면 1, 자식이 있으면 0


참고 자료


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.