SQLD 모의고사 14회

50문항 · 제한 시간 90분. 다 풀면 과목별 점수와 합격 여부, 문제마다 해설을 보여 줘요.

  1. 1. 도서관 시스템의 데이터 모델링을 진행하면서 데이터 모델링의 세 가지 관점과 그 분석 방법을 정리하였다. 다음 중 가장 적절하지 않은 것은?

    1. 데이터 관점은 업무가 어떤 데이터와 관련이 있는지, 데이터 간의 관계는 무엇인지를 정적·구조적으로 분석한다.
    2. 프로세스 관점은 '도서 대출', '반납', '예약' 등 업무가 실제로 무엇을 하는지를 시나리오 분석·동적 분석으로 살펴본다.
    3. 상관 관점은 업무 처리 방법에 따라 데이터가 어떤 영향을 받는지를 살펴보며, 주로 정규화를 통해 분석한다.
    4. '대출 처리' 업무가 대출 엔터티를 생성(C)하고 도서 엔터티의 대출상태를 수정(U)한다는 것을 표로 정리하는 것은 상관 관점의 분석이다.
  2. 2. 도서관 시스템의 엔터티 이름을 검토하는 회의에서 다음 의견이 나왔다. 엔터티 명명 규칙에 가장 부합하는 의견은?

    1. 회원과 도서를 연결해 생기는 엔터티를 '회원도서'라고 부르기보다, 업무에서 생성되는 의미를 살려 '대출'로 명명한다.
    2. 도서 엔터티에는 여러 권의 도서 정보가 담기므로 '도서들'처럼 복수형 명사로 명명한다.
    3. 이름이 길면 불편하므로 '도서예약이력'은 'BK_RSV_HST'처럼 약어 위주로 명명한다.
    4. 열람실 좌석 예약과 도서 예약은 업무 성격이 비슷하므로 두 엔터티 모두 '예약'이라는 같은 이름을 사용한다.
  3. 3. 엔터티, 인스턴스, 속성, 속성값의 관계에 대한 설명으로 가장 적절하지 않은 것은?

    1. 하나의 엔터티는 두 개 이상의 인스턴스 집합이어야 한다.
    2. 하나의 엔터티는 두 개 이상의 속성을 갖는다.
    3. 하나의 속성은 하나의 인스턴스에서 하나의 속성값만 가진다.
    4. 도서 엔터티의 '저자' 속성에 공저자 여러 명을 'kim, lee, park'처럼 한 값으로 저장하는 것은 단일 속성이므로 바람직한 설계다.
  4. 4. 도서관 업무에서 다음 관계를 도출하였다.

    • (가) 사서는 하나의 자료실에 소속된다.
    • (나) 회원은 도서를 대출한다.
    • (다) 회원은 도서를 예약한다.
    • (라) 도서는 하나의 분류(주제)에 속한다.

    관계를 존재에 의한 관계와 행위에 의한 관계로 분류한 것으로 가장 적절한 것은?

    1. 존재: (가), (나) / 행위: (다), (라)
    2. 존재: (가), (라) / 행위: (나), (다)
    3. 존재: (나), (다) / 행위: (가), (라)
    4. 존재: (가) / 행위: (나), (다), (라)
  5. 5. 도서관은 같은 책(같은 ISBN)을 여러 권 소장하며, 대출은 책 한 권(소장본) 단위로 관리한다. 각 소장본에는 입수할 때 도서관이 고유한 등록번호를 부여해 바코드로 붙이고, 대출·반납 업무에서는 이 바코드를 찍는다.

    소장도서 엔터티의 주식별자로 가장 적절한 것은?

    1. 도서명
    2. 등록번호
    3. ISBN
    4. 도서명 + 저자명
  6. 6. 다음 대출 테이블의 PK는 대출번호이며, 회원명은 회원번호에 의해, 도서명은 도서번호에 의해 결정된다.

    대출번호 회원번호 회원명 도서번호 도서명 대출일자
    1001 M01 한서윤 B10 자료구조 2026-03-02
    1002 M02 오지후 B10 자료구조 2026-03-03
    1003 M01 한서윤 B20 운영체제 2026-03-05

    이 테이블에 대한 설명으로 가장 적절한 것은?

    1. 회원명이 바뀌어도 해당 회원의 대출 행 하나만 수정하면 되므로 갱신 이상은 발생하지 않는다.
    2. PK가 단일 속성이지만 회원명이 회원번호에 종속되므로 부분 함수 종속이 존재하며 제2정규형을 위배한다.
    3. B20 도서의 유일한 대출 행(1003)을 삭제해도 도서명 '운영체제'는 이 테이블에 그대로 남는다.
    4. 회원명과 도서명이 PK가 아닌 일반 속성을 거쳐 PK에 이행적으로 종속되므로, 회원·도서 정보를 별도 테이블로 분리하여 제3정규형으로 만든다.
  7. 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;
    1. 500
    2. 300
    3. 600
    4. 1100
  8. 8. 도서관의 대출 처리는 다음 세 작업으로 구성된다.

    1. 대출 테이블에 대출 1건 INSERT
    2. 도서 테이블의 대출상태를 '대출중'으로 UPDATE
    3. 회원 테이블의 현재대출권수를 1 증가시키는 UPDATE

    이 처리에 대한 설명으로 가장 적절한 것은?

    1. 세 작업은 서로 다른 테이블을 변경하므로 작업마다 별도 트랜잭션으로 나누어 즉시 COMMIT하는 것이 원칙이다.
    2. 1번 INSERT가 성공하고 2번 UPDATE가 실패하면 1번만 COMMIT하고 도서 상태는 야간 배치로 보정하면 된다.
    3. 세 작업을 하나의 트랜잭션으로 묶어 모두 반영되거나 모두 취소되도록 해야 하며, 이는 원자성(Atomicity)과 관련된다.
    4. COMMIT이 완료된 뒤 시스템 장애가 발생하면 대출 INSERT가 취소될 수 있는데, 이는 지속성(Durability) 때문이다.
  9. 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, (나) 1, (다) 2
    2. (가) 2, (나) 1, (다) 3
    3. (가) 1, (나) 0, (다) 2
    4. (가) 2, (나) 0, (다) 3
  10. 10. 대출 엔터티의 본질식별자는 (회원번호, 등록번호, 대출일시)이다. 설계자는 이 대신 시퀀스로 생성하는 대출번호를 PK로 사용하려 한다. 이에 대한 설명으로 가장 적절한 것은?

    1. 대출번호를 PK로 지정하면 같은 (회원번호, 등록번호, 대출일시) 조합이 중복 입력되는 것을 PK 제약이 자동으로 막아 준다.
    2. 조회가 주로 회원번호·등록번호 조건으로 이루어진다면, PK 인덱스와 별도로 이 컬럼들에 대한 인덱스가 추가로 필요해질 수 있다.
    3. 본질식별자는 업무와 무관하게 시스템이 기계적으로 부여하는 값이고, 인조식별자는 업무에 의해 자연스럽게 만들어지는 값이다.
    4. 인조식별자는 관계를 통해 자식 엔터티로 상속될 수 없으므로, 대출번호를 쓰면 자식 엔터티와의 관계를 정의할 수 없다.
  11. 11. BOOK 테이블의 BOOK_ID는 기본키(PK)이고, LOAN 테이블의 BOOK_ID는 BOOK.BOOK_ID를 참조하는 외래키(FK)이다. LOAN.BOOK_ID에는 NOT NULL 제약이 없다. 이에 대한 설명으로 적절하지 않은 것은?

    1. LOAN.BOOK_ID는 외래키이므로 LOAN 테이블 안에서 같은 값이 두 번 이상 나타날 수 없다.
    2. LOAN.BOOK_ID에는 NULL을 입력할 수 있다.
    3. BOOK 테이블에 존재하지 않는 BOOK_ID 값은 LOAN.BOOK_ID에 입력할 수 없다.
    4. BOOK.BOOK_ID에는 NULL을 입력할 수 없고 중복된 값도 입력할 수 없다.
  12. 12. Oracle에서 다음 SQL을 실행했을 때 결과 집합의 컬럼 이름을 순서대로 나열한 것으로 옳은 것은?

    SELECT TITLE       AS book_title,
           PRICE * 1.1 "Price+Tax",
           PUB_YEAR    yr
      FROM BOOK;
    1. book_title, Price+Tax, yr
    2. BOOK_TITLE, PRICE+TAX, YR
    3. BOOK_TITLE, Price+Tax, YR
    4. 특수문자 '+'가 포함된 별칭 때문에 오류가 발생한다.
  13. 13. BOOK 테이블(BOOK_ID, TITLE, CATEGORY, PRICE)에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?

    1. SELECT B.*, PRICE * 2 AS DBL FROM BOOK B;
    2. SELECT TITLE, 'KRW' AS UNIT FROM BOOK;
    3. SELECT ALL CATEGORY FROM BOOK;
    4. SELECT *, PRICE * 2 AS DBL FROM BOOK;
  14. 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;
    1. 13 / '23-' / 16
    2. 13 / '123' / 16
    3. 17 / '123' / 4
    4. 13 / '123' / 4
  15. 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;
    1. 2026-03-06 / 18 / 28
    2. 2026-03-06 / 19 / 28
    3. 2026-03-05 / 18 / 29
    4. 2026-03-04 / 18 / 28
  16. 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;
    1. 1100 / 8 / 4
    2. 1000 / 8 / 3
    3. 1100 / 8 / 3
    4. 1100 / NULL / 3
  17. 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;
    1. (가) 4, (나) 2
    2. (가) 0, (나) 2
    3. (가) 0, (나) 3
    4. (가) 4, (나) 3
  18. 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__%';
    1. (가) 3, (나) 4
    2. (가) 2, (나) 5
    3. (가) 4, (나) 4
    4. (가) 2, (나) 4
  19. 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;
    1. M1(3, 2), M3(3, 1)
    2. M1(3, 2)
    3. M1(3, 2), M2(2, 2), M3(3, 1)
    4. M3(3, 1)
  20. 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;
    1. (2000, 2, 16000)
    2. (2000, 2, 16000), (2010, 2, 18000)
    3. (2000, 2, 16000), (2010, 3, 18000)
    4. (2000, 2, 16000), (2010, 3, 18000), (2020, 2, 13500)
  21. 21. BOOK 테이블(BOOK_ID, TITLE, CATEGORY, PRICE)에 대해 실행할 때 오류가 발생하는 SQL은? (Oracle)

    1. SELECT TITLE FROM BOOK ORDER BY PRICE DESC;
    2. SELECT DISTINCT CATEGORY FROM BOOK ORDER BY PRICE;
    3. SELECT CATEGORY, COUNT(*) AS CNT FROM BOOK GROUP BY CATEGORY ORDER BY CNT DESC;
    4. SELECT TITLE, PRICE FROM BOOK ORDER BY 2 DESC, TITLE;
  22. 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;
    1. L3, L5, L2, L1, L4
    2. L2, L3, L5, L1, L4
    3. L5, L3, L2, L1, L4
    4. L2, L3, L5, L4, L1
  23. 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;
    1. 4건, 1행
    2. 4건, 2행
    3. 5건, 2행
    4. 5건, 3행
  24. 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;
    1. 4
    2. 8
    3. 10
    4. 14
  25. 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;
    1. (가) 4, (나) 3
    2. (가) 3, (나) 2
    3. (가) 4, (나) 4
    4. (가) 4, (나) 2
  26. 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(+) = '연체';
    1. SELECT M.NAME, L.LOAN_ID FROM MEMBER M LEFT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID WHERE L.STATUS = '연체';
    2. SELECT M.NAME, L.LOAN_ID FROM MEMBER M LEFT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID AND L.STATUS = '연체';
    3. SELECT M.NAME, L.LOAN_ID FROM MEMBER M RIGHT OUTER JOIN LOAN L ON M.MEM_ID = L.MEM_ID AND L.STATUS = '연체';
    4. 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. 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);
    1. M1
    2. M1, M3
    3. M3
    4. 집계 함수를 중첩했으므로 오류가 발생한다.
  28. 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);
    1. 3건
    2. 4건
    3. 5건
    4. 6건
  29. 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;
    1. 5건
    2. 3건
    3. 4건
    4. 6건
  30. 30. LOAN(대출)과 RESERVE(예약) 테이블에는 모두 MEM_ID 컬럼이 있고 NULL은 없으며, 한 회원이 여러 건을 대출·예약할 수 있다. '대출과 예약을 모두 한 적이 있는 회원'을 구할 때, 다음 중 결과 집합이 나머지 셋과 다를 수 있는 SQL은?

    1. SELECT MEM_ID FROM LOAN INTERSECT SELECT MEM_ID FROM RESERVE;
    2. SELECT DISTINCT L.MEM_ID FROM LOAN L WHERE EXISTS (SELECT 1 FROM RESERVE R WHERE R.MEM_ID = L.MEM_ID);
    3. SELECT DISTINCT MEM_ID FROM LOAN WHERE MEM_ID IN (SELECT MEM_ID FROM RESERVE);
    4. SELECT L.MEM_ID FROM LOAN L, RESERVE R WHERE L.MEM_ID = R.MEM_ID;
  31. 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;
    1. (NULL, IT, 15), (NULL, 문학, 20), (NULL, 아동, 15)
    2. (본관, NULL, 30), (분관, NULL, 20), (NULL, NULL, 50)
    3. (NULL, IT, 15), (NULL, 문학, 20), (NULL, 아동, 15), (NULL, NULL, 50)
    4. (NULL, IT, 10), (NULL, 문학, 20), (NULL, 아동, 15), (NULL, NULL, 50)
  32. 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);
    1. 2행이며 각각 (0, 1), (1, 4)이다.
    2. 1행이며 (1, 4)이다.
    3. 1행이며 (1, 3)이다.
    4. 2행이며 각각 (1, 1), (1, 4)이다.
  33. 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;
    1. 2, 3, 6, 4, 5
    2. 6, 4, 3, 5, 1
    3. 6, 6, 6, 5, 5
    4. 3, 4, 6, 1, 5
  34. 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);
    1. 5, 10
    2. 3, 9
    3. 4, 10
    4. 3, 10
  35. 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;
    1. E: (2, 3), F: (3, 6)
    2. E: (2, 3), F: (3, 4)
    3. E: (2, 5), F: (3, 6)
    4. E: (3, 3), F: (3, 6)
  36. 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;
    1. 2건
    2. 3건
    3. 5건
    4. 4건
  37. 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;
    1. IT 2, LIT 1, ART 1 (3행)
    2. IT 3, LIT 2, ART 1 (3행)
    3. IT 3, LIT 1 (2행)
    4. ROWNUM과 GROUP BY를 함께 사용할 수 없어 오류가 발생한다.
  38. 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;
    1. 전체, 인문, 과학, 기술
    2. 전체, 기술, 과학, 물리, 인문, 문학, 철학
    3. 전체, 기술, 과학, 인문
    4. 기술, 과학, 인문, 전체
  39. 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;
    1. /전체/과학/물리
    2. /물리/과학/전체
    3. /물리
    4. /과학/전체
  40. 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));
    1. CATEGORY, MAIN_S, MAIN_C, SUB_S, SUB_C
    2. CATEGORY, S_MAIN, C_MAIN, S_SUB, C_SUB
    3. CATEGORY, MAIN, SUB
    4. CATEGORY, BRANCH, S, C
  41. 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');
    1. (가) 3, (나) 4
    2. (가) 2, (나) 4
    3. (가) 3, (나) 3
    4. (가) 2, (나) 3
  42. 42. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, A / B 순서)

    SELECT REGEXP_SUBSTR('SQL,,DB,AI', '[^,]+', 1, 3) AS A,
           REGEXP_COUNT('SQL,,DB,AI', '[^,]+')        AS B
      FROM DUAL;
    1. 'DB' / 4
    2. 'AI' / 3
    3. NULL / 3
    4. 'DB' / 3
  43. 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;
    1. 10, 8
    2. 10, 10
    3. 11, 8
    4. 11, 11
  44. 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);
    1. 66000
    2. 60000
    3. 64000
    4. NULL
  45. 45. 다음 상황에서 TX1이 겪은 동시성 현상으로 가장 적절한 것은?

    TX1이 도서 B10의 대출상태를 조회하여 '대출가능'을 확인하였다. 그 사이 TX2가 B10의 대출상태를 '대출중'으로 UPDATE하고 COMMIT하였다. TX1이 같은 트랜잭션 안에서 B10의 대출상태를 다시 조회하자 '대출중'이 조회되었다.

    1. Dirty Read
    2. Non-Repeatable Read
    3. Phantom Read
    4. Deadlock
  46. 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 = '대기';
    1. 0
    2. 1
    3. 3
    4. 2
  47. 47. VIEW, INDEX, SEQUENCE에 대한 설명으로 적절하지 않은 것은?

    1. Oracle에서 뷰의 SELECT 정의를 바꾸려면 ALTER VIEW 뷰명 AS SELECT ... 문으로 정의를 수정한다.
    2. 뷰는 데이터를 직접 저장하지 않는 가상 테이블로, 필요한 컬럼만 보여 주어 보안성을 높일 수 있다.
    3. 인덱스를 생성하면 조회는 빨라질 수 있지만 INSERT·UPDATE·DELETE 시 인덱스도 함께 갱신되어 부하가 생긴다.
    4. Oracle은 SEQUENCE 객체로 순번을 생성하고, SQL Server는 주로 컬럼의 IDENTITY 속성을 사용한다.
  48. 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');   -- ⑥
    1. 2건
    2. 4건
    3. 3건
    4. 5건
  49. 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;
    1. SELECT * FROM lib.loan;
    2. UPDATE lib.loan SET due_dt = due_dt + 7 WHERE loan_id = 1;
    3. SELECT COUNT(*) FROM lib.loan WHERE fee > 0;
    4. UPDATE lib.loan SET fee = 0 WHERE loan_id = 1;
  50. 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;
    1. LEE: SELECT, INSERT / PARK: SELECT, INSERT
    2. LEE: SELECT / PARK: SELECT, INSERT
    3. LEE: SELECT / PARK: SELECT
    4. LEE: 권한 없음 / PARK: INSERT

AI가 SQLD 출제 범위를 바탕으로 새로 만든 예상 문제이며, 실제 기출문제가 아닙니다.