My

[SQLD] 기출 틀린 문제 오답정리

gangintheremark 2023. 9. 8. 19:05
728x90

37회

[TEST1]
COL1  COL2  COL3
------------------
A      X      1
B      Y      2
C      Z      3

[TEST2]
COL1  COL2  COL3
------------------
A      X      1
B      Y      2
C      Z      3
D      가      4
E      나      5

[SQL]
MERGE INTO TEST1
USING TEST2
 ON (TEST1.COL1 = TEST2.COL1)
WHEN MATCHED THEN
 UPDATE SET TEST1.COL3 = 4
      WHERE TEST1.COL3 = 2
 DELETE WHERE TEST1.COL3 <= 2
WHEN NOT MATCHED THEN
 INSERT(TEST1.COL1, TEST1.COL2, TEST1.COL3)
 VALUES(TEST2.COL1, TEST2.COL2, TEST2.COL3);

MERGE INTO문은 특정 키에 대해 레코드가 있을 때, UPDATE하고 레코드가 없으면 INSERT하는 구문이다. 여기서 DELETE절은 MERGE UPDATE 절로 갱신된 행을 대상으로 수행되며, 갱신된 값을 기준으로 행을 삭제한다. (위 구문의 DELETE는 실행되지 않는다)


1) RANK() OVER (PARTITION BY JOB ORDER BY 급여 DESC) JOB_RANK
-- 직업별 급여가 높은 순서대로 부여되고 동일한 순위는 동일한 값이 부여 된다.

2) SUM(급여) OVER (PARTITION BY MGR ORDER BY 급여 RANGE UNBOUNDED PRECEDING)
-- RANGE는 논리적 주소에 의한 행 집합을 의미하고 MGR별 현재 행부터 파티션내 첫번째 행까지 급여의 합계를 계산한다.

3) AVG(급여) OVER (PARTITION BY MGR ORDER BY 날짜 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING))
-- 각 MGR 별로 앞의 한건, 현재 행, 뒤의 한건 사이에서 급여의 평균을 계산한다.

4) COUNT(*) OVER (ORDER BY 급여) RANGE BETWEEN 10 PRECEDING AND 300 FOLLOWING)
-- 급여를 기준으로 현재 행에서의 급여의 10에서 300사이의 급여를 가지는 행의 수를 COUNT

답은 3번 . 각 MGR 파티션 내에서 날짜 기준으로 정렬 수행 후, 파티션 내에서 앞의 한 건, 현재 행 뒤의 한 건 사이 급여의 평균 계산

키워드 설명
ROWS 물리적인 행 단위
RANGE 논리적인 행 단위
CURRENT ROW 현재 행
UNBOUNDED PRECEDING 첫번째 행
UNBOUNDED FOLLOWING 마지막 행
[위치] PRECEDING [위치] 이전 행
[위치] FOLLOWING [위치] 다음 행

[TEST29_1]
COL
----
1
2
3
4

[TEST29_2]
COL
----
2
NULL

[SQL]
SELECT COUNT(*)
FROM TEST29_1 A
WHERE A.COL NOT IN (SELECT COL FROM TEST29_2);

NOT IN문 서브쿼리의 결과 중 NULL이 포함되는 경우 데이터가 출력되지 않는다. NULL은 논리적으로 비교할 수 없는 연산. 또한 IN문은 OR조건, NOT IN문은 AND 조건


EXISTS 함수와 IN 차이

EXISTS

  • 괄호 안에 서브쿼리만 들어갈 수 있음
  • 처리순서: 메인쿼리서브쿼리
  • 서브쿼리 결과가 존재하는지만 확인
  • NULL에 대해 TRUE값 리턴

IN

  • 괄호 안에 특정 값/ 서브쿼리 들어갈 수 있음
  • 처리순서: 서브쿼리메인쿼리
  • NULL에 대해 FALSE 리턴. 따라서 NOT IN사용 시 NVLNULL체크 필요

SELECT C1, C2
FROM SQLD_02
ORDER BY C1, C2 DESC (      );

NULLS FIRST : 정렬하고자 하는 NULL을 데이터 앞에
NULLS LAST : 정렬하고자 하는 NULL을 데이터 뒤에

 

33회

  • 속성의 분류 중 속성의 특성에 따른 분류 : 기본 - 설계 - 파생
  • 속성의 분류 중 엔터티를 구성하는 방식에 따른 분류 : 일반 - PK - FK
  • 속성의 세부 의미를 더 쪼갤 수 있는지의 여부 : 단순 - 복합
  • 하나의 속성 안에 동일한 성질의 여러 개의 값이 존재하는가의 여부 : 단일값 - 다중값

파티셔닝

  • 범위 분할 : 분할 키 값이 범위 내에 있는지 여부로 구분
  • 목록 분할 : 값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션 선택
  • 해시 분할 : 해시 함수의 값에 따라 파티션에 포함
  • 라운드 로빈 : 회전하면서 새로운 행이 파티션에 할당

명시적 커서에서 FETCH 단계 이후 수행되는 것 : CLOSE CURSOR

WHERE절에 비교연산자 <>CROSS JOIN으로 수행

[RESULT]
COL1    COL2   SUM(COL3)
-------------------------
A       가       6
A       다       7
A               13
B       가       20
B       나       130
B               150
C       나       100
C       다       1050
C               1150

>> 
GROUPING SETS(COL1, (COL1, COL2))
728x90