거인의 코딩일지
[SQLD] 오답정리(SQL 활용) 본문
728x90
다음 결과를 도출하기 위해 SQL 빈칸에 들어갈 함수로 가장 적절한 것은 무엇인가??
[SQL]
SELECT EMP_ID, NAME, SAL, ( ) OVER (ORDER BY DESC) AS RANK;
[결과]
EMP_ID | NAME | SAL | RANK |
103 | Dennis | 90000 | 1 |
104 | Tom | 65000 | 2 |
105 | Bruce | 49000 | 3 |
106 | Yoon | 49000 | 3 |
107 | Kim | 20000 | 4 |
- ROW_NUMBER( )
- RANK ( )
- DENSE_RANK( )
- ROWNUM( )
- 3번
- DENSE_RANK() 함수는 순위를 매기면서 같은 순위가 존재하더라도 다음순위를 건너뛰지 않고 이어서 매긴다.
- RANK() 함수는 순위를 매기면서 같은 순위가 존재하면 존재하는 수 만큼 다음 순위를 건너뛴다.
- ROW_NUMBER 함수는 순위를 매기면서 동일한 값이라도 각기 다른 순위를 부여한다.
- ROWNUM() 함수는 Oracle에서 행의 순번을 매기는 슈도 컬럼 이다.
다음은 그룹함수에 대한 설명이다. 가장 적절하지 않은 것은 무엇인가?
- ROLLUP 함수느느 인자로 주어진 컬럼의 순서에 따라 결과가 달라지므로 작성시 유의해야한다.
- CUBE 함수는 인자로 주어진 컬럼의 순서에 따라 결과가 달라지므로 작성시 유의해야한다.
- CUBE 함수는 ROLLUP 함수에 비해 시스템에 많은 부하를 발생시키므로 주의해서 사용해야한다.
- GROUP BY 와 UNION ALL 을 이용하여 GROUPING SETS 함수와 동일한 결과를 출력하도록 SQL 작성이 가능하다.
- 2번
- CUBE 함수는 인자로 주어진 컬럼들의 모든 조합에 대해 집계를 수행하므로 인자의 순서가 바뀌더라도 결과 데이터는 동일하다.
다음 결과를 도출하기 위해 SQL 빈칸에 들어갈 함수로 가장 적절한 것은 무엇인가?
[SQL]
SELECT ORDER_DATE, ORDER_CNT, ( ) AS SUM FROM TORDER;
[결과]
ORDER_DATE | ORDER_CNT | SUM |
2024-08-01 | 10 | 22 |
2024-08-02 | 12 | 28 |
2024-08-03 | 6 | 26 |
2024-08-04 | 8 | 24 |
2024-08-05 |
10 | 18 |
- SUM(ORDER_CNT) OVER (ORDER BY ORDER_DATE)
- SUM(ORDER_CNT) OVER (ORDER BY ORDER_DATE ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
- SUM(ORDER_CNT) OVER (ORDER BY ORDER_DATE ROWS BETWEEN CURRENT ROW AND UNBONDED FOLLOWING)
- SUM(ORDER_CNT) OVER (ORDER BY ORDR_DATE ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
- 4번
- 이 문제는 집계 데이터의 범위를 정하는 WINDOWING 절에 대한 문제 이다.
UNBOUNDED PRECEDING | 위 쪽 끝 행 |
UNBOUNDED FOLLOWING | 아래쪽 끝 행 |
CURRENT ROW | 현재 행 |
n PRECEDING | 현재 행에서 위로 n 만큼 이동 |
n FOLLOWING | 현재 행에서 아래로 n 만큼 이동 |
- 4번 결과 데이터를 보면 바로 위의 행과 현재 행, 그리고 바로 아래 행의 ORDER_CNT 를 합한 데이터가 SUM 컬럼의 데이터임을 알 수 있다.
- 1, 2 번 동일한 의미로 맨 위의 행부터 현재 행까지의 누적치가 반환 된다.
- ROWBETWEEN UNBOUNDED PRECEDING AND CURRENT ROW가 Default
ORDER_DATE | ORDER_CNT | SUM |
2024-08-01 | 10 | 10 |
2024-08-02 | 12 | 22 |
2024-08-03 | 6 | 28 |
2024-08-04 | 8 | 36 |
2024-08-05 |
10 | 46 |
- 3번 맨 아래 행부터 현재 행 까지의 누적치가 반환된다.
ORDER_DATE | ORDER_CNT | SUM |
2024-08-01 | 10 | 46 |
2024-08-02 | 12 | 36 |
2024-08-03 | 6 | 24 |
2024-08-04 | 8 | 18 |
2024-08-05 |
10 | 10 |
다음 중 에러가 발생할 수 있는 SQL은 무엇인가???
[SAMPLE1 테이블]
COL 1 | COL 2 |
A | 1 |
B | 2 |
C | 3 |
[SAMPLE2 테이블]
COL 1 | COL 2 |
A | 4 |
C | 5 |
- SELECT * FROM SAMPLE1 A WHERE EXISTS (SELECT 'X' FROM SAMPLE2 B WHERE B.COL1 = A.COL1);
- SELECT * FROM SAMPLE1 WHERE COL1 IN (SELECT COL1 FROM SAMPLE2);
- SELECT * FROM SAMPLE1 WHERE COL1 = (SELECT COL1 FROM SAMPLE2);
- SELECT * FROM SAMPLE1 WHERE COL1 = (SELECT COL1 FROM SAMPLE2 WHERE ROWNUM = 1);
- 3번
- (SELECT COL1 FROM SAMPLE2) 은 다중 행 서브쿼리로 '=' 과 함께 쓰일 수 없다.
4번의 경우 ROWNUM 조건절로 인해 단일 행 서브쿼리가 되어 '=' 조건과 함께 쓰여도 무방하다.
728x90
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] 오답정리(관리구문) (0) | 2024.05.27 |
---|---|
[SQLD] 오답정리(데이터 모델과 SQL) (0) | 2024.05.16 |
[SQLD] 오답정리(데이터 모델링의 이해) (0) | 2024.05.15 |
[SQLD] 정규화 이론??? (0) | 2024.05.05 |
[SQLD] 성능 데이터 모델링과 정규화 (0) | 2024.05.03 |