SQLD 모의고사 20회
50문항 · 제한 시간 90분. 다 풀면 과목별 점수와 합격 여부, 문제마다 해설을 보여 줘요.
1. H사는 인사·급여 시스템을 구축하면서 여러 모델링 활동을 수행하였다. 각 활동과 데이터 모델링 관점을 짝지은 것으로 가장 적절한 것은?
- 사원·부서·직급 엔터티와 그 사이의 관계를 정의하는 활동 - 프로세스 관점
- '월 급여 계산' 업무가 어떤 절차로 수행되는지 시나리오를 분석하는 활동 - 데이터 관점
- '월 급여 계산' 업무가 근태 데이터를 읽고 급여명세 데이터를 생성하는지 CRUD 매트릭스로 분석하는 활동 - 상관 관점
- 개념 모델, 논리 모델, 물리 모델을 차례로 작성하는 활동 - 상관 관점
2. 인사 시스템을 분석하던 중 다음 엔터티 후보가 제시되었다. 엔터티로 정의하기에 가장 적절하지 않은 것은? (이 회사는 단일 법인이며 대표이사는 1명이다.)
회사대표정보: 회사 대표이사 1명의 성명과 취임일만 관리한다.근태기록: 사원별·일자별 출퇴근 시각을 관리하며 급여 계산 시 조회된다.직급: 사원·대리·과장 등 직급별 기본급 기준을 관리하며 사원이 직급을 참조한다.휴가신청: 사원이 신청한 휴가의 기간·사유·승인상태를 관리한다.
3.
사원엔터티에 '보유자격증' 정보를 관리하려 한다. 한 사원은 자격증을 0개 이상 여러 개 보유할 수 있다(예: 김하늘 - SQLD, 정보처리기사, ADsP). 이에 대한 설명으로 가장 적절한 것은?- 하나의 속성에 여러 의미가 섞여 있으므로 복합 속성이며, 자격증명·발급기관 같은 하위 속성으로 쪼개어
사원에 그대로 둔다. - 자격증 개수를 세어 얻는 값이므로 파생 속성에 해당한다.
- 'SQLD,정보처리기사,ADsP'처럼 쉼표로 구분하여 한 컬럼에 저장해도 제1정규형을 만족한다.
- 한 인스턴스가 여러 값을 가지는 다중값 속성이므로
사원자격증같은 별도 엔터티로 분리하여 1:M 관계로 표현하는 것이 원칙이다.
- 하나의 속성에 여러 의미가 섞여 있으므로 복합 속성이며, 자격증명·발급기관 같은 하위 속성으로 쪼개어
4. 인사 시스템에서 다음과 같은 관계가 도출되었다.
- 사원은 하나의 부서에 소속된다.
- 사원은 휴가를 신청한다. (휴가를 신청해야 사원과 휴가신청이 연결된다.)
관계의 분류와 표현에 대한 설명으로 가장 적절한 것은?
- 사원과 부서의 '소속' 관계는 사원이 소속 행위를 해야 성립하므로 행위적 관계이다.
- 사원과 휴가신청의 관계는 신청이라는 행위가 있어야 성립하므로 행위적 관계이다.
- ERD에서는 행위적 관계를 점선으로 그려 존재적 관계와 구분한다.
- UML 클래스 다이어그램에서 존재적 관계에 가까운 연관 관계는 점선으로 표현한다.
5. 인사 시스템의 두 엔터티가 다음과 같이 정의되어 있다.
사원: 사원번호(입사 시 시스템이 부여), 주민등록번호(모든 사원이 보유하며 중복 없음), 사원명급여명세: 사원번호, 지급년월, 지급액 — 주식별자는 (사원번호, 지급년월)이며 사원번호는사원을 참조한다.
사원의 주식별자는 사원번호이다. 식별자에 대한 설명으로 가장 적절한 것은?- 주민등록번호도 사원을 유일하게 구분하므로
사원엔터티는 주식별자를 두 개 가진다. 급여명세의 사원번호는사원으로부터 관계를 통해 받은 외부식별자이며, 주식별자의 일부이므로 두 엔터티는 식별 관계이다.급여명세의 주식별자 (사원번호, 지급년월)은 한 엔터티의 주식별자이므로 단일식별자에 해당한다.사원의 사원번호는 시스템이 부여하는 값이므로 외부식별자에 해당한다.
6. 다음
사원테이블의 PK는 사원번호이며, 업무 규칙상 부서명과 부서장사번은 부서코드에 의해 결정된다.[사원]
사원번호 사원명 부서코드 부서명 부서장사번 E01 김하늘 D1 인재개발 E09 E02 박서준 D1 인재개발 E09 E03 이도윤 D2 급여운영 E11 이 테이블과 이상현상에 대한 설명으로 가장 적절한 것은?
- PK가 아닌 속성이 PK의 일부에만 종속되는 부분 함수 종속이 있으므로 제2정규형을 위반한다.
- 사원이 아직 없는 신설 부서 'D3'를 등록할 수 없는 문제는 갱신 이상에 해당한다.
- 부서명·부서장사번이 부서코드를 거쳐 사원번호에 종속되는 이행 함수 종속이 있으므로, 부서 정보를 별도 테이블로 분리하면 제3정규형을 만족한다.
- 정규화를 수행하면 테이블 수가 줄어들어 사원과 부서명을 함께 조회할 때 조인이 필요 없어진다.
7.
사원과사원상세는 1:1 관계이며, 사원상세는 사원 쪽에서 선택(Optional) 관계이다. 데이터가 다음과 같을 때 (가), (나) SQL의 결과로 옳은 것은?[HR_EMP]
EMP_NO EMP_NM 1001 김하늘 1002 박서준 1003 이도윤 1004 최유나 [EMP_DETAIL]
EMP_NO ADDR 1001 서울 1003 대전 1004 NULL -- (가) SELECT COUNT(*) FROM HR_EMP E INNER JOIN EMP_DETAIL D ON E.EMP_NO = D.EMP_NO; -- (나) SELECT COUNT(D.ADDR) FROM HR_EMP E LEFT OUTER JOIN EMP_DETAIL D ON E.EMP_NO = D.EMP_NO;- (가) 3, (나) 2
- (가) 3, (나) 4
- (가) 4, (나) 3
- (가) 3, (나) 3
8. 인사·급여 시스템의 ERD가 다음과 같다. (IE 표기법,
|는 필수,o는 선택,{는 여러 건을 의미한다.)신입 사원은 입사 직후에는 급여지급 이력이 없다. 이 모델을 바탕으로 한 트랜잭션 설계로 가장 적절한 것은?
사원 ||--o{ 급여지급 : 받는다 급여지급 ||--|{ 급여지급상세 : 구성된다- 신규 입사자를 등록할 때는 첫 급여지급 데이터도 반드시 같은 트랜잭션에서 함께 생성해야 한다.
- 급여지급(헤더)을 먼저 INSERT하고 COMMIT한 뒤, 급여지급상세는 별도 트랜잭션으로 나중에 입력하는 것이 바람직하다.
- 급여지급상세 중 한 항목의 INSERT가 실패하면 성공한 항목만 COMMIT하는 것이 원자성을 지키는 방법이다.
- 급여지급과 급여지급상세는 하나의 트랜잭션으로 묶고, 사원 등록은 급여지급과 별도의 트랜잭션으로 처리할 수 있다.
9. 다음 [ATTEND_SUM] 테이블에 SQL을 실행한 결과로 옳은 것은? (LATE는 지각 횟수, ABSENT는 결근 일수이다.)
[ATTEND_SUM]
EMP_ID LATE ABSENT A 3 0 B NULL 1 C 0 NULL D NULL NULL E 5 2 F 1 0 SELECT EMP_ID FROM ATTEND_SUM WHERE NOT (LATE > 2 OR ABSENT > 0) ORDER BY EMP_ID;- C, D, F
- C, F
- F
- 결과 없음
10. 업무 규칙상 한 사원은 하루에 근태 기록을 한 건만 가지며, 근태 조회는 대부분 사원번호와 근무일자로 수행된다. 근태 테이블을 다음과 같이 인조식별자 ATT_ID(시퀀스로 부여)를 PK로 설계하였다. 이 설계에 대한 설명으로 가장 적절한 것은?
CREATE TABLE ATTEND ( ATT_ID NUMBER PRIMARY KEY, EMP_NO NUMBER NOT NULL, WORK_DT DATE NOT NULL, IN_TM VARCHAR2(5), OUT_TM VARCHAR2(5), CONSTRAINT ATTEND_UK UNIQUE (EMP_NO, WORK_DT) );- 본질식별자 (EMP_NO, WORK_DT)에 UNIQUE 제약을 두었으므로 같은 사원·같은 날짜의 근태 중복 입력은 막을 수 있지만, PK 인덱스와 UNIQUE 인덱스를 함께 유지해야 하므로 DML 부담이 늘어난다.
- ATT_ID가 PK이므로 ATTEND_UK가 없더라도 같은 사원의 같은 날짜 근태 중복 입력은 PK 제약으로 차단된다.
- 업무 조회가 주로 EMP_NO, WORK_DT로 이루어지므로 ATT_ID에 생성된 PK 인덱스가 조회 성능을 주로 담당한다.
- (EMP_NO, WORK_DT)는 부모인 사원으로부터 상속받은 사원번호를 포함하므로 인조식별자에 해당한다.
11. 인사팀이 '부서별 평균 급여'를 조회하려 한다. 관계형 데이터베이스와 SQL에 대한 설명으로 가장 적절한 것은?
- SQL은 절차적 언어이므로 '부서별 평균 급여'를 구하려면 행을 하나씩 읽는 반복 처리 순서를 직접 기술해야 한다.
- SQL은 원하는 결과(무엇)만 기술하고, 데이터를 어떤 경로와 순서로 읽을지(어떻게)는 옵티마이저가 결정한다.
- 관계 연산에서 WHERE 절은 투영(Projection)에, SELECT 절은 선택(Selection)에 해당한다.
- 관계형 데이터베이스는 정규화로 중복을 줄일 수 있지만, 여러 사용자의 동시 접근을 제어하는 기능은 제공하지 않는다.
12. 다음 [HR_EMP] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, 결과는 출력 순서대로 '이름(연봉)'으로 표기)
[HR_EMP]
EMP_NO NAME BASE_PAY ALLOWANCE 1 한지우 300 50 2 오세린 280 NULL 3 문태오 350 0 SELECT NAME, BASE_PAY * 12 + ALLOWANCE * 2 AS "연봉" FROM HR_EMP ORDER BY "연봉" DESC;- 문태오(4200), 한지우(3700), 오세린(3360)
- 문태오(4200), 한지우(3700), 오세린(NULL)
- 오세린(NULL), 문태오(8400), 한지우(7300)
- 오세린(NULL), 문태오(4200), 한지우(3700)
13. HR_EMP 테이블에는 EMP_NO, NAME, DEPT_CD, BASE_PAY 컬럼이 있다. 다음 중 Oracle에서 오류 없이 실행되는 SQL은?
SELECT E.*, E.BASE_PAY * 1.1 AS NEW_PAY FROM HR_EMP E;SELECT *, BASE_PAY * 1.1 AS NEW_PAY FROM HR_EMP;SELECT NAME AS EMP NAME, BASE_PAY FROM HR_EMP;SELECT DISTINCT NAME, DISTINCT DEPT_CD FROM HR_EMP;
14. 근속 기간과 급여 기준일을 계산하는 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 날짜는 YYYY-MM-DD로 표시, 결과는 A / B / C 순서)
SELECT TRUNC(MONTHS_BETWEEN(DATE '2025-03-15', DATE '2020-09-20') / 12) AS A, ADD_MONTHS(DATE '2024-02-29', 12) AS B, LAST_DAY(DATE '2025-08-27') AS C FROM DUAL;- 4 / 2025-03-01 / 2025-08-31
- 5 / 2025-02-28 / 2025-08-31
- 4 / 2025-02-28 / 2025-08-31
- 5 / 2025-03-01 / 2025-08-31
15. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C / D 순서)
SELECT SUBSTR('HR-2023-0157', INSTR('HR-2023-0157', '-', 1, 2) + 1) AS A, LPAD(TO_CHAR(57), 5, '0') AS B, REPLACE('HR-2023-0157', '-') AS C, LENGTH(TRIM(' 김 대리 ')) AS D FROM DUAL;- 0157 / 00057 / HR20230157 / 6
- 0157 / 00057 / HR20230157 / 4
- 2023-0157 / 57000 / HR 2023 0157 / 4
- 2023-0157 / 00057 / HR20230157 / 3
16. 다음 [PAYROLL] 테이블에 SQL을 실행했을 때 ALLOW 값을 EMP 순서(A~D)대로 나열한 것으로 옳은 것은? (Oracle)
[PAYROLL]
EMP POS OT_HOURS A 과장 5 B 대리 NULL C 사원 0 D NULL 3 SELECT EMP, DECODE(POS, '과장', 30, '대리', 20, 10) + NVL2(OT_HOURS, OT_HOURS * 2, 0) AS ALLOW FROM PAYROLL ORDER BY EMP;- 40, NULL, 10, 16
- 40, 20, 10, NULL
- 40, 20, 10, 6
- 40, 20, 10, 16
17. 다음 [STAFF] 테이블에 SQL을 실행한 결과로 옳은 것은?
[STAFF]
EMP_NO NAME 1 김수진 2 이수 3 박민수 4 수정란 5 최수아수 SELECT NAME FROM STAFF WHERE NAME LIKE '_수%' AND NAME NOT LIKE '%수' ORDER BY EMP_NO;- 김수진, 이수
- 김수진, 최수아수
- 김수진, 이수, 최수아수
- 김수진
18. Oracle에서 다음과 같이 데이터를 입력하고 COMMIT하였다. (가)~(다) SQL의 결과로 옳은 것은? (REMARK는 VARCHAR2(20) 타입이며, 4번 행의 값은 공백 한 칸이다.)
INSERT INTO STAFF_MEMO (EMP_NO, REMARK) VALUES (1, '휴직'); INSERT INTO STAFF_MEMO (EMP_NO, REMARK) VALUES (2, ''); INSERT INTO STAFF_MEMO (EMP_NO, REMARK) VALUES (3, NULL); INSERT INTO STAFF_MEMO (EMP_NO, REMARK) VALUES (4, ' '); COMMIT; -- (가) SELECT COUNT(*) FROM STAFF_MEMO WHERE REMARK IS NULL; -- (나) SELECT COUNT(*) FROM STAFF_MEMO WHERE REMARK = ''; -- (다) SELECT COUNT(*) FROM STAFF_MEMO WHERE LENGTH(REMARK) >= 1;- (가) 2, (나) 0, (다) 2
- (가) 1, (나) 1, (다) 2
- (가) 2, (나) 0, (다) 3
- (가) 1, (나) 0, (다) 3
19. 다음 [PAY_HIST] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 'DEPT CNT TOT' 순서)
[PAY_HIST]
EMP DEPT YM AMT 서하준 개발 2025-01 400 서하준 개발 2025-02 410 윤채원 개발 2025-02 380 정로운 영업 2025-01 350 정로운 영업 2025-02 360 강다인 인사 2025-02 300 강다인 인사 2025-03 300 SELECT DEPT, COUNT(DISTINCT EMP) AS CNT, SUM(AMT) AS TOT FROM PAY_HIST WHERE YM >= '2025-02' GROUP BY DEPT HAVING COUNT(*) >= 2 ORDER BY DEPT;- 개발 2 790 / 영업 1 360 / 인사 1 600
- 개발 3 1190 / 인사 2 600
- 개발 2 790 / 인사 1 600
- 개발 2 790 / 인사 2 600
20. 다음 [STAFF] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 'BAND CNT AVG_B' 순서)
[STAFF]
NAME SAL BONUS 가온 450 50 나린 400 NULL 다엘 300 30 라희 NULL 20 마음 250 10 SELECT CASE WHEN SAL >= 400 THEN 'H' ELSE 'L' END AS BAND, COUNT(*) AS CNT, AVG(BONUS) AS AVG_B FROM STAFF GROUP BY CASE WHEN SAL >= 400 THEN 'H' ELSE 'L' END ORDER BY BAND;- H 2 25 / L 3 20
- H 2 50 / L 3 20
- H 2 50 / L 2 20 / NULL 1 20
- H 2 25 / L 2 20
21. 다음 [STAFF] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle, 문자는 가나다순으로 정렬된다.)
[STAFF]
NAME DEPT BONUS 하윤 개발 30 지호 영업 NULL 서연 개발 NULL 도현 영업 50 민서 개발 30 SELECT NAME FROM STAFF ORDER BY DEPT, BONUS DESC, NAME;- 서연, 민서, 하윤, 지호, 도현
- 민서, 하윤, 서연, 도현, 지호
- 하윤, 민서, 서연, 도현, 지호
- 서연, 하윤, 민서, 지호, 도현
22. 다음 [STAFF] 테이블에 대해 (1)~(4)의 ORDER BY 절로 정렬했을 때, 출력 순서가 나머지와 다른 것은? (Oracle)
[STAFF]
NAME SAL 유진 320 태민 NULL 소율 410 건우 280 SELECT NAME, SAL AS PAY FROM STAFF ORDER BY ...; -- (1)~(4)의 ORDER BY 절을 각각 적용ORDER BY PAY DESCORDER BY 2 DESCORDER BY -SALORDER BY SAL DESC
23. 다음 [STAFF], [ALLOW_RULE] 테이블에 SQL을 실행한 결과로 옳은 것은? (근속연수 구간별 부서 수당 규정이다.)
[STAFF]
NAME DEPT YEARS 가 개발 3 나 개발 5 다 영업 3 라 영업 10 마 인사 1 [ALLOW_RULE]
DEPT MIN_YR MAX_YR AMT 개발 0 3 10 개발 3 6 20 영업 0 5 15 영업 5 9 25 인사 2 9 5 SELECT COUNT(*) AS CNT, SUM(R.AMT) AS TOT FROM STAFF S, ALLOW_RULE R WHERE S.DEPT = R.DEPT AND S.YEARS BETWEEN R.MIN_YR AND R.MAX_YR;- CNT = 3, TOT = 45
- CNT = 5, TOT = 90
- CNT = 4, TOT = 55
- CNT = 4, TOT = 65
24. [STAFF] 테이블의 EVAL_NO는 평가자, MENTOR_NO는 멘토의 EMP_NO이다(FK 제약은 없다). 다음 SQL의 결과로 옳은 것은? (결과는 '사원-평가자-멘토' 형식)
[STAFF]
EMP_NO NAME EVAL_NO MENTOR_NO 1 강민 NULL NULL 2 노을 1 1 3 류현 1 2 4 문솔 2 NULL 5 백설 3 9 SELECT E.NAME, V.NAME AS EVAL_NM, M.NAME AS MENTOR_NM FROM STAFF E, STAFF V, STAFF M WHERE E.EVAL_NO = V.EMP_NO AND E.MENTOR_NO = M.EMP_NO ORDER BY E.EMP_NO;- 노을-강민-강민, 류현-강민-노을, 문솔-노을-NULL
- 노을-강민-강민, 류현-강민-노을
- 노을-강민-강민, 류현-강민-노을, 문솔-노을-NULL, 백설-류현-NULL
- 류현-강민-노을
25. 다음 [STAFF], [DEPT_M], [LOC_M] 테이블에 SQL을 실행했을 때 결과 행으로 옳은 것은?
[STAFF]
NAME DEPT_CD 김 D1 이 D2 박 NULL 최 D9 [DEPT_M]
DEPT_CD DNAME LOC_CD D1 개발 L1 D2 영업 NULL D3 인사 L2 [LOC_M]
LOC_CD CITY L1 서울 L2 부산 SELECT S.NAME, D.DNAME, L.CITY FROM STAFF S LEFT OUTER JOIN DEPT_M D ON S.DEPT_CD = D.DEPT_CD INNER JOIN LOC_M L ON D.LOC_CD = L.LOC_CD;- (김, 개발, 서울) 1행
- (김, 개발, 서울), (이, 영업, NULL) 2행
- (김, 개발, 서울), (이, 영업, NULL), (박, NULL, NULL), (최, NULL, NULL) 4행
- (김, 개발, 서울), (박, NULL, NULL), (최, NULL, NULL) 3행
26. 다음 [STAFF], [DEPT_M] 테이블에 (가), (나) SQL을 실행한 결과로 옳은 것은? (두 테이블에서 이름이 같은 컬럼은 DEPT_CD와 USE_YN이다.)
[STAFF]
EMP_NO DEPT_CD USE_YN 1 D1 Y 2 D1 N 3 D2 Y 4 D3 Y [DEPT_M]
DEPT_CD DNAME USE_YN D1 개발 Y D2 영업 N D3 인사 Y -- (가) SELECT COUNT(*) FROM STAFF NATURAL JOIN DEPT_M; -- (나) SELECT COUNT(*) FROM STAFF JOIN DEPT_M USING (DEPT_CD);- (가) 4, (나) 4
- (가) 2, (나) 2
- (가) 2, (나) 4
- (가) 4, (나) 2
27. 다음 [STAFF], [DEPT_M] 테이블에 (가), (나) SQL을 실행한 결과로 옳은 것은?
[STAFF]
NAME DEPT_CD BONUS 김 D1 100 이 D1 NULL 박 D2 200 최 NULL 150 [DEPT_M]
DEPT_CD DNAME D1 개발 D2 영업 D3 인사 -- (가) SELECT COUNT(*) FROM DEPT_M D WHERE EXISTS (SELECT NULL FROM STAFF S WHERE S.DEPT_CD = D.DEPT_CD AND S.BONUS IS NULL); -- (나) SELECT COUNT(*) FROM DEPT_M D WHERE NOT EXISTS (SELECT 1 FROM STAFF S WHERE S.DEPT_CD = D.DEPT_CD AND S.BONUS > 120);- (가) 0, (나) 2
- (가) 1, (나) 2
- (가) 1, (나) 0
- (가) 2, (나) 2
28. 다음 [STAFF] 테이블에 대해 실행할 때 오류가 발생하는 SQL은? (Oracle)
[STAFF]
NAME DEPT_CD SAL 송지안 D1 380 임하람 D1 420 배시온 D2 350 진다올 D3 300 SELECT NAME FROM STAFF WHERE SAL > (SELECT AVG(SAL) FROM STAFF WHERE DEPT_CD = 'D1');SELECT NAME FROM STAFF WHERE SAL > ALL (SELECT SAL FROM STAFF WHERE DEPT_CD = 'D1');SELECT NAME FROM STAFF WHERE SAL = (SELECT SAL FROM STAFF WHERE DEPT_CD = 'D9');SELECT NAME FROM STAFF WHERE SAL > (SELECT SAL FROM STAFF WHERE DEPT_CD = 'D1');
29. 정규직 급여(PAY_REG)와 계약직 급여(PAY_CON)를 합쳐 부서별 급여 합계를 구하려고 다음 SQL을 실행했다. 결과로 옳은 것은?
[PAY_REG]
DEPT AMT 개발 300 개발 300 영업 250 [PAY_CON]
DEPT AMT 개발 200 영업 250 인사 180 SELECT DEPT, SUM(AMT) AS TOT FROM (SELECT DEPT, AMT FROM PAY_REG UNION SELECT DEPT, AMT FROM PAY_CON) GROUP BY DEPT ORDER BY DEPT;- 개발 500 / 영업 250 / 인사 180
- 개발 800 / 영업 500 / 인사 180
- 개발 500 / 영업 500 / 인사 180
- 개발 800 / 영업 250 / 인사 180
30. 다음 [GRADE_A], [GRADE_B] 테이블에 (가), (나) SQL을 실행한 결과로 옳은 것은?
[GRADE_A]
DEPT_CD GRADE D1 S D2 NULL D3 A [GRADE_B]
DEPT_CD GRADE D2 NULL D3 A D4 B -- (가) SELECT COUNT(*) FROM (SELECT DEPT_CD, GRADE FROM GRADE_A INTERSECT SELECT DEPT_CD, GRADE FROM GRADE_B); -- (나) SELECT COUNT(*) FROM GRADE_A A JOIN GRADE_B B ON A.DEPT_CD = B.DEPT_CD AND A.GRADE = B.GRADE;- (가) 1, (나) 1
- (가) 2, (나) 2
- (가) 2, (나) 1
- (가) 3, (나) 1
31. 다음 [ATT_OT] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, 결과는 (DEPT | GRADE | OT)로 출력 순서대로 표기)
[ATT_OT]
DEPT GRADE OT_HR 개발 대리 10 개발 대리 6 개발 과장 4 영업 대리 8 영업 사원 2 SELECT DEPT, GRADE, SUM(OT_HR) AS OT FROM ATT_OT GROUP BY ROLLUP(DEPT, GRADE) HAVING GROUPING(GRADE) = 1 ORDER BY DEPT;- (개발 | NULL | 20), (영업 | NULL | 10)
- (개발 | NULL | 20), (영업 | NULL | 10), (NULL | NULL | 30)
- (NULL | 대리 | 24), (NULL | 과장 | 4), (NULL | 사원 | 2), (NULL | NULL | 30)
- (개발 | 대리 | 16), (개발 | 과장 | 4), (영업 | 대리 | 8), (영업 | 사원 | 2)
32. 다음 SQL과 항상 같은 결과 집합(행 순서는 무시)을 반환하도록 GROUP BY 절을 바꾼 것으로 옳은 것은?
SELECT DEPT, GRADE, SUM(OT_HR) AS OT FROM ATT_OT GROUP BY ROLLUP(DEPT, GRADE);GROUP BY GROUPING SETS (DEPT, GRADE, ())GROUP BY CUBE(DEPT, GRADE)GROUP BY GROUPING SETS ((DEPT, GRADE), GRADE, ())GROUP BY GROUPING SETS ((DEPT, GRADE), DEPT, ())
33. 다음 [STAFF] 테이블에 SQL을 실행했을 때 S1 값을 NAME 순서(가~마)대로 나열한 것으로 옳은 것은?
[STAFF]
NAME DEPT SAL 가 D1 300 나 D1 300 다 D1 400 라 D2 200 마 D2 250 SELECT NAME, SUM(SAL) OVER (PARTITION BY DEPT ORDER BY SAL) AS S1 FROM STAFF ORDER BY NAME;- 300, 600, 1000, 200, 450
- 600, 600, 1000, 450, 450
- 600, 600, 1000, 200, 450
- 1000, 1000, 1000, 450, 450
34. 다음 [PAY_HIST] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 (EMP, YM)을 출력 순서대로 표기)
[PAY_HIST]
EMP YM AMT A 01 300 A 02 300 A 03 330 B 01 280 B 02 290 B 03 285 SELECT EMP, YM FROM (SELECT EMP, YM, AMT - LAG(AMT) OVER (PARTITION BY EMP ORDER BY YM) AS DIFF FROM PAY_HIST) WHERE DIFF > 0 ORDER BY EMP, YM;- (A, 03), (B, 02)
- (A, 01), (A, 03), (B, 01), (B, 02)
- (A, 03), (B, 01), (B, 02)
- (A, 03)
35. 다음 [WORK_LOG] 테이블에 SQL을 실행했을 때 M 값을 DAY 순서대로 나열한 것으로 옳은 것은?
[WORK_LOG]
DAY HRS 1 8 2 10 3 7 4 9 5 6 SELECT DAY, MIN(HRS) OVER (ORDER BY DAY ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS M FROM WORK_LOG ORDER BY DAY;- 8, 8, 7, 7, 6
- 8, 7, 7, 6, 6
- 7, 7, 6, 6, 6
- 6, 6, 6, 6, 6
36. 다음 [STAFF] 테이블에 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 12c 이상)
[STAFF]
NAME SAL 가 500 나 450 다 450 라 450 마 300 -- (가) SELECT NAME, SAL FROM STAFF ORDER BY SAL DESC FETCH FIRST 2 ROWS ONLY; -- (나) SELECT NAME, SAL FROM STAFF ORDER BY SAL DESC FETCH FIRST 2 ROWS WITH TIES;- (가) 2건, (나) 2건
- (가) 2건, (나) 3건
- (가) 4건, (나) 4건
- (가) 2건, (나) 4건
37. 급여 상위 2명을 조회하려고 다음 SQL을 작성했다. 결과로 옳은 것은? (Oracle, 테이블의 행은 표에 나온 순서대로 읽힌다고 가정하며 출력 순서는 고려하지 않는다.)
[STAFF]
NAME SAL 정하윤 300 한도겸 500 윤슬기 400 강예준 450 조은비 350 SELECT NAME FROM (SELECT ROWNUM AS RN, NAME, SAL FROM STAFF ORDER BY SAL DESC) WHERE RN <= 2;- 한도겸, 정하윤
- 한도겸, 강예준
- 강예준, 윤슬기
- 결과 없음
38. 다음 [HR_ORG] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle, 문자는 가나다순으로 정렬된다.)
[HR_ORG]
ORG_ID ORG_NM UP_ID 1 본사 NULL 2 영업본부 1 3 개발본부 1 4 국내영업팀 2 5 해외영업팀 2 6 백엔드팀 3 7 데이터팀 3 SELECT ORG_NM FROM HR_ORG START WITH UP_ID IS NULL CONNECT BY PRIOR ORG_ID = UP_ID ORDER SIBLINGS BY ORG_NM;- 본사, 개발본부, 영업본부, 데이터팀, 백엔드팀, 국내영업팀, 해외영업팀
- 본사, 영업본부, 국내영업팀, 해외영업팀, 개발본부, 백엔드팀, 데이터팀
- 본사, 개발본부, 데이터팀, 백엔드팀, 영업본부, 국내영업팀, 해외영업팀
- 개발본부, 국내영업팀, 데이터팀, 백엔드팀, 본사, 영업본부, 해외영업팀
39. 다음 [STAFF] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, MGR_NO는 상사의 EMP_NO이다. 결과는 TOT / MAX_LV 순서)
[STAFF]
EMP_NO NAME MGR_NO SAL 1 서지환 NULL 900 2 정다빈 1 600 3 류승호 1 650 4 남궁민 2 400 5 황보람 2 420 6 오시윤 4 300 7 탁재희 3 380 SELECT SUM(SAL) AS TOT, MAX(LEVEL) AS MAX_LV FROM STAFF START WITH NAME = '정다빈' CONNECT BY PRIOR EMP_NO = MGR_NO;- 1720 / 4
- 1720 / 3
- 1120 / 2
- 3650 / 4
40. 다음 [PAY_Q] 테이블에 SQL을 실행했을 때 DEPT가 '개발'인 행의 값으로 옳은 것은? (Oracle)
[PAY_Q]
DEPT QTR AMT 개발 Q1 100 개발 Q1 50 개발 Q2 80 영업 Q2 70 영업 Q3 90 SELECT * FROM (SELECT DEPT, QTR, AMT FROM PAY_Q) PIVOT (SUM(AMT) AS S, COUNT(*) AS C FOR QTR IN ('Q1' AS Q1, 'Q2' AS Q2)) ORDER BY DEPT;- Q1_S = 150, Q1_C = 1, Q2_S = 80, Q2_C = 1
- S_Q1 = 150, C_Q1 = 2, S_Q2 = 80, C_Q2 = 1
- Q1_S = 100, Q1_C = 2, Q2_S = 80, Q2_C = 1
- Q1_S = 150, Q1_C = 2, Q2_S = 80, Q2_C = 1
41. 사원의 보유 자격증 목록이 쉼표로 구분되어 저장되어 있다. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 C / S 순서)
SELECT REGEXP_COUNT('SQLD,ADsP,,정보처리기사', '[^,]+') AS C, REGEXP_SUBSTR('SQLD,ADsP,,정보처리기사', '[^,]+', 1, 3) AS S FROM DUAL;- 3 / 정보처리기사
- 4 / NULL
- 4 / 정보처리기사
- 3 / ADsP
42. 다음 [EMP_ID_T] 테이블에 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle)
[EMP_ID_T]
EMP_ID EMP0123 emp0456 EMP12345 EMP-0789 XEMP0001 -- (가) SELECT COUNT(*) FROM EMP_ID_T WHERE REGEXP_LIKE(EMP_ID, '^EMP[0-9]{4}$'); -- (나) SELECT COUNT(*) FROM EMP_ID_T WHERE REGEXP_LIKE(EMP_ID, '^EMP[0-9]{4}$', 'i');- (가) 1건, (나) 1건
- (가) 1건, (나) 2건
- (가) 2건, (나) 2건
- (가) 2건, (나) 3건
43. 다음 [STAFF] 테이블에 UPDATE 문을 실행한 후
SELECT SUM(SAL), SUM(BONUS) FROM STAFF;의 결과로 옳은 것은?[STAFF]
EMP_NO SAL BONUS 1 300 20 2 400 NULL UPDATE STAFF SET SAL = SAL + BONUS, BONUS = SAL * 0.1;- 320, 32
- 720, 70
- 320, 70
- 720, 72
44. PAY_LOG(EMP_NO, AMT)와 BONUS_LOG(EMP_NO)는 처음에 비어 있고 제약조건은 없다. [STAFF] 테이블이 다음과 같을 때, 아래 문장을 실행(Oracle)한 후 PAY_LOG와 BONUS_LOG의 행 수로 옳은 것은?
[STAFF]
EMP_NO DEPT_CD SAL BONUS 1 D1 300 30 2 D1 280 NULL 3 D2 350 20 INSERT ALL INTO PAY_LOG (EMP_NO, AMT) VALUES (EMP_NO, SAL) INTO PAY_LOG (EMP_NO, AMT) VALUES (EMP_NO, BONUS) INTO BONUS_LOG (EMP_NO) VALUES (EMP_NO) SELECT EMP_NO, SAL, BONUS FROM STAFF WHERE DEPT_CD = 'D1';- PAY_LOG 2건, BONUS_LOG 2건
- PAY_LOG 3건, BONUS_LOG 2건
- PAY_LOG 4건, BONUS_LOG 4건
- PAY_LOG 4건, BONUS_LOG 2건
45. STAFF_PAY 테이블에는 (EMP_NO, SAL) = (1, 100)인 한 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행한 후
SELECT SAL FROM STAFF_PAY WHERE EMP_NO = 1;의 결과는? (오류가 발생한 문장은 무시하고 진행한다.)UPDATE staff_pay SET sal = 200 WHERE emp_no = 1; SAVEPOINT a; UPDATE staff_pay SET sal = 300 WHERE emp_no = 1; SAVEPOINT b; UPDATE staff_pay SET sal = 400 WHERE emp_no = 1; ROLLBACK TO a; UPDATE staff_pay SET sal = sal + 50 WHERE emp_no = 1; ROLLBACK TO b; COMMIT;- 250
- 300
- 100
- 350
46. Oracle에서 급여 테이블에 UPDATE를 실행하고 아직 COMMIT하지 않은 상태이다. 이후 다음 상황이 일어났을 때, 진행 중이던 트랜잭션이 종료되지 않는 경우는?
- 같은 세션에서 CREATE TABLE 문을 실행했다.
- 같은 세션에서
ROLLBACK TO sp1;을 실행했다. (sp1은 UPDATE 이전에 지정한 저장점이다.) - 같은 세션에서 다른 사용자에게 GRANT 문을 실행했다.
- 네트워크 장애로 세션이 비정상 종료되었다.
47. 인사 시스템의 DEPT_H(부모)와 STAFF_H(자식) 테이블을 설계할 때 DDL에 대한 설명으로 가장 적절하지 않은 것은?
- STAFF_H의 FK가 DEPT_H를 참조하고 있으면 Oracle에서
DROP TABLE DEPT_H;는 실패하며,DROP TABLE DEPT_H CASCADE CONSTRAINTS;로 참조 제약까지 함께 삭제해야 한다. - 부서별 사원을 보여 주는 뷰의 정의를 바꾸려면
CREATE OR REPLACE VIEW로 다시 생성한다. - Oracle에서 FK에
ON UPDATE CASCADE를 지정하면 DEPT_H의 부서코드를 변경할 때 STAFF_H의 부서코드도 함께 변경된다. - STAFF_H의 EMAIL 컬럼에 UNIQUE 제약을 두면 Oracle에서는 EMAIL이 NULL인 행을 여러 건 넣을 수 있지만, SQL Server에서는 한 건만 넣을 수 있다.
- STAFF_H의 FK가 DEPT_H를 참조하고 있으면 Oracle에서
48. Oracle에서 아래 문장을 순서대로 실행했다. 실패한 문장과 마지막 SELECT의 결과로 옳은 것은? (오류가 발생한 문장은 무시하고 진행한다. DEPT_H에는 'D1', 'D2', STAFF_H에는 (1, 'D1'), (2, 'D1'), (3, 'D2')가 커밋되어 있다.)
CREATE TABLE dept_h ( dept_cd CHAR(2) PRIMARY KEY, dname VARCHAR2(20) ); CREATE TABLE staff_h ( emp_no NUMBER PRIMARY KEY, dept_cd CHAR(2) REFERENCES dept_h(dept_cd) ON DELETE SET NULL ); -- (데이터 입력 및 COMMIT 완료) DELETE FROM dept_h WHERE dept_cd = 'D1'; -- ㄱ DROP TABLE dept_h; -- ㄴ DROP TABLE dept_h CASCADE CONSTRAINTS; -- ㄷ INSERT INTO staff_h VALUES (4, 'D9'); -- ㄹ SELECT COUNT(*), COUNT(dept_cd) FROM staff_h;- ㄴ만 실패 / 3, 1
- ㄴ, ㄹ 실패 / 3, 1
- ㄱ, ㄴ 실패 / 4, 3
- ㄴ만 실패 / 4, 2
49. 인사 스키마 HRADM의 객체에 대한 권한을 부여하려 한다. Oracle의 오브젝트 권한에 대한 설명으로 가장 적절한 것은?
- 시퀀스 HRADM.EMP_SEQ에는 SELECT 권한과 ALTER 권한을 부여할 수 있다.
- 뷰 HRADM.V_PAY에 INDEX 권한을 부여하면 해당 사용자가 뷰에 인덱스를 생성할 수 있다.
- 급여 계산 프로시저 HRADM.CALC_PAY를 실행하게 하려면 SELECT 권한을 부여한다.
- REFERENCES 권한은 다른 사용자가 해당 뷰를 참조하는 FK 제약조건을 만들 수 있게 하는 권한이다.
50. 다음 문장을 순서대로 실행할 때 오류가 발생하는 문장을 모두 고른 것은? (Oracle, PAYROLL은 HRADM 소유 테이블이며 U1~U3는 이 문장들 외에 다른 권한을 받은 적이 없다.)
-- DBA 실행 GRANT CREATE VIEW TO u1 WITH ADMIN OPTION; -- ① GRANT CREATE VIEW TO u2 WITH ADMIN OPTION; -- ② -- U1 실행 GRANT CREATE VIEW TO u3; -- ③ -- U2 실행 REVOKE CREATE VIEW FROM u3; -- ④ -- HRADM 실행 GRANT SELECT ON hradm.payroll TO u1 WITH GRANT OPTION; -- ⑤ GRANT SELECT ON hradm.payroll TO u2 WITH GRANT OPTION; -- ⑥ -- U1 실행 GRANT SELECT ON hradm.payroll TO u3; -- ⑦ -- U2 실행 REVOKE SELECT ON hradm.payroll FROM u3; -- ⑧- ④
- ⑧
- ④, ⑧
- 없음
AI가 SQLD 출제 범위를 바탕으로 새로 만든 예상 문제이며, 실제 기출문제가 아닙니다.