SQLD 모의고사 18회

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

  1. 1. 호텔 예약 시스템 구축 프로젝트에서 다음 (가)~(다) 작업을 수행하였다. 각 작업이 속하는 데이터 모델링 단계를 바르게 짝지은 것은?

    • (가) 호텔 전사 관점에서 고객, 객실, 예약 등 핵심 엔터티와 그 사이의 관계를 도출하였다.
    • (나) 예약 엔터티의 주식별자와 속성을 확정하고, 이행 종속을 제거하는 정규화를 수행하였다.
    • (다) 투숙 테이블을 체크인 월 기준으로 파티션하고, 자주 조회하는 컬럼에 인덱스를 설계하였다.
    1. (가) 개념적 모델링, (나) 물리적 모델링, (다) 논리적 모델링
    2. (가) 개념적 모델링, (나) 논리적 모델링, (다) 물리적 모델링
    3. (가) 논리적 모델링, (나) 개념적 모델링, (다) 물리적 모델링
    4. (가) 논리적 모델링, (나) 논리적 모델링, (다) 물리적 모델링
  2. 2. 호텔 업무를 분석하여 다음과 같은 엔터티를 도출하였다.

    • 객실: 호텔이 보유한 각 객실(101호, 102호 …)의 유형, 층, 상태 정보
    • 예약: 고객이 특정 객실을 특정 기간 이용하겠다고 신청한 정보
    • 숙박요금정책: 시즌·요일별 요금 산정 규칙
    • 예약변경이력: 예약의 날짜·인원·객실이 바뀔 때마다 해당 예약과 변경을 처리한 직원 정보를 함께 남기는 변경 기록

    엔터티 분류에 대한 설명으로 가장 적절한 것은?

    1. '객실'은 물리적 형태가 있으므로 유형 엔터티이며, 발생 시점상 행위 엔터티에 해당한다.
    2. '예약'은 고객과 객실로부터 발생하지만 업무의 출발점이 되므로 기본 엔터티에 해당한다.
    3. '숙박요금정책'은 물리적 형태가 없으므로 사건 엔터티에 해당한다.
    4. '예약변경이력'은 예약이 바뀔 때마다 발생하여 데이터가 계속 늘어나므로 행위 엔터티에 해당한다.
  3. 3. 호텔의 고객 엔터티에 속성을 정의하는 과정에서 나온 의견 중 가장 적절한 것은?

    1. 한 고객이 '선호 객실유형'을 여러 개 가질 수 있다면 이는 다중값 속성이므로, 별도 엔터티로 분리하는 것이 바람직하다.
    2. '주소'는 시·구·동·상세주소로 나눌 수 있으므로 업무 요건과 관계없이 반드시 하위 속성으로 분해해야 한다.
    3. '고객번호'는 고객의 주식별자이므로 속성이 아니라 엔터티 자체로 분류된다.
    4. 하나의 속성은 한 인스턴스에서 여러 개의 값을 가질 수 있는 것이 원칙이다.
  4. 4. 호텔 데이터 모델의 관계에 대한 설명으로 가장 적절한 것은?

    1. '객실유형'과 '객실'의 관계는 고객이 객실을 예약하는 행위가 있어야 성립하므로 행위에 의한 관계이다.
    2. ERD에서는 존재에 의한 관계는 실선으로, 행위에 의한 관계는 점선으로 구분하여 표기한다.
    3. '고객'과 '예약'의 관계는 고객이 예약을 '하는' 행위가 있어야 연결되므로 행위에 의한 관계에 해당한다.
    4. 두 엔터티 사이에는 하나의 관계만 정의할 수 있으므로, '고객'과 '예약' 사이에 '예약자'와 '투숙자' 관계를 동시에 둘 수 없다.
  5. 5. 호텔 고객 엔터티의 주식별자로 '이메일주소'를 검토하였다. 이메일주소는 고객마다 서로 다르고 거의 바뀌지 않는다. 그러나 프런트 데스크에서 바로 투숙하는 워크인(Walk-in) 고객 중에는 이메일주소를 알려주지 않는 경우가 있어 주식별자로 부적합하다는 의견이 나왔다.

    이 의견의 근거가 되는 주식별자의 특징은?

    1. 유일성
    2. 존재성
    3. 최소성
    4. 불변성
  6. 6. 다음 객실 테이블의 PK는 객실번호이며, 업무 규칙상 유형명과 기본요금은 객실유형코드에 의해 결정된다.

    객실번호 층 객실유형코드 유형명 기본요금
    101 1 STD 스탠다드 100000
    102 1 STD 스탠다드 100000
    201 2 DLX 디럭스 180000
    202 2 DLX 디럭스 180000

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

    1. 객실번호 → 객실유형코드 → 기본요금으로 이어지는 이행적 함수 종속이 존재한다.
    2. DLX의 기본요금을 변경할 때 201호 행만 수정하면 같은 유형의 요금이 서로 달라지는 갱신 이상이 생길 수 있다.
    3. 아직 객실이 배정되지 않은 새 유형 'STE'의 유형명과 기본요금을 등록할 수 없는 것은 삽입 이상에 해당한다.
    4. PK가 단일 속성이어서 부분 함수 종속이 없으므로 이 테이블은 이미 제3정규형을 만족한다.
  7. 7. 객실과 편의시설은 M:N 관계이며, 교차 엔터티 ROOM_AMENITY로 해소하였다. 데이터가 다음과 같을 때 SQL의 실행 결과로 옳은 것은? (ROOM_NO : CNT 형식, ROOM_NO 순)

    [ROOM]

    ROOM_NO
    101
    102
    201
    301

    [AMENITY]

    AMN_CD AMN_NM
    A1 욕조
    A2 미니바
    A3 테라스

    [ROOM_AMENITY]

    ROOM_NO AMN_CD
    201 A1
    201 A2
    301 A1
    301 A2
    301 A3
    101 A2
    SELECT R.ROOM_NO, COUNT(A.AMN_NM) AS CNT
      FROM ROOM R
      LEFT OUTER JOIN ROOM_AMENITY RA
        ON R.ROOM_NO = RA.ROOM_NO
      LEFT OUTER JOIN AMENITY A
        ON RA.AMN_CD = A.AMN_CD
       AND A.AMN_NM <> '미니바'
     GROUP BY R.ROOM_NO
     ORDER BY R.ROOM_NO;
    1. 101 : 0, 102 : 0, 201 : 1, 301 : 2
    2. 101 : 1, 102 : 0, 201 : 2, 301 : 3
    3. 201 : 1, 301 : 2
    4. 101 : 1, 102 : 1, 201 : 1, 301 : 2
  8. 8. 호텔 예약 모델이 IE 표기법으로 다음과 같이 작성되어 있다. (|는 필수, o는 선택, {는 여러 건을 의미한다.)

    이 모델을 근거로 트랜잭션을 설계할 때 가장 적절한 것은?

    고객 ||--o{ 예약     : 신청한다
    예약 ||--|{ 예약객실 : 포함한다
    객실 ||--o{ 예약객실 : 배정된다
    1. 신규 고객 등록과 그 고객의 첫 예약 등록은 반드시 하나의 트랜잭션으로 묶어야 한다.
    2. 객실을 새로 등록할 때는 해당 객실의 예약객실 행도 함께 등록해야 하므로 하나의 트랜잭션으로 묶어야 한다.
    3. 예약 등록과 그 예약에 포함되는 예약객실 등록은 하나의 트랜잭션으로 묶어 함께 COMMIT하거나 함께 ROLLBACK해야 한다.
    4. 예약을 먼저 INSERT하고 COMMIT한 뒤, 예약객실은 다음 트랜잭션에서 등록해도 모델과 일치한다.
  9. 9. GUEST_NOTE 테이블에 다음과 같이 4건을 입력하였다. 3번 행은 INSERT 시 MEMO에 ''(빈 문자열)을, 4번 행은 ' '(공백 한 칸)을 입력하였다. SQL의 실행 결과로 옳은 것은? (Oracle 기준, 결과는 C1 / C2 / C3 순서)

    ID MEMO (VARCHAR2)
    1 'VIP'
    2 NULL
    3 ''
    4 ' '
    SELECT COUNT(MEMO)            AS C1,
           COUNT(*) - COUNT(MEMO) AS C2,
           SUM(LENGTH(MEMO))      AS C3
      FROM GUEST_NOTE;
    1. 3 / 1 / 4
    2. 3 / 1 / NULL
    3. 2 / 2 / 3
    4. 2 / 2 / 4
  10. 10. 호텔의 투숙 엔터티는 업무 규칙상 같은 객실에 같은 날짜로 체크인하는 투숙은 하나뿐이며, 하위 엔터티 투숙부가서비스가 투숙의 주식별자를 상속받는다. 주식별자로 다음 두 안을 검토 중이다.

    • (A) 본질식별자: 객실번호 + 체크인일자
    • (B) 인조식별자: 시퀀스로 생성한 투숙ID

    두 안에 대한 설명으로 가장 적절한 것은?

    1. (B)를 PK로 사용하면 PK 인덱스만으로 '객실번호 + 체크인일자' 조건의 조회를 효율적으로 처리할 수 있다.
    2. (A)를 사용하면 투숙부가서비스의 PK가 (객실번호, 체크인일자, 순번)처럼 길어져 조인 조건과 SQL이 복잡해질 수 있다.
    3. 인조식별자는 업무적 의미가 없으므로 어떤 경우에도 주식별자로 사용해서는 안 된다.
    4. (A)를 사용하면 같은 객실·같은 체크인일자의 중복 투숙을 막기 위해 별도의 UNIQUE 제약을 추가해야 한다.
  11. 11. 호텔 DB에서 ROOM(PK: ROOM_NO), GUEST(PK: GID), STAY(PK: STAY_ID) 테이블을 설계하였다. STAY.ROOM_NO는 ROOM.ROOM_NO를, STAY.GID는 GUEST.GID를 참조하는 외래키이며 둘 다 NOT NULL 제약은 없다. 기본키와 외래키에 대한 설명으로 가장 적절한 것은?

    1. STAY.ROOM_NO에는 ROOM에 존재하는 객실번호 또는 NULL만 저장할 수 있으며, 같은 객실번호가 여러 행에 중복 저장될 수 있다.
    2. 한 테이블에는 외래키를 하나만 정의할 수 있으므로 STAY에 두 개의 외래키를 둘 수 없다.
    3. 기본키는 개체 무결성을, 외래키는 도메인 무결성을 보장하기 위한 제약이다.
    4. STAY의 기본키를 (STAY_ID, ROOM_NO)로 바꾸면 ROOM_NO 값은 NULL이 허용된다.
  12. 12. 다음 [ROOM_RATE] 테이블에 SQL을 실행했을 때 결과 행 수는?

    [ROOM_RATE]

    ROOM_NO BASE EXTRA
    101 100 NULL
    102 100 0
    201 150 20
    202 150 20
    301 200 NULL
    SELECT DISTINCT BASE + EXTRA AS TOT
      FROM ROOM_RATE;
    1. 1
    2. 2
    3. 3
    4. 4
  13. 13. SELECT 문에 대한 설명으로 가장 적절한 것은? (Oracle 19c 기준)

    1. DISTINCT는 SELECT 목록의 첫 번째 컬럼에만 적용되고, 나머지 컬럼은 중복 제거 대상이 아니다.
    2. ALL은 기본값이므로 생략하면 중복 행을 포함한 모든 행이 출력된다.
    3. SELECT 1 + 1;처럼 FROM 절 없이도 실행할 수 있다.
    4. 컬럼 별칭에 공백을 포함하려면 작은따옴표로 감싸야 한다. 예: SELECT ROOM_NO AS '객실 번호' FROM ROOM;
  14. 14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C / D 순서)

    SELECT SUBSTR(C, INSTR(C, '-') + 1, 4) AS A,
           LENGTH(REPLACE(C, '-'))          AS B,
           INITCAP(SUBSTR(C, -3))           AS C,
           LTRIM(SUBSTR(C, 7, 4), '0')      AS D
      FROM (SELECT 'busan-0712-std' AS C FROM DUAL);
    1. 0712 / 14 / STD / 712
    2. -071 / 12 / Std / 0712
    3. 0712 / 12 / std / 712
    4. 0712 / 12 / Std / 712
  15. 15. 체크인이 2025-02-27, 체크아웃이 2025-03-02인 투숙에 대해 다음 SQL을 실행했다. 결과로 옳은 것은? (Oracle, 결과는 A / B / C / D 순서)

    SELECT DATE '2025-03-02' - DATE '2025-02-27'              AS A,
           TO_CHAR(LAST_DAY(DATE '2025-02-27'), 'DD')         AS B,
           TO_CHAR(ADD_MONTHS(DATE '2025-03-02', -1), 'MM-DD') AS C,
           TO_CHAR(DATE '2025-02-27' + 30/24, 'MM-DD HH24')   AS D
      FROM DUAL;
    1. 3 / 28 / 02-02 / 02-28 06
    2. 4 / 28 / 02-02 / 02-28 06
    3. 3 / 29 / 02-02 / 02-28 06
    4. 3 / 28 / 02-02 / 03-29 00
  16. 16. 다음 [STAY] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, 결과는 P1 / P2 / P3 순서)

    [STAY]

    ID NIGHTS GRADE
    1 1 VIP
    2 3 GOLD
    3 5 NULL
    4 2 GOLD
    5 7 VIP
    SELECT SUM(CASE GRADE WHEN 'VIP'  THEN NIGHTS * 2
                          WHEN 'GOLD' THEN NIGHTS
               END)                    AS P1,
           COUNT(DECODE(GRADE, 'GOLD', 1)) AS P2,
           SUM(NVL2(GRADE, 0, NIGHTS))     AS P3
      FROM STAY;
    1. 26 / 2 / 5
    2. 21 / 5 / 5
    3. 21 / 2 / 5
    4. 21 / 2 / 0
  17. 17. 다음 [GUEST] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과로 옳은 것은?

    [GUEST]

    NAME
    김민수
    김수
    이김수
    김
    민김
    -- (가)
    SELECT COUNT(*) FROM GUEST WHERE NAME LIKE '김_%';
    
    -- (나)
    SELECT COUNT(*) FROM GUEST WHERE NAME LIKE '%김%';
    
    -- (다)
    SELECT COUNT(*) FROM GUEST WHERE NAME LIKE '_김%';
    1. (가) 3, (나) 5, (다) 2
    2. (가) 2, (나) 4, (다) 2
    3. (가) 2, (나) 5, (다) 1
    4. (가) 2, (나) 5, (다) 2
  18. 18. 다음 [MEMBER] 테이블에 SQL을 실행했을 때 결과 값은?

    [MEMBER]

    ID GRADE POINT
    1 VIP 500
    2 GOLD NULL
    3 NULL 300
    4 SILVER 100
    5 SILVER NULL
    6 NULL NULL
    SELECT COUNT(*)
      FROM MEMBER
     WHERE GRADE NOT IN ('VIP', 'GOLD')
        OR POINT < 200;
    1. 1
    2. 2
    3. 3
    4. 4
  19. 19. 다음 [STAY] 테이블에 SQL을 실행한 결과로 옳은 것은?

    [STAY]

    RTYPE NIGHTS AMT
    STD 1 100
    STD 3 300
    DLX 2 400
    DLX 1 200
    STE 4 1200
    STD 2 NULL
    SELECT RTYPE, SUM(AMT) AS TOT
      FROM STAY
     GROUP BY RTYPE
    HAVING AVG(NIGHTS) >= 2
       AND COUNT(AMT) >= 2;
    1. STD 400
    2. STD 400, STE 1200
    3. STD 400, DLX 600
    4. 결과 없음
  20. 20. 다음 [PAY] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 행 수로 옳은 것은?

    [PAY]

    HOTEL AMT
    서울 100
    서울 300
    부산 200
    부산 400
    제주 50
    제주 NULL
    -- (가)
    SELECT HOTEL, COUNT(*)
      FROM PAY
     WHERE AMT >= 200
     GROUP BY HOTEL;
    
    -- (나)
    SELECT HOTEL, COUNT(*)
      FROM PAY
     GROUP BY HOTEL
    HAVING MIN(AMT) >= 200;
    1. (가) 3행, (나) 1행
    2. (가) 2행, (나) 2행
    3. (가) 2행, (나) 1행
    4. (가) 3행, (나) 2행
  21. 21. 다음 [ROOM] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle)

    [ROOM]

    ROOM_NO FLOOR PRICE
    101 1 100
    102 1 NULL
    201 2 150
    202 2 150
    301 3 NULL
    SELECT ROOM_NO
      FROM ROOM
     ORDER BY PRICE DESC, FLOOR DESC, ROOM_NO;
    1. 201, 202, 101, 301, 102
    2. 102, 301, 202, 201, 101
    3. 101, 201, 202, 102, 301
    4. 301, 102, 201, 202, 101
  22. 22. ORDER BY 절에 대한 설명으로 가장 적절한 것은? (Oracle 기준)

    1. 하나의 ORDER BY 절에서 컬럼명, SELECT 절의 컬럼 별칭, SELECT 목록의 위치 번호를 섞어서 사용할 수 있다.
    2. GROUP BY를 사용한 SELECT 문에서도 GROUP BY에 없는 컬럼을 집계 함수 없이 ORDER BY에 사용할 수 있다.
    3. ORDER BY 절은 논리적 실행 순서상 SELECT 절보다 먼저 수행되므로 SELECT 절의 별칭을 사용할 수 없다.
    4. 정렬 방향을 지정하지 않으면 기본값은 DESC이다.
  23. 23. 호텔은 월(MON) 기준으로 시즌을 관리한다. 다음 [SEASON], [RESV] 테이블에 SQL을 실행했을 때 결과 값은?

    [SEASON]

    S_NAME FROM_M TO_M
    비수기 1 5
    성수기 5 8
    연말 12 12

    [RESV]

    RID MON
    R1 3
    R2 5
    R3 7
    R4 10
    R5 12
    SELECT COUNT(*)
      FROM RESV R, SEASON S
     WHERE R.MON BETWEEN S.FROM_M AND S.TO_M;
    1. 4
    2. 5
    3. 6
    4. 7
  24. 24. 법인 고객은 객실유형별 할인율을 적용받는다. 다음 [GUEST], [CORP_RATE] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 COUNT(*) / SUM(R.DC) 순서)

    [GUEST]

    GID CORP_CD
    G1 C1
    G2 C1
    G3 NULL
    G4 C2

    [CORP_RATE]

    CORP_CD RTYPE DC
    C1 STD 10
    C1 DLX 15
    C2 STD 5
    NULL STD 0
    SELECT COUNT(*), SUM(R.DC)
      FROM GUEST G, CORP_RATE R
     WHERE G.CORP_CD = R.CORP_CD;
    1. 6 / 55
    2. 3 / 30
    3. 5 / 55
    4. 5 / 30
  25. 25. 다음 [ROOM], [STAY], [GUEST] 테이블에 SQL을 실행한 결과로 옳은 것은? (ROOM_NO, NAME 순서로 표기하며 행 순서는 고려하지 않는다)

    [ROOM]

    ROOM_NO RTYPE
    101 STD
    102 DLX
    201 STE
    202 STD

    [STAY]

    SID ROOM_NO GID
    S1 101 G1
    S2 101 G2
    S3 201 G9

    [GUEST]

    GID NAME
    G1 김
    G2 이
    G3 박
    SELECT R.ROOM_NO, G.NAME
      FROM ROOM R
      LEFT OUTER JOIN STAY S
        ON R.ROOM_NO = S.ROOM_NO
     INNER JOIN GUEST G
        ON S.GID = G.GID;
    1. (101, 김), (101, 이), (102, NULL), (201, NULL), (202, NULL)
    2. (101, 김), (101, 이), (201, NULL)
    3. (101, 김), (101, 이), (102, NULL), (202, NULL)
    4. (101, 김), (101, 이)
  26. 26. 객실 업그레이드는 현재 등급보다 1~2단계 높은 유형으로만 가능하다. 다음 [ROOM_TYPE] 테이블에 SQL을 실행한 결과로 옳은 것은? (RTYPE : CNT 형식, 출력 순서대로)

    [ROOM_TYPE]

    RTYPE GRADE
    STD 1
    SUP 2
    DLX 3
    STE 4
    SELECT A.RTYPE, COUNT(B.RTYPE) AS CNT
      FROM ROOM_TYPE A
      LEFT OUTER JOIN ROOM_TYPE B
        ON B.GRADE BETWEEN A.GRADE + 1 AND A.GRADE + 2
     GROUP BY A.RTYPE, A.GRADE
     ORDER BY A.GRADE;
    1. STD : 2, SUP : 2, DLX : 1, STE : 0
    2. STD : 2, SUP : 2, DLX : 1
    3. STD : 3, SUP : 2, DLX : 1, STE : 0
    4. STD : 2, SUP : 2, DLX : 1, STE : 1
  27. 27. 다음 [GUEST], [RESV] 테이블에 SQL을 실행한 결과로 옳은 것은?

    [GUEST]

    GID NAME
    G1 김
    G2 이
    G3 박

    [RESV]

    RID GID STATUS
    R1 G1 취소
    R2 G2 확정
    SELECT G.NAME
      FROM GUEST G
     WHERE EXISTS (SELECT 1
                     FROM RESV R
                    WHERE R.STATUS = '확정');
    1. 이
    2. 김, 이, 박
    3. 김, 이
    4. 결과 없음
  28. 28. 다음 [ROOM] 테이블에 대해 실행했을 때 오류가 발생하는 SQL은? (Oracle 기준)

    [ROOM]

    ROOM_NO RTYPE PRICE
    101 STD 100
    102 STD 120
    201 DLX 200
    301 STE 400
    1. SELECT ROOM_NO FROM ROOM WHERE PRICE > (SELECT AVG(PRICE) FROM ROOM);
    2. SELECT ROOM_NO FROM ROOM WHERE PRICE IN (SELECT MAX(PRICE) FROM ROOM GROUP BY RTYPE);
    3. SELECT ROOM_NO FROM ROOM WHERE PRICE = (SELECT MIN(PRICE) FROM ROOM GROUP BY RTYPE);
    4. SELECT ROOM_NO FROM ROOM WHERE PRICE = (SELECT PRICE FROM ROOM WHERE RTYPE = 'DLX');
  29. 29. 다음 세 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 기준)

    [BOOK_WEB]

    GID
    1
    1
    2

    [BOOK_TEL]

    GID
    2
    3

    [BOOK_AGENCY]

    GID
    3
    4
    -- (가)
    SELECT GID FROM BOOK_WEB
    UNION ALL
    SELECT GID FROM BOOK_TEL
    UNION
    SELECT GID FROM BOOK_AGENCY;
    
    -- (나)
    SELECT GID FROM BOOK_WEB
    UNION
    SELECT GID FROM BOOK_TEL
    UNION ALL
    SELECT GID FROM BOOK_AGENCY;
    1. (가) 5, (나) 5
    2. (가) 4, (나) 4
    3. (가) 7, (나) 5
    4. (가) 4, (나) 5
  30. 30. 2024년 투숙 고객 [STAY_24]와 2025년 투숙 고객 [STAY_25]가 다음과 같다. 결과가 G1, G3 두 행만 출력되는 SQL은? (Oracle 기준, 행 순서는 고려하지 않는다)

    [STAY_24]

    GID
    G1
    G1
    G2
    G3

    [STAY_25]

    GID
    G2
    G4
    1. SELECT GID FROM STAY_24 MINUS SELECT GID FROM STAY_25;
    2. SELECT GID FROM STAY_24 WHERE GID NOT IN (SELECT GID FROM STAY_25);
    3. SELECT GID FROM STAY_25 MINUS SELECT GID FROM STAY_24;
    4. SELECT GID FROM STAY_24 INTERSECT SELECT GID FROM STAY_25;
  31. 31. 다음 SQL의 결과 건수와, HOTEL과 RTYPE이 모두 NULL로 표시되는 행의 수로 옳은 것은?

    [SALES]

    HOTEL RTYPE AMT
    서울 STD 100
    서울 DLX 200
    서울 NULL 50
    부산 STD 150
    부산 STD 70
    SELECT HOTEL, RTYPE, SUM(AMT)
      FROM SALES
     GROUP BY CUBE(HOTEL, RTYPE);
    1. 9건, 1건
    2. 10건, 1건
    3. 10건, 2건
    4. 9건, 2건
  32. 32. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, (HOTEL, TOT)를 출력 순서대로 표기)

    [SALES]

    HOTEL RTYPE AMT
    서울 STD 100
    서울 DLX 300
    부산 STD 200
    부산 STE 500
    SELECT HOTEL, SUM(AMT) AS TOT
      FROM SALES
     GROUP BY ROLLUP(HOTEL, RTYPE)
    HAVING GROUPING(RTYPE) = 1
     ORDER BY HOTEL;
    1. (부산, 700), (서울, 400)
    2. (부산, 700), (서울, 400), (NULL, 1100)
    3. (NULL, 1100), (부산, 700), (서울, 400)
    4. (NULL, 1100)
  33. 33. 다음 SQL의 실행 결과에서 R 값을 출력 순서대로 나열한 것으로 옳은 것은? (문자는 가나다순으로 정렬된다.)

    [OCC]

    HOTEL MON CNT
    서울 1 10
    서울 2 20
    서울 3 30
    부산 1 5
    부산 2 15
    SELECT HOTEL, MON,
           SUM(CNT) OVER (PARTITION BY HOTEL ORDER BY MON
                          ROWS BETWEEN CURRENT ROW
                                   AND UNBOUNDED FOLLOWING) AS R
      FROM OCC
     ORDER BY HOTEL, MON;
    1. 5, 20, 10, 30, 60
    2. 20, 20, 60, 60, 60
    3. 20, 15, 30, 50, 60
    4. 20, 15, 60, 50, 30
  34. 34. 객실별로 체크아웃 후 다음 체크인까지 비어 있던 일수(IDLE)를 구하려 한다. 다음 SQL의 실행 결과에서 IDLE 값을 출력 순서대로 나열한 것으로 옳은 것은? (Oracle, IN_DT와 OUT_DT는 시각이 00:00인 DATE 타입이다.)

    [STAY]

    ROOM_NO IN_DT OUT_DT
    101 2025-03-01 2025-03-03
    101 2025-03-05 2025-03-06
    101 2025-03-06 2025-03-08
    102 2025-03-02 2025-03-04
    102 2025-03-10 2025-03-11
    SELECT ROOM_NO, IN_DT,
           LEAD(IN_DT) OVER (PARTITION BY ROOM_NO ORDER BY IN_DT)
             - OUT_DT AS IDLE
      FROM STAY
     ORDER BY ROOM_NO, IN_DT;
    1. 2, 0, NULL, 6, NULL
    2. 3, 1, NULL, 7, NULL
    3. NULL, 2, 0, NULL, 6
    4. 2, 0, 0, 6, 0
  35. 35. 다음 SQL의 실행 결과에서 ID가 2인 행의 R1, R2 값으로 옳은 것은?

    [PAY]

    ID DAY AMT
    1 1 100
    2 2 50
    3 2 70
    4 3 30
    SELECT ID,
           SUM(AMT) OVER (ORDER BY DAY, ID
                          ROWS UNBOUNDED PRECEDING)  AS R1,
           SUM(AMT) OVER (ORDER BY DAY
                          RANGE UNBOUNDED PRECEDING) AS R2
      FROM PAY;
    1. R1 = 150, R2 = 150
    2. R1 = 220, R2 = 220
    3. R1 = 150, R2 = 220
    4. R1 = 220, R2 = 150
  36. 36. 다음 SQL의 결과 건수는? (Oracle 12c 이상 기준)

    [ROOM]

    ROOM_NO PRICE
    101 100
    102 300
    201 250
    202 300
    301 250
    302 500
    SELECT ROOM_NO, PRICE
      FROM ROOM
     ORDER BY PRICE DESC
     FETCH FIRST 2 ROWS WITH TIES;
    1. 2
    2. 3
    3. 4
    4. 5
  37. 37. 다음 [ROOM] 테이블에서 가격 상위 3위 이내의 객실을 조회하려고 (가)~(다)를 실행했다. 결과 값으로 옳은 것은?

    [ROOM]

    ROOM_NO PRICE
    101 500
    102 400
    103 400
    201 300
    202 300
    203 200
    -- (가)
    SELECT COUNT(*) FROM (SELECT ROW_NUMBER() OVER (ORDER BY PRICE DESC) AS RK FROM ROOM)
     WHERE RK <= 3;
    
    -- (나)
    SELECT COUNT(*) FROM (SELECT RANK() OVER (ORDER BY PRICE DESC) AS RK FROM ROOM)
     WHERE RK <= 3;
    
    -- (다)
    SELECT COUNT(*) FROM (SELECT DENSE_RANK() OVER (ORDER BY PRICE DESC) AS RK FROM ROOM)
     WHERE RK <= 3;
    1. (가) 3, (나) 4, (다) 5
    2. (가) 3, (나) 3, (다) 3
    3. (가) 3, (나) 5, (다) 5
    4. (가) 3, (나) 3, (다) 5
  38. 38. 다음 SQL의 결과에 포함되는 행은? (Oracle 기준, NAME | PNAME | LV 순서로 표기)

    [LOC]

    ID NAME PID
    1 본관 NULL
    2 3층 1
    3 5층 1
    4 301호 2
    5 302호 2
    6 501호 3
    SELECT NAME, PRIOR NAME AS PNAME, LEVEL AS LV
      FROM LOC
     START WITH PID IS NULL
    CONNECT BY PRIOR ID = PID;
    1. 501호 | 5층 | 3
    2. 본관 | 본관 | 1
    3. 302호 | 본관 | 3
    4. 5층 | 501호 | 2
  39. 39. 다음 SQL의 결과 건수는? (Oracle 기준)

    [ZONE]

    ID NAME PID
    1 본관 NULL
    2 본관3층 1
    3 본관5층 1
    4 301호 2
    5 302호 2
    6 501호 3
    7 별관 NULL
    8 별관1층 7
    9 101호 8
    SELECT COUNT(*)
      FROM ZONE
     START WITH PID IS NULL
    CONNECT BY PRIOR ID = PID
           AND LEVEL <= 2;
    1. 3
    2. 4
    3. 5
    4. 9
  40. 40. 다음 SQL의 결과에 대한 설명으로 옳은 것은? (Oracle 기준)

    [SALES]

    HOTEL RTYPE AMT
    서울 STD 100
    서울 STD 200
    서울 DLX 300
    부산 STD 150
    부산 STE 400
    SELECT *
      FROM (SELECT HOTEL, RTYPE, AMT FROM SALES)
     PIVOT (SUM(AMT) AS S, COUNT(*) AS C
            FOR RTYPE IN ('STD' AS STD, 'DLX' AS DLX));
    1. 결과는 3행이며, IN 목록에 없는 STE도 별도의 행으로 출력된다.
    2. 결과 컬럼 이름은 S_STD, C_STD, S_DLX, C_DLX 형태로 만들어진다.
    3. 부산 행의 DLX_S 값은 0이다.
    4. 결과 컬럼은 HOTEL, STD_S, STD_C, DLX_S, DLX_C 5개이며, 서울 행의 STD_S는 300, STD_C는 2이다.
  41. 41. 예약 코드 형식을 검증하는 다음 SQL의 결과 건수는? (Oracle 기준)

    [RESV]

    CODE
    HT-2025-0001
    HT-25-12
    ht-2025-0002
    HT-2025-001
    HTL-2025-0003
    SELECT CODE
      FROM RESV
     WHERE REGEXP_LIKE(CODE, '^HT-[0-9]{4}-[0-9]{3,4}$');
    1. 1
    2. 2
    3. 3
    4. 4
  42. 42. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, 결과는 A / B 순서)

    SELECT REGEXP_SUBSTR('STD:101,DLX:2005,STE:9', '[0-9]{3,}', 1, 2)   AS A,
           REGEXP_REPLACE('Room 1205, Floor 12', '[0-9]+', '#', 1, 2) AS B
      FROM DUAL;
    1. 2005 / Room 1205, Floor #
    2. 9 / Room 1205, Floor #
    3. 2005 / Room #, Floor #
    4. 101 / Room #, Floor 12
  43. 43. 다음 두 테이블에 대해 아래 MERGE 문을 실행(Oracle)한 후 SELECT COUNT(*), SUM(PRICE) FROM ROOM_PRICE;의 결과로 옳은 것은?

    [ROOM_PRICE]

    ROOM_NO PRICE
    101 100
    102 120
    201 200

    [NEW_PRICE]

    ROOM_NO PRICE
    101 90
    102 150
    301 400
    302 50
    MERGE INTO room_price t
    USING new_price s
       ON (t.room_no = s.room_no)
     WHEN MATCHED THEN
       UPDATE SET t.price = s.price
        WHERE s.price > t.price
     WHEN NOT MATCHED THEN
       INSERT (room_no, price) VALUES (s.room_no, s.price)
        WHERE s.price >= 100;
    1. 5, 900
    2. 4, 840
    3. 4, 850
    4. 3, 450
  44. 44. 다음 [ROOM_ASSIGN] 테이블에 대해 아래 UPDATE 문 2개를 순서대로 실행(Oracle)한 후의 데이터로 옳은 것은? (GID(ROOM_A, ROOM_B) 형식)

    [ROOM_ASSIGN]

    GID ROOM_A ROOM_B
    G1 101 201
    G2 102 202
    UPDATE room_assign
       SET room_a = room_b,
           room_b = room_a
     WHERE gid = 'G1';
    
    UPDATE room_assign
       SET room_a = room_a + 1,
           room_b = room_a
     WHERE gid = 'G2';
    1. G1(201, 201), G2(103, 103)
    2. G1(201, 101), G2(103, 102)
    3. G1(201, 101), G2(103, 103)
    4. G1(101, 201), G2(103, 102)
  45. 45. T 테이블은 C NUMBER PRIMARY KEY로 생성되어 있고 C 값이 1인 한 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행한 후 T에 남아 있는 C 값은? (오류가 발생한 문장은 무시하고 다음 문장이 실행된다고 가정한다.)

    INSERT INTO t VALUES (2);
    INSERT INTO t VALUES (1);
    SAVEPOINT s1;
    INSERT INTO t VALUES (3);
    GRANT SELECT ON t TO u1;
    INSERT INTO t VALUES (4);
    ROLLBACK TO s1;
    ROLLBACK;
    1. 1
    2. 1, 2
    3. 1, 2, 3, 4
    4. 1, 2, 3
  46. 46. 트랜잭션 TX1이 101호의 요금을 조회해 100을 읽었다. 그 사이 TX2가 101호 요금을 150으로 UPDATE한 뒤 COMMIT했고, TX1이 같은 행을 다시 조회하자 150이 읽혔다. 이 현상의 명칭과, ANSI 표준 기준으로 이 현상을 방지할 수 있는 가장 낮은 격리 수준을 바르게 짝지은 것은?

    1. Non-Repeatable Read / REPEATABLE READ
    2. Dirty Read / READ COMMITTED
    3. Phantom Read / SERIALIZABLE
    4. Non-Repeatable Read / READ COMMITTED
  47. 47. Oracle에서 다음과 같이 테이블을 생성하였다. 이 테이블에 대한 설명으로 가장 적절한 것은?

    CREATE TABLE room_info (
      room_no    NUMBER       CONSTRAINT room_pk PRIMARY KEY,
      rtype      VARCHAR2(3)  CONSTRAINT room_ck CHECK (rtype IN ('STD', 'DLX', 'STE')),
      phone_ext  VARCHAR2(4)  CONSTRAINT room_uk UNIQUE,
      price      NUMBER(7)    DEFAULT 100000 NOT NULL
    );
    1. RTYPE에 NULL을 입력하면 CHECK 조건 RTYPE IN ('STD', 'DLX', 'STE')를 만족하지 않으므로 오류가 발생한다.
    2. PHONE_EXT가 NULL인 행은 여러 건 입력할 수 있다.
    3. INSERT INTO room_info (room_no, rtype, price) VALUES (101, 'STD', NULL);을 실행하면 PRICE에 DEFAULT 값 100000이 입력된다.
    4. CREATE TABLE room_bak AS SELECT * FROM room_info;로 복사하면 ROOM_UK 제약조건도 함께 복사된다.
  48. 48. 호텔 GUEST 테이블에는 이름, 등급, 주민등록번호, 전화번호가 저장되어 있다. 프런트 직원이 이름과 등급만 볼 수 있도록 하려고 뷰(VIEW)를 활용하려 한다. 뷰에 대한 설명으로 가장 적절한 것은? (Oracle)

    1. 뷰는 SELECT 결과 데이터를 별도로 저장하므로, 원본 GUEST 테이블을 삭제해도 뷰는 계속 조회할 수 있다.
    2. 뷰의 정의를 바꾸려면 ALTER VIEW v_guest AS SELECT ...로 SELECT 문을 수정한다.
    3. 이름과 등급만 담은 뷰 V_GUEST를 만들고 프런트 직원에게 GUEST 대신 V_GUEST의 SELECT 권한만 주면 민감한 컬럼의 노출을 막을 수 있으며, 이는 뷰의 보안성 장점에 해당한다.
    4. GUEST 테이블에 새 컬럼이 추가되면 그 컬럼을 사용하지 않는 V_GUEST도 반드시 다시 생성해야 한다.
  49. 49. SCOTT 소유의 ROOM 테이블에 대해 아래 문장을 실행했다. U1은 CREATE TABLE 권한을 가지고 있지만 U1의 CREATE TABLE 문은 권한 부족 오류로 실패했다. U1의 문장이 성공하도록 SCOTT가 추가로 실행해야 할 문장으로 가장 적절한 것은? (Oracle)

    -- SCOTT 실행
    GRANT SELECT ON scott.room TO u1;
    
    -- U1 실행
    CREATE TABLE stay (
      stay_id  NUMBER PRIMARY KEY,
      room_no  NUMBER REFERENCES scott.room (room_no)
    );
    1. GRANT ALTER ON scott.room TO u1;
    2. GRANT INDEX ON scott.room TO u1;
    3. GRANT SELECT ON scott.room TO u1 WITH GRANT OPTION;
    4. GRANT REFERENCES ON scott.room TO u1;
  50. 50. DBA, SCOTT, U1이 아래 순서로 DCL을 실행했다. 이후 U2가 (가), (나)를 실행했을 때의 결과로 옳은 것은? (Oracle)

    -- DBA 실행
    GRANT CREATE VIEW TO u1 WITH ADMIN OPTION;
    GRANT CREATE VIEW TO u2 WITH ADMIN OPTION;
    
    -- SCOTT 실행
    GRANT SELECT ON scott.room TO u1 WITH GRANT OPTION;
    GRANT SELECT ON scott.room TO u2 WITH GRANT OPTION;
    
    -- U1 실행
    GRANT CREATE VIEW TO u3;
    GRANT SELECT ON scott.room TO u3;
    
    -- U2 실행
    -- (가)
    REVOKE CREATE VIEW FROM u3;
    -- (나)
    REVOKE SELECT ON scott.room FROM u3;
    1. (가) 성공, (나) 실패
    2. (가) 성공, (나) 성공
    3. (가) 실패, (나) 성공
    4. (가) 실패, (나) 실패

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