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
- CROUP BY CUBE(C1, C2)의 경우
- GROUP BY GROUPING SETS()
- 쓴 조합 그대로 GROUP BY
- ROLLUP: 오른쪽부터 하나씩 지워가며 GROUP BY
- GROUP BY ROLLUP(C1, C2)의 경우
- (C1, C2)
- C1
- ()
- GROUP BY ROLLUP(C1, C2)의 경우
- 괄호로 한 번 더 묶음 - 괄호를 하나의 컬럼으로 취급함
- GROUP BY ROLLUP((C1, C2))의 경우
- (C1, C2)
- () - 오른쪽부터 지워가므로 괄호 전체가 사라짐
- GROUP BY ROLLUP((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을 줌
- GROUPING_ID(C1, C2, C3)의 경우
- 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 값이 동일하다
- UNBOUNDED PRECEDING : 최종 출력될 값의 맨 처음 row의 값(Partition by 고려)
- CURRENT ROW : 현재 row의 값
- UNBOUNDED FOLLOWING : 최종 출력될 값의 맨마지막(Partition by 고려)
- rows between and 값이 증가한다.
- 전체에 대해서 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 라이센스를 따릅니다.