SQLD 모의고사 14회
50문항 · 제한 시간 90분. 다 풀면 과목별 점수와 합격 여부, 문제마다 해설을 보여 줘요.
1. 도서관 시스템의 데이터 모델링을 진행하면서 데이터 모델링의 세 가지 관점과 그 분석 방법을 정리하였다. 다음 중 가장 적절하지 않은 것은?
- 데이터 관점은 업무가 어떤 데이터와 관련이 있는지, 데이터 간의 관계는 무엇인지를 정적·구조적으로 분석한다.
- 프로세스 관점은 '도서 대출', '반납', '예약' 등 업무가 실제로 무엇을 하는지를 시나리오 분석·동적 분석으로 살펴본다.
- 상관 관점은 업무 처리 방법에 따라 데이터가 어떤 영향을 받는지를 살펴보며, 주로 정규화를 통해 분석한다.
- '대출 처리' 업무가
대출엔터티를 생성(C)하고도서엔터티의 대출상태를 수정(U)한다는 것을 표로 정리하는 것은 상관 관점의 분석이다.
2. 도서관 시스템의 엔터티 이름을 검토하는 회의에서 다음 의견이 나왔다. 엔터티 명명 규칙에 가장 부합하는 의견은?
- 회원과 도서를 연결해 생기는 엔터티를 '회원도서'라고 부르기보다, 업무에서 생성되는 의미를 살려 '대출'로 명명한다.
- 도서 엔터티에는 여러 권의 도서 정보가 담기므로 '도서들'처럼 복수형 명사로 명명한다.
- 이름이 길면 불편하므로 '도서예약이력'은 'BK_RSV_HST'처럼 약어 위주로 명명한다.
- 열람실 좌석 예약과 도서 예약은 업무 성격이 비슷하므로 두 엔터티 모두 '예약'이라는 같은 이름을 사용한다.
3. 엔터티, 인스턴스, 속성, 속성값의 관계에 대한 설명으로 가장 적절하지 않은 것은?
- 하나의 엔터티는 두 개 이상의 인스턴스 집합이어야 한다.
- 하나의 엔터티는 두 개 이상의 속성을 갖는다.
- 하나의 속성은 하나의 인스턴스에서 하나의 속성값만 가진다.
도서엔터티의 '저자' 속성에 공저자 여러 명을 'kim, lee, park'처럼 한 값으로 저장하는 것은 단일 속성이므로 바람직한 설계다.
4. 도서관 업무에서 다음 관계를 도출하였다.
- (가) 사서는 하나의 자료실에 소속된다.
- (나) 회원은 도서를 대출한다.
- (다) 회원은 도서를 예약한다.
- (라) 도서는 하나의 분류(주제)에 속한다.
관계를 존재에 의한 관계와 행위에 의한 관계로 분류한 것으로 가장 적절한 것은?
- 존재: (가), (나) / 행위: (다), (라)
- 존재: (가), (라) / 행위: (나), (다)
- 존재: (나), (다) / 행위: (가), (라)
- 존재: (가) / 행위: (나), (다), (라)
5. 도서관은 같은 책(같은 ISBN)을 여러 권 소장하며, 대출은 책 한 권(소장본) 단위로 관리한다. 각 소장본에는 입수할 때 도서관이 고유한 등록번호를 부여해 바코드로 붙이고, 대출·반납 업무에서는 이 바코드를 찍는다.
소장도서엔터티의 주식별자로 가장 적절한 것은?- 도서명
- 등록번호
- ISBN
- 도서명 + 저자명
6. 다음
대출테이블의 PK는 대출번호이며, 회원명은 회원번호에 의해, 도서명은 도서번호에 의해 결정된다.대출번호 회원번호 회원명 도서번호 도서명 대출일자 1001 M01 한서윤 B10 자료구조 2026-03-02 1002 M02 오지후 B10 자료구조 2026-03-03 1003 M01 한서윤 B20 운영체제 2026-03-05 이 테이블에 대한 설명으로 가장 적절한 것은?
- 회원명이 바뀌어도 해당 회원의 대출 행 하나만 수정하면 되므로 갱신 이상은 발생하지 않는다.
- PK가 단일 속성이지만 회원명이 회원번호에 종속되므로 부분 함수 종속이 존재하며 제2정규형을 위배한다.
- B20 도서의 유일한 대출 행(1003)을 삭제해도 도서명 '운영체제'는 이 테이블에 그대로 남는다.
- 회원명과 도서명이 PK가 아닌 일반 속성을 거쳐 PK에 이행적으로 종속되므로, 회원·도서 정보를 별도 테이블로 분리하여 제3정규형으로 만든다.
7.
MEMBER와LOAN은 1:M 관계이며 데이터는 다음과 같다. SQL의 실행 결과로 옳은 것은?[MEMBER]
MEM_ID NAME POINT M1 한서윤 100 M2 오지후 200 M3 백도현 300 [LOAN]
LOAN_ID MEM_ID 1 M1 2 M1 3 M1 4 M2 SELECT SUM(M.POINT) FROM MEMBER M JOIN LOAN L ON M.MEM_ID = L.MEM_ID;- 500
- 300
- 600
- 1100
8. 도서관의 대출 처리는 다음 세 작업으로 구성된다.
대출테이블에 대출 1건 INSERT도서테이블의 대출상태를 '대출중'으로 UPDATE회원테이블의 현재대출권수를 1 증가시키는 UPDATE
이 처리에 대한 설명으로 가장 적절한 것은?
- 세 작업은 서로 다른 테이블을 변경하므로 작업마다 별도 트랜잭션으로 나누어 즉시 COMMIT하는 것이 원칙이다.
- 1번 INSERT가 성공하고 2번 UPDATE가 실패하면 1번만 COMMIT하고 도서 상태는 야간 배치로 보정하면 된다.
- 세 작업을 하나의 트랜잭션으로 묶어 모두 반영되거나 모두 취소되도록 해야 하며, 이는 원자성(Atomicity)과 관련된다.
- COMMIT이 완료된 뒤 시스템 장애가 발생하면 대출 INSERT가 취소될 수 있는데, 이는 지속성(Durability) 때문이다.
9. 다음 [MEMBER] 테이블에서 M3 행은 INSERT할 때 EMAIL에
''(빈 문자열)을 입력한 행이다. (가)~(다)의 결과로 옳은 것은? (Oracle 기준)[MEMBER]
MEM_ID EMAIL M1 kim@lib.kr M2 NULL M3 (빈 문자열 입력) M4 X -- (가) SELECT COUNT(*) FROM MEMBER WHERE EMAIL IS NULL; -- (나) SELECT COUNT(*) FROM MEMBER WHERE EMAIL = ''; -- (다) SELECT COUNT(*) FROM MEMBER WHERE NVL(EMAIL, 'X') = 'X';- (가) 1, (나) 1, (다) 2
- (가) 2, (나) 1, (다) 3
- (가) 1, (나) 0, (다) 2
- (가) 2, (나) 0, (다) 3
10.
대출엔터티의 본질식별자는 (회원번호, 등록번호, 대출일시)이다. 설계자는 이 대신 시퀀스로 생성하는대출번호를 PK로 사용하려 한다. 이에 대한 설명으로 가장 적절한 것은?- 대출번호를 PK로 지정하면 같은 (회원번호, 등록번호, 대출일시) 조합이 중복 입력되는 것을 PK 제약이 자동으로 막아 준다.
- 조회가 주로 회원번호·등록번호 조건으로 이루어진다면, PK 인덱스와 별도로 이 컬럼들에 대한 인덱스가 추가로 필요해질 수 있다.
- 본질식별자는 업무와 무관하게 시스템이 기계적으로 부여하는 값이고, 인조식별자는 업무에 의해 자연스럽게 만들어지는 값이다.
- 인조식별자는 관계를 통해 자식 엔터티로 상속될 수 없으므로, 대출번호를 쓰면 자식 엔터티와의 관계를 정의할 수 없다.
11.
BOOK테이블의 BOOK_ID는 기본키(PK)이고,LOAN테이블의 BOOK_ID는 BOOK.BOOK_ID를 참조하는 외래키(FK)이다. LOAN.BOOK_ID에는 NOT NULL 제약이 없다. 이에 대한 설명으로 적절하지 않은 것은?- LOAN.BOOK_ID는 외래키이므로 LOAN 테이블 안에서 같은 값이 두 번 이상 나타날 수 없다.
- LOAN.BOOK_ID에는 NULL을 입력할 수 있다.
- BOOK 테이블에 존재하지 않는 BOOK_ID 값은 LOAN.BOOK_ID에 입력할 수 없다.
- BOOK.BOOK_ID에는 NULL을 입력할 수 없고 중복된 값도 입력할 수 없다.
12. Oracle에서 다음 SQL을 실행했을 때 결과 집합의 컬럼 이름을 순서대로 나열한 것으로 옳은 것은?
SELECT TITLE AS book_title, PRICE * 1.1 "Price+Tax", PUB_YEAR yr FROM BOOK;- book_title, Price+Tax, yr
- BOOK_TITLE, PRICE+TAX, YR
- BOOK_TITLE, Price+Tax, YR
- 특수문자 '+'가 포함된 별칭 때문에 오류가 발생한다.
13. BOOK 테이블(BOOK_ID, TITLE, CATEGORY, PRICE)에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?
SELECT B.*, PRICE * 2 AS DBL FROM BOOK B;SELECT TITLE, 'KRW' AS UNIT FROM BOOK;SELECT ALL CATEGORY FROM BOOK;SELECT *, PRICE * 2 AS DBL FROM BOOK;
14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, A / B / C 순서)
SELECT LENGTH(REPLACE('978-89-6626-123-4', '-')) AS A, SUBSTR('978-89-6626-123-4', -5, 3) AS B, INSTR('978-89-6626-123-4', '-', -1) AS C FROM DUAL;- 13 / '23-' / 16
- 13 / '123' / 16
- 17 / '123' / 4
- 13 / '123' / 4
15. 도서관은 대출일로부터 14일 뒤를 반납예정일로 정한다. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, A / B / C 순서)
SELECT TO_CHAR(DATE '2026-02-20' + 14, 'YYYY-MM-DD') AS A, DATE '2026-03-10' - DATE '2026-02-20' AS B, TO_CHAR(LAST_DAY(DATE '2026-02-20'), 'DD') AS C FROM DUAL;- 2026-03-06 / 18 / 28
- 2026-03-06 / 19 / 28
- 2026-03-05 / 18 / 29
- 2026-03-04 / 18 / 28
16. 다음 [LOAN] 테이블에 SQL을 실행한 결과로 옳은 것은? (DUE_DAY는 반납예정일, RET_DAY는 실제 반납일을 나타내는 일련번호이며 RET_DAY가 NULL이면 미반납이다. A / B / C 순서)
[LOAN]
LOAN_ID DUE_DAY RET_DAY L1 10 9 L2 10 13 L3 10 NULL L4 12 20 L5 12 12 SELECT SUM(CASE WHEN RET_DAY > DUE_DAY THEN (RET_DAY - DUE_DAY) * 100 END) AS A, MAX(RET_DAY - DUE_DAY) AS B, COUNT(NULLIF(RET_DAY, DUE_DAY)) AS C FROM LOAN;- 1100 / 8 / 4
- 1000 / 8 / 3
- 1100 / 8 / 3
- 1100 / NULL / 3
17. 다음 [BOOK] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은?
[BOOK]
BOOK_ID PUB_YEAR 1 2014 2 2015 3 2018 4 2020 5 2021 6 NULL -- (가) SELECT COUNT(*) FROM BOOK WHERE PUB_YEAR BETWEEN 2020 AND 2015; -- (나) SELECT COUNT(*) FROM BOOK WHERE PUB_YEAR NOT BETWEEN 2015 AND 2020;- (가) 4, (나) 2
- (가) 0, (나) 2
- (가) 0, (나) 3
- (가) 4, (나) 3
18. 다음 [SHELF] 테이블의 CALL_NO(청구기호, VARCHAR2)에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은?
[SHELF]
CALL_NO 005.1-김12 005.13-이 813.6-박 005-최 005. -- (가) SELECT COUNT(*) FROM SHELF WHERE CALL_NO LIKE '005._%'; -- (나) SELECT COUNT(*) FROM SHELF WHERE CALL_NO LIKE '0__%';- (가) 3, (나) 4
- (가) 2, (나) 5
- (가) 4, (나) 4
- (가) 2, (나) 4
19. 다음 [LOAN] 테이블에 SQL을 실행한 결과로 옳은 것은? (MEM_ID(C1, C2) 형식으로 표기)
[LOAN]
LOAN_ID MEM_ID BOOK_ID 1 M1 B1 2 M1 B2 3 M1 B1 4 M2 B3 5 M2 B4 6 M3 B5 7 M3 B5 8 M3 B5 9 M4 B6 SELECT MEM_ID, COUNT(*) AS C1, COUNT(DISTINCT BOOK_ID) AS C2 FROM LOAN GROUP BY MEM_ID HAVING COUNT(*) > COUNT(DISTINCT BOOK_ID) ORDER BY MEM_ID;- M1(3, 2), M3(3, 1)
- M1(3, 2)
- M1(3, 2), M2(2, 2), M3(3, 1)
- M3(3, 1)
20. 다음 [BOOK] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, (DECADE, CNT, AVG_P) 형식으로 표기)
[BOOK]
BOOK_ID PUB_YEAR PRICE 1 2008 10000 2 2012 20000 3 2015 16000 4 2019 NULL 5 2021 15000 6 2023 12000 7 2009 22000 SELECT TRUNC(PUB_YEAR, -1) AS DECADE, COUNT(*) AS CNT, AVG(PRICE) AS AVG_P FROM BOOK GROUP BY TRUNC(PUB_YEAR, -1) HAVING AVG(PRICE) >= 15000 ORDER BY DECADE;- (2000, 2, 16000)
- (2000, 2, 16000), (2010, 2, 18000)
- (2000, 2, 16000), (2010, 3, 18000)
- (2000, 2, 16000), (2010, 3, 18000), (2020, 2, 13500)
21. BOOK 테이블(BOOK_ID, TITLE, CATEGORY, PRICE)에 대해 실행할 때 오류가 발생하는 SQL은? (Oracle)
SELECT TITLE FROM BOOK ORDER BY PRICE DESC;SELECT DISTINCT CATEGORY FROM BOOK ORDER BY PRICE;SELECT CATEGORY, COUNT(*) AS CNT FROM BOOK GROUP BY CATEGORY ORDER BY CNT DESC;SELECT TITLE, PRICE FROM BOOK ORDER BY 2 DESC, TITLE;
22. 다음 [LOAN] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle)
[LOAN]
LOAN_ID MEM_ID RET_DAY L1 M2 5 L2 M1 NULL L3 M1 7 L4 M2 NULL L5 M1 3 SELECT LOAN_ID FROM LOAN ORDER BY MEM_ID, RET_DAY DESC;- L3, L5, L2, L1, L4
- L2, L3, L5, L1, L4
- L5, L3, L2, L1, L4
- L2, L3, L5, L4, L1
23. 다음 [MEMBER], [GRADE_RULE] 테이블에 SQL을 실행했을 때, 결과 건수와 GRADE가 '우수'인 행의 수로 옳은 것은?
[MEMBER]
NAME POINT 가람 100 나래 300 다온 500 라온 800 [GRADE_RULE]
GRADE LO HI 일반 0 300 우수 300 700 VIP 700 1000 SELECT M.NAME, G.GRADE FROM MEMBER M, GRADE_RULE G WHERE M.POINT BETWEEN G.LO AND G.HI;- 4건, 1행
- 4건, 2행
- 5건, 2행
- 5건, 3행
24. 다음 [RESERVE] 테이블은 도서별 예약 대기 순번(RSV_SEQ)을 관리한다. SQL의 실행 결과로 옳은 것은?
[RESERVE]
BOOK_ID RSV_SEQ MEM_ID B1 1 M1 B1 2 M2 B1 3 M3 B2 1 M4 B2 2 M1 B3 1 M2 SELECT COUNT(*) FROM RESERVE A, RESERVE B WHERE A.BOOK_ID = B.BOOK_ID AND A.RSV_SEQ < B.RSV_SEQ;- 4
- 8
- 10
- 14
25. 다음 테이블에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은? (LOAN.BOOK_ID에는 FK 제약이 없다.)
[MEMBER]
MEM_ID M1 M2 M3 [LOAN]
LOAN_ID MEM_ID BOOK_ID L1 M1 B1 L2 M1 B2 L3 M2 B9 [BOOK]
BOOK_ID B1 B2 -- (가) SELECT COUNT(*) FROM MEMBER M LEFT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID LEFT OUTER JOIN BOOK B ON L.BOOK_ID = B.BOOK_ID; -- (나) SELECT COUNT(*) FROM MEMBER M LEFT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID INNER JOIN BOOK B ON L.BOOK_ID = B.BOOK_ID;- (가) 4, (나) 3
- (가) 3, (나) 2
- (가) 4, (나) 4
- (가) 4, (나) 2
26. 다음 Oracle 조인 SQL과 항상 같은 결과를 반환하는 ANSI 표준 SQL은? (행의 출력 순서는 고려하지 않는다.)
SELECT M.NAME, L.LOAN_ID FROM MEMBER M, LOAN L WHERE M.MEM_ID = L.MEM_ID(+) AND L.STATUS(+) = '연체';SELECT M.NAME, L.LOAN_ID FROM MEMBER M LEFT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID WHERE L.STATUS = '연체';SELECT M.NAME, L.LOAN_ID FROM MEMBER M LEFT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID AND L.STATUS = '연체';SELECT M.NAME, L.LOAN_ID FROM MEMBER M RIGHT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID AND L.STATUS = '연체';SELECT M.NAME, L.LOAN_ID FROM MEMBER M LEFT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID WHERE L.STATUS = '연체' OR L.STATUS IS NULL;
27. 다음 [LOAN] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle)
[LOAN]
LOAN_ID MEM_ID 1 M1 2 M1 3 M1 4 M1 5 M2 6 M3 7 M3 8 M4 SELECT MEM_ID FROM LOAN GROUP BY MEM_ID HAVING COUNT(*) > (SELECT AVG(COUNT(*)) FROM LOAN GROUP BY MEM_ID);- M1
- M1, M3
- M3
- 집계 함수를 중첩했으므로 오류가 발생한다.
28. 다음 [LOAN] 테이블에 SQL을 실행했을 때 결과 건수는?
[LOAN]
LOAN_ID MEM_ID LOAN_DAY L1 M1 5 L2 M1 9 L3 M2 3 L4 M2 3 L5 M3 7 L6 M1 9 SELECT L.LOAN_ID FROM LOAN L WHERE L.LOAN_DAY = (SELECT MAX(X.LOAN_DAY) FROM LOAN X WHERE X.MEM_ID = L.MEM_ID);- 3건
- 4건
- 5건
- 6건
29. 다음 세 테이블에 SQL을 실행했을 때 결과 건수는? (Oracle)
[LOAN]
MEM_ID M1 M1 M2 [RESERVE]
MEM_ID M2 M3 M4 [BLACKLIST]
MEM_ID M4 SELECT MEM_ID FROM LOAN UNION ALL SELECT MEM_ID FROM RESERVE MINUS SELECT MEM_ID FROM BLACKLIST;- 5건
- 3건
- 4건
- 6건
30. LOAN(대출)과 RESERVE(예약) 테이블에는 모두 MEM_ID 컬럼이 있고 NULL은 없으며, 한 회원이 여러 건을 대출·예약할 수 있다. '대출과 예약을 모두 한 적이 있는 회원'을 구할 때, 다음 중 결과 집합이 나머지 셋과 다를 수 있는 SQL은?
SELECT MEM_ID FROM LOAN INTERSECT SELECT MEM_ID FROM RESERVE;SELECT DISTINCT L.MEM_ID FROM LOAN L WHERE EXISTS (SELECT 1 FROM RESERVE R WHERE R.MEM_ID = L.MEM_ID);SELECT DISTINCT MEM_ID FROM LOAN WHERE MEM_ID IN (SELECT MEM_ID FROM RESERVE);SELECT L.MEM_ID FROM LOAN L, RESERVE R WHERE L.MEM_ID = R.MEM_ID;
31. 다음 [LOAN_STAT] 테이블에 SQL을 실행한 결과로 옳은 것은? ((BRANCH, CATEGORY, S) 형식으로 표기하며 행 순서는 고려하지 않는다.)
[LOAN_STAT]
BRANCH CATEGORY CNT 본관 IT 10 본관 문학 20 분관 IT 5 분관 아동 15 SELECT BRANCH, CATEGORY, SUM(CNT) AS S FROM LOAN_STAT GROUP BY CUBE(BRANCH, CATEGORY) HAVING GROUPING(BRANCH) = 1;- (NULL, IT, 15), (NULL, 문학, 20), (NULL, 아동, 15)
- (본관, NULL, 30), (분관, NULL, 20), (NULL, NULL, 50)
- (NULL, IT, 15), (NULL, 문학, 20), (NULL, 아동, 15), (NULL, NULL, 50)
- (NULL, IT, 10), (NULL, 문학, 20), (NULL, 아동, 15), (NULL, NULL, 50)
32. 다음 [BOOK] 테이블에 SQL을 실행했을 때, 결과에서 CATEGORY가 NULL로 표시되는 행에 대한 설명으로 옳은 것은? ((G, CNT) 형식으로 표기)
[BOOK]
BOOK_ID CATEGORY B1 IT B2 IT B3 NULL B4 문학 SELECT CATEGORY, GROUPING(CATEGORY) AS G, COUNT(*) AS CNT FROM BOOK GROUP BY ROLLUP(CATEGORY);- 2행이며 각각 (0, 1), (1, 4)이다.
- 1행이며 (1, 4)이다.
- 1행이며 (1, 3)이다.
- 2행이며 각각 (1, 1), (1, 4)이다.
33. 다음 [LOAN] 테이블에 SQL을 실행했을 때 REMAIN 값을 출력 순서대로 나열한 것으로 옳은 것은?
[LOAN]
MEM_ID LOAN_DAY QTY M1 1 2 M1 3 1 M1 5 3 M2 2 4 M2 4 1 SELECT MEM_ID, LOAN_DAY, SUM(QTY) OVER (PARTITION BY MEM_ID ORDER BY LOAN_DAY ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS REMAIN FROM LOAN ORDER BY MEM_ID, LOAN_DAY;- 2, 3, 6, 4, 5
- 6, 4, 3, 5, 1
- 6, 6, 6, 5, 5
- 3, 4, 6, 1, 5
34. 회원별로 다음 대출까지의 간격(GAP)을 구한 뒤 집계하는 SQL이다. 실행 결과로 옳은 것은? (C, S 순서)
[LOAN]
MEM_ID LOAN_DAY M1 1 M1 4 M1 10 M2 2 M2 3 SELECT COUNT(GAP) AS C, SUM(GAP) AS S FROM (SELECT MEM_ID, LEAD(LOAN_DAY) OVER (PARTITION BY MEM_ID ORDER BY LOAN_DAY) - LOAN_DAY AS GAP FROM LOAN);- 5, 10
- 3, 9
- 4, 10
- 3, 10
35. 다음 [BOOK_STAT] 테이블에 SQL을 실행했을 때, TITLE이 'E'와 'F'인 행의 (R1, R2) 값으로 옳은 것은?
[BOOK_STAT]
TITLE CATEGORY LOAN_CNT A IT 30 B IT 25 C IT 25 D LIT 40 E LIT 25 F LIT 10 SELECT TITLE, DENSE_RANK() OVER (PARTITION BY CATEGORY ORDER BY LOAN_CNT DESC) AS R1, RANK() OVER (ORDER BY LOAN_CNT DESC) AS R2 FROM BOOK_STAT;- E: (2, 3), F: (3, 6)
- E: (2, 3), F: (3, 4)
- E: (2, 5), F: (3, 6)
- E: (3, 3), F: (3, 6)
36. 다음 [BOOK_STAT] 테이블에 SQL을 실행했을 때 결과 건수는? (Oracle 12c 이상)
[BOOK_STAT]
TITLE LOAN_CNT 가 50 나 40 다 40 라 40 마 30 SELECT TITLE, LOAN_CNT FROM BOOK_STAT ORDER BY LOAN_CNT DESC FETCH FIRST 2 ROWS WITH TIES;- 2건
- 3건
- 5건
- 4건
37. 다음 [BOOK] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, 테이블의 행은 표에 나온 순서대로 읽힌다고 가정한다.)
[BOOK]
BOOK_ID CATEGORY B1 IT B2 LIT B3 IT B4 ART B5 IT B6 LIT SELECT CATEGORY, COUNT(*) AS CNT FROM BOOK WHERE ROWNUM <= 4 GROUP BY CATEGORY;- IT 2, LIT 1, ART 1 (3행)
- IT 3, LIT 2, ART 1 (3행)
- IT 3, LIT 1 (2행)
- ROWNUM과 GROUP BY를 함께 사용할 수 없어 오류가 발생한다.
38. 다음 [CATEGORY] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, 출력 순서대로 표기)
[CATEGORY]
ID NAME PID 1 전체 NULL 2 인문 1 3 과학 1 4 철학 2 5 문학 2 6 물리 3 7 기술 1 SELECT NAME FROM CATEGORY START WITH PID IS NULL CONNECT BY PRIOR ID = PID AND LEVEL <= 2 ORDER SIBLINGS BY ID DESC;- 전체, 인문, 과학, 기술
- 전체, 기술, 과학, 물리, 인문, 문학, 철학
- 전체, 기술, 과학, 인문
- 기술, 과학, 인문, 전체
39. 다음 [CATEGORY] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준)
[CATEGORY]
ID NAME PID 1 전체 NULL 2 인문 1 3 과학 1 4 철학 2 5 문학 2 6 물리 3 7 기술 1 SELECT SYS_CONNECT_BY_PATH(NAME, '/') AS PATH FROM CATEGORY WHERE CONNECT_BY_ISLEAF = 1 START WITH NAME = '물리' CONNECT BY ID = PRIOR PID;- /전체/과학/물리
- /물리/과학/전체
- /물리
- /과학/전체
40. 다음 SQL을 실행했을 때 결과 집합의 컬럼 목록으로 옳은 것은? (Oracle 기준, LOAN_STAT 테이블의 컬럼은 CATEGORY, BRANCH, CNT이다.)
SELECT * FROM (SELECT CATEGORY, BRANCH, CNT FROM LOAN_STAT) PIVOT (SUM(CNT) AS S, COUNT(*) AS C FOR BRANCH IN ('본관' AS MAIN, '분관' AS SUB));- CATEGORY, MAIN_S, MAIN_C, SUB_S, SUB_C
- CATEGORY, S_MAIN, C_MAIN, S_SUB, C_SUB
- CATEGORY, MAIN, SUB
- CATEGORY, BRANCH, S, C
41. 다음 [MEMBER] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은? (Oracle 기준)
[MEMBER]
MEM_ID LIB01 LIB001 LIB0001 lib01 LIB1 -- (가) SELECT COUNT(*) FROM MEMBER WHERE REGEXP_LIKE(MEM_ID, '^LIB[0-9]{2,3}$'); -- (나) SELECT COUNT(*) FROM MEMBER WHERE REGEXP_LIKE(MEM_ID, '^LIB[0-9]{2,3}$', 'i');- (가) 3, (나) 4
- (가) 2, (나) 4
- (가) 3, (나) 3
- (가) 2, (나) 3
42. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, A / B 순서)
SELECT REGEXP_SUBSTR('SQL,,DB,AI', '[^,]+', 1, 3) AS A, REGEXP_COUNT('SQL,,DB,AI', '[^,]+') AS B FROM DUAL;- 'DB' / 4
- 'AI' / 3
- NULL / 3
- 'DB' / 3
43. 다음 [MEMBER] 테이블에 아래 UPDATE 문을 실행한 뒤
SELECT SUM(LOAN_CNT), SUM(PREV_CNT) FROM MEMBER;를 실행한 결과로 옳은 것은? (Oracle)[MEMBER]
MEM_ID LOAN_CNT PREV_CNT M1 3 0 M2 5 0 M3 NULL 0 UPDATE MEMBER SET LOAN_CNT = LOAN_CNT + 1, PREV_CNT = LOAN_CNT;- 10, 8
- 10, 10
- 11, 8
- 11, 11
44. 다음 두 테이블에 아래 UPDATE 문을 실행한 뒤
SELECT SUM(PRICE) FROM BOOK;을 실행한 결과로 옳은 것은?[BOOK]
BOOK_ID PRICE B1 10000 B2 20000 B3 30000 B4 NULL [LOAN]
LOAN_ID BOOK_ID 1 B1 2 B1 3 B2 4 B3 5 B3 6 B3 7 B4 8 B4 UPDATE BOOK SET PRICE = PRICE * 1.1 WHERE BOOK_ID IN (SELECT BOOK_ID FROM LOAN GROUP BY BOOK_ID HAVING COUNT(*) >= 2);- 66000
- 60000
- 64000
- NULL
45. 다음 상황에서 TX1이 겪은 동시성 현상으로 가장 적절한 것은?
TX1이 도서 B10의 대출상태를 조회하여 '대출가능'을 확인하였다. 그 사이 TX2가 B10의 대출상태를 '대출중'으로 UPDATE하고 COMMIT하였다. TX1이 같은 트랜잭션 안에서 B10의 대출상태를 다시 조회하자 '대출중'이 조회되었다.
- Dirty Read
- Non-Repeatable Read
- Phantom Read
- Deadlock
46. RESERVE 테이블에는 (RSV_ID, ST) = (1, '대기'), (2, '대기') 두 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행한 뒤 마지막 SELECT의 결과는?
UPDATE reserve SET st = '완료' WHERE rsv_id = 1; SAVEPOINT sp1; DELETE FROM reserve WHERE rsv_id = 2; ROLLBACK TO sp1; INSERT INTO reserve VALUES (3, '대기'); COMMIT; UPDATE reserve SET st = '취소'; ROLLBACK; SELECT COUNT(*) FROM reserve WHERE st = '대기';- 0
- 1
- 3
- 2
47. VIEW, INDEX, SEQUENCE에 대한 설명으로 적절하지 않은 것은?
- Oracle에서 뷰의 SELECT 정의를 바꾸려면
ALTER VIEW 뷰명 AS SELECT ...문으로 정의를 수정한다. - 뷰는 데이터를 직접 저장하지 않는 가상 테이블로, 필요한 컬럼만 보여 주어 보안성을 높일 수 있다.
- 인덱스를 생성하면 조회는 빨라질 수 있지만 INSERT·UPDATE·DELETE 시 인덱스도 함께 갱신되어 부하가 생긴다.
- Oracle은 SEQUENCE 객체로 순번을 생성하고, SQL Server는 주로 컬럼의 IDENTITY 속성을 사용한다.
- Oracle에서 뷰의 SELECT 정의를 바꾸려면
48. Oracle에서 다음과 같이 테이블을 생성하고 INSERT 문 6개를 순서대로 실행했다. 오류가 발생한 문장은 무시하고 진행했을 때 BOOK2 테이블의 최종 행 수는?
CREATE TABLE book2 ( id NUMBER PRIMARY KEY, price NUMBER CHECK (price >= 0), cat VARCHAR2(5) CHECK (cat IN ('IT', 'LIT')) ); INSERT INTO book2 VALUES (1, 100, 'IT'); -- ① INSERT INTO book2 VALUES (2, NULL, 'LIT'); -- ② INSERT INTO book2 VALUES (3, -1, 'IT'); -- ③ INSERT INTO book2 VALUES (4, 50, NULL); -- ④ INSERT INTO book2 VALUES (1, 10, 'IT'); -- ⑤ INSERT INTO book2 VALUES (5, 0, 'it'); -- ⑥- 2건
- 4건
- 3건
- 5건
49. LIB 사용자가 소유한 LOAN 테이블(LOAN_ID, MEM_ID, DUE_DT, FEE)에 대해 아래와 같이 권한을 부여했다. 이후 KIM이 실행한 문장 중 오류가 발생하는 것은? (Oracle, KIM은 이 외에 다른 권한이 없다.)
-- LIB 실행 GRANT SELECT ON lib.loan TO kim; GRANT UPDATE (due_dt) ON lib.loan TO kim;SELECT * FROM lib.loan;UPDATE lib.loan SET due_dt = due_dt + 7 WHERE loan_id = 1;SELECT COUNT(*) FROM lib.loan WHERE fee > 0;UPDATE lib.loan SET fee = 0 WHERE loan_id = 1;
50. LIB 사용자가 아래 문장을 순서대로 실행했다. 실행 후 LEE와 PARK가 LIB.BOOK 테이블에 대해 가진 권한으로 옳은 것은? (Oracle, LEE와 PARK는 이 문장들 외에 다른 권한이 없다.)
CREATE ROLE librarian; GRANT SELECT, INSERT ON lib.book TO librarian; GRANT librarian TO lee, park; GRANT INSERT ON lib.book TO park; REVOKE INSERT ON lib.book FROM librarian;- LEE: SELECT, INSERT / PARK: SELECT, INSERT
- LEE: SELECT / PARK: SELECT, INSERT
- LEE: SELECT / PARK: SELECT
- LEE: 권한 없음 / PARK: INSERT
AI가 SQLD 출제 범위를 바탕으로 새로 만든 예상 문제이며, 실제 기출문제가 아닙니다.