SQLD 모의고사 15회

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

  1. 1. 항공사가 예약 시스템을 재설계하면서 좋은 데이터 모델의 요소를 적용하였다. 요소와 적용 사례를 짝지은 것으로 가장 적절하지 않은 것은?

    1. 통합성 - 승객 정보를 예약·마일리지·탑승 업무가 각자 정의하지 않고, 한 곳에서 한 번만 정의한 뒤 모든 업무가 참조하도록 하였다.
    2. 업무 규칙 - '좌석 등급은 F, C, Y 중 하나이다'라는 규칙을 모델에 표현하여 개발자와 현업이 같은 규칙을 공유하도록 하였다.
    3. 데이터 재사용 - 운임 조회 화면 한 곳에서만 쓰기 편한 형태로 예약 데이터를 설계하여, 그 화면의 처리 방식에 맞추었다.
    4. 완전성 - 업무 분석 중 수하물 위탁 정보가 모델에 빠져 있음을 발견하고 이를 모델에 추가하였다.
  2. 2. 항공 예약 시스템을 분석하며 엔터티 후보에 대해 나온 의견이다. 가장 적절한 것은?

    1. '기내식메뉴'는 다른 항공사 시스템에서는 엔터티가 될 수 있더라도, 이 예약 시스템의 업무에서 관리할 필요가 없다면 엔터티로 도출하지 않는다.
    2. '승객명'은 모든 예약에 반드시 필요한 중요한 정보이므로 독립된 엔터티로 도출한다.
    3. '좌석'은 항공기마다 인스턴스가 수백 개씩 생기므로 항공기별로 엔터티를 각각 나누어 정의한다.
    4. '탑승권발행'은 승객·항공편과의 관계만 표현하면 되므로 속성이 하나도 없는 엔터티로 정의해도 된다.
  3. 3. 항공 예약 시스템의 엔터티·인스턴스·속성·속성값의 관계에 대한 설명으로 가장 적절한 것은?

    1. 엔터티는 속성을 하나 이상 가지면 충분하므로, '좌석번호' 속성 하나만 가진 좌석 엔터티도 바람직한 설계이다.
    2. 한 인스턴스에서 하나의 속성은 여러 값을 가질 수 있으므로, 승객의 여러 연락처를 '연락처' 속성 하나에 쉼표로 이어 저장한다.
    3. 업무에서 '출발일시'를 날짜와 시각으로 나누어 검색·집계해야 하더라도, 의미상 하나의 값이므로 반드시 하나의 속성으로 정의한다.
    4. 예약 엔터티의 한 인스턴스에서 '예약상태' 속성은 하나의 속성값만 가진다.
  4. 4. 승객과 예약 엔터티 사이의 관계를 정의하려 한다. 관계와 관계명에 대한 설명으로 가장 적절하지 않은 것은?

    1. 하나의 관계는 양쪽 끝에 관계명을 하나씩 가지므로, 승객 기준 '요청한다', 예약 기준 '요청된다'처럼 두 개의 관계명을 붙인다.
    2. 관계명은 이미 발생한 사실을 나타내야 하므로 '예약했다'처럼 과거형으로 표현하는 것이 원칙이다.
    3. '관련이 있다', '관계된다'처럼 구체적이지 않은 동사는 관계명으로 사용하지 않는다.
    4. ERD에서는 존재적 관계와 행위적 관계를 구분하지 않고 같은 관계선으로 표현한다.
  5. 5. 승객 엔터티의 주식별자로 '여권번호'를 검토하였다. 여권번호는 승객마다 서로 다르고 거의 바뀌지도 않는다. 그러나 국내선만 이용하는 승객은 여권 없이 예약할 수 있어서, 여권번호 값이 없는 승객이 존재한다.

    이 때문에 여권번호가 주식별자로 부적합하다고 판단했을 때, 그 근거가 되는 주식별자의 특징은?

    1. 유일성
    2. 존재성
    3. 최소성
    4. 불변성
  6. 6. 항공사의 운항 통계 화면이 여러 테이블을 조인하느라 느리다는 불만이 접수되었다. 이에 대한 판단으로 가장 적절한 것은?

    1. 정규화된 모델은 조인이 늘어나 조회 성능이 항상 저하되므로, 통계 조회가 느리면 즉시 관련 테이블을 병합한다.
    2. 반정규화는 데이터 무결성에 영향을 주지 않으므로, 별도의 정합성 관리 방안 없이 적용해도 된다.
    3. 반정규화를 적용하기 전에 인덱스 조정, 뷰, 클러스터링, 파티셔닝, 응용 로직 변경 같은 다른 방법을 먼저 검토한다.
    4. 정규화를 하면 입력·수정·삭제 성능이 일반적으로 저하되므로, 예약 입력이 많은 시스템은 정규화를 하지 않는 것이 원칙이다.
  7. 7. PASSENGER와 PAX_DETAIL은 1:1(선택) 관계, PASSENGER와 BOOKING은 1:M 관계이며 데이터는 다음과 같다.

    PASSENGER

    PAX_ID NAME
    P1 김
    P2 이
    P3 박
    P4 최

    PAX_DETAIL

    PAX_ID PASSPORT_NO
    P1 M111
    P3 M333

    BOOKING

    BK_NO PAX_ID
    B1 P1
    B2 P1
    B3 P3
    B4 P4

    다음 SQL의 결과 건수와, 결과 중 PASSPORT_NO가 NULL인 행의 수로 옳은 것은?

    SELECT P.PAX_ID, D.PASSPORT_NO, B.BK_NO
      FROM PASSENGER P
      LEFT OUTER JOIN PAX_DETAIL D ON P.PAX_ID = D.PAX_ID
      INNER JOIN BOOKING B         ON P.PAX_ID = B.PAX_ID;
    1. 4건 / 1건
    2. 3건 / 0건
    3. 5건 / 2건
    4. 4건 / 2건
  8. 8. 항공권 구매 트랜잭션은 다음 세 단계로 구성된다.

    1. 예약(BOOKING) INSERT
    2. 좌석(SEAT)의 상태를 '배정'으로 UPDATE
    3. 결제(PAYMENT) INSERT

    업무 요구사항은 "3단계의 결제 입력이 실패하면 앞서 처리한 예약 등록과 좌석 배정도 모두 취소되어, 결제 없는 예약이 남아서는 안 된다"이다. 이 요구와 가장 관련 있는 트랜잭션 특성은?

    1. 일관성(Consistency)
    2. 고립성(Isolation)
    3. 지속성(Durability)
    4. 원자성(Atomicity)
  9. 9. PAX 테이블의 데이터가 다음과 같을 때, (가)와 (나) SQL의 결과로 옳은 것은? (Oracle 기준)

    PAX_ID MILE GRADE
    P1 500 G
    P2 NULL S
    P3 100 NULL
    P4 NULL NULL
    -- (가)
    SELECT COUNT(*) FROM PAX
     WHERE NOT (MILE >= 300 AND GRADE = 'G');
    
    -- (나)
    SELECT COUNT(*) FROM PAX
     WHERE NOT (MILE >= 300 OR GRADE = 'S');
    1. (가) 3, (나) 1
    2. (가) 2, (나) 2
    3. (가) 2, (나) 0
    4. (가) 3, (나) 0
  10. 10. 운항 엔터티의 본질식별자는 (항공사코드, 편명, 출발일자)이며, 이 세 속성이 예약, 탑승, 수하물, 좌석배정 테이블에 모두 FK로 상속되어 있다. 설계자는 시퀀스로 생성하는 인조식별자 '운항ID'를 운항의 PK로 도입하려 한다.

    이 변경으로 기대할 수 있는 효과로 가장 적절한 것은?

    1. 운항ID에 PK가 걸리므로 같은 (항공사코드, 편명, 출발일자) 운항이 중복 입력되는 것도 자동으로 막을 수 있다.
    2. 하위 테이블에 상속되는 식별자 컬럼이 3개에서 1개로 줄어 조인 조건과 SQL이 단순해진다.
    3. 운항ID가 생기면 항공사코드·편명·출발일자는 더 이상 필요 없으므로 운항 테이블에서 삭제한다.
    4. 운항ID는 업무 의미를 담은 값이므로 탑승권과 안내 화면에 출력해 승객이 운항을 식별하는 데 사용한다.
  11. 11. PASSENGER 테이블의 기본키는 PAX_ID이고, BOOKING 테이블의 PAX_ID는 PASSENGER.PAX_ID를 참조하는 외래키다. 기본키와 외래키에 대한 설명으로 적절하지 않은 것은?

    1. NOT NULL 제약이 없다면 BOOKING.PAX_ID에는 NULL이 입력될 수 있다.
    2. BOOKING 테이블에는 PAX_ID 외에도 FLIGHT 테이블을 참조하는 외래키를 추가로 정의할 수 있다.
    3. BOOKING.PAX_ID 값은 PASSENGER에 존재하는 PAX_ID 값 중 하나이거나 NULL이어야 한다.
    4. 외래키 값은 테이블 안에서 중복될 수 없으므로, 한 승객은 BOOKING 테이블에 한 번만 나타날 수 있다.
  12. 12. 다음 [FLIGHT] 테이블에 (가), (나) SQL을 실행했을 때 결과 행 수로 옳은 것은? (Oracle, DEP와 ARR은 VARCHAR2 타입)

    [FLIGHT]

    FLT_NO DEP ARR
    KE01 GMP NULL
    KE02 NULL GMP
    OZ03 GMP CJU
    OZ04 GMP CJU
    LJ05 ICN NULL
    LJ06 ICN NRT
    -- (가)
    SELECT DISTINCT DEP, ARR FROM FLIGHT;
    
    -- (나)
    SELECT DISTINCT DEP || ARR AS ROUTE FROM FLIGHT;
    1. (가) 5, (나) 4
    2. (가) 5, (나) 3
    3. (가) 6, (나) 4
    4. (가) 4, (나) 4
  13. 13. FLIGHT 테이블에는 FLT_NO, FARE 컬럼이 있다. 다음 중 Oracle에서 오류 없이 실행되는 SQL은?

    1. SELECT FARE * 2 AS RT, RT + 1000 AS RT_FEE FROM FLIGHT;
    2. SELECT FLT_NO, FARE FROM FLIGHT F WHERE FLIGHT.FARE > 100000;
    3. SELECT FLT_NO AS FNO, FARE * 2 "Round Trip" FROM FLIGHT ORDER BY "Round Trip";
    4. SELECT FLT_NO, FARE * 2 AS RT FROM FLIGHT WHERE RT > 300000;
  14. 14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, C1, C2, C3, C4 순서로 표기)

    SELECT SUBSTR('KE0123-ICN-NRT', INSTR('KE0123-ICN-NRT', '-') + 1, 3) AS C1,
           INSTR('KE0123-ICN-NRT', '-', 1, 2)                          AS C2,
           LTRIM('0012A', '0')                                         AS C3,
           SUBSTR('KE0123', -4, 2)                                     AS C4
      FROM DUAL;
    1. ICN, 11, 12A, 12
    2. ICN, 11, 12A, 01
    3. -IC, 11, 12A, 01
    4. ICN, 10, 012A, 01
  15. 15. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, C1, C2, C3, C4 순서로 표기)

    SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2025-03-31 18:30', 'YYYY-MM-DD HH24:MI'), -1), 'MM-DD')   AS C1,
           TO_CHAR(TO_DATE('2025-03-31 18:30', 'YYYY-MM-DD HH24:MI') + 6/24, 'MM-DD HH24')      AS C2,
           TRUNC(MONTHS_BETWEEN(TO_DATE('2025-06-15', 'YYYY-MM-DD'),
                                TO_DATE('2025-03-31', 'YYYY-MM-DD')))                         AS C3,
           EXTRACT(DAY FROM LAST_DAY(TO_DATE('2024-02-10', 'YYYY-MM-DD')))                      AS C4
      FROM DUAL;
    1. 03-01, 04-01 00, 2, 29
    2. 02-28, 03-31 24, 3, 29
    3. 02-28, 04-01 00, 3, 28
    4. 02-28, 04-01 00, 2, 29
  16. 16. 다음 [PAX] 테이블에 SQL을 실행했을 때 X, Y, Z, W의 값으로 옳은 것은? (Oracle)

    [PAX]

    PAX_ID MOBILE HOME MILE
    P1 010-1 NULL 0
    P2 NULL 02-1 500
    P3 NULL NULL NULL
    P4 010-2 031-1 1200
    SELECT COUNT(NULLIF(MILE, 0))         AS X,
           SUM(NVL2(MOBILE, 1, 0))         AS Y,
           COUNT(COALESCE(MOBILE, HOME))   AS Z,
           SUM(DECODE(MILE, NULL, 1, 0))   AS W
      FROM PAX;
    1. X=2, Y=2, Z=3, W=1
    2. X=2, Y=2, Z=3, W=0
    3. X=3, Y=2, Z=3, W=1
    4. X=2, Y=2, Z=2, W=1
  17. 17. 다음 [FLIGHT] 테이블에 SQL을 실행했을 때 결과 값은?

    [FLIGHT]

    FLT_NO DEP ARR FARE
    KE01 GMP CJU 80000
    OZ02 ICN NRT 250000
    LJ03 GMP PUS 150000
    KE04 ICN CJU 120000
    7C05 PUS CJU 60000
    ZE06 ICN KIX NULL
    SELECT COUNT(*)
      FROM FLIGHT
     WHERE DEP = 'GMP'
        OR DEP = 'ICN' AND FARE NOT BETWEEN 100000 AND 200000;
    1. 1
    2. 2
    3. 3
    4. 4
  18. 18. 다음 [SEAT] 테이블에 (가), (나) SQL을 실행했을 때 결과로 옳은 것은?

    [SEAT]

    SEAT_NO
    1A
    12A
    1B
    10
    1
    21A
    -- (가)
    SELECT COUNT(*) FROM SEAT WHERE SEAT_NO LIKE '1_';
    
    -- (나)
    SELECT COUNT(*) FROM SEAT WHERE SEAT_NO LIKE '1%A';
    1. (가) 4, (나) 2
    2. (가) 3, (나) 2
    3. (가) 3, (나) 1
    4. (가) 4, (나) 3
  19. 19. 다음 [BOOKING] 테이블에 SQL을 실행한 결과로 옳은 것은? (FLT_NO, CNT, PAID, AVG_AMT 순서로 표기)

    [BOOKING]

    BK_NO FLT_NO CLASS AMT
    1 KE01 Y 100
    2 KE01 Y NULL
    3 KE01 C 300
    4 OZ02 Y 200
    5 OZ02 Y 300
    6 OZ02 C NULL
    7 LJ03 Y 150
    SELECT FLT_NO,
           COUNT(*)   AS CNT,
           COUNT(AMT) AS PAID,
           AVG(AMT)   AS AVG_AMT
      FROM BOOKING
     GROUP BY FLT_NO
    HAVING COUNT(*) > COUNT(AMT)
     ORDER BY FLT_NO;
    1. KE01, 3, 3, 133.33 / OZ02, 3, 3, 166.67
    2. KE01, 3, 2, 200 / OZ02, 3, 2, 250 / LJ03, 1, 1, 150
    3. KE01, 2, 2, 200 / OZ02, 2, 2, 250
    4. KE01, 3, 2, 200 / OZ02, 3, 2, 250
  20. 20. 다음 [BOOKING] 테이블에 대해 실행했을 때, 결과가 나머지 셋과 다른 SQL은?

    [BOOKING]

    BK_NO FLT_NO CLASS AMT
    1 KE01 Y 100
    2 KE01 Y NULL
    3 KE01 C 300
    4 OZ02 Y 200
    5 OZ02 Y 300
    6 OZ02 C NULL
    7 LJ03 Y 150
    1. SELECT FLT_NO, SUM(AMT) FROM BOOKING WHERE AMT IS NOT NULL GROUP BY FLT_NO HAVING COUNT(*) >= 3;
    2. SELECT FLT_NO, SUM(AMT) FROM BOOKING GROUP BY FLT_NO HAVING COUNT(*) >= 3;
    3. SELECT FLT_NO, SUM(AMT) FROM BOOKING GROUP BY FLT_NO HAVING COUNT(BK_NO) >= 3;
    4. SELECT FLT_NO, SUM(AMT) FROM BOOKING GROUP BY FLT_NO HAVING COUNT(*) > COUNT(AMT);
  21. 21. 다음 [PAX] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle)

    [PAX]

    NAME GRADE MILE
    가 S 300
    나 NULL 500
    다 G 100
    라 S NULL
    마 G 400
    SELECT NAME, GRADE, MILE
      FROM PAX
     ORDER BY 2 DESC, 3;
    1. 가, 라, 다, 마, 나
    2. 나, 가, 라, 다, 마
    3. 나, 라, 가, 다, 마
    4. 다, 마, 가, 라, 나
  22. 22. BOOKING 테이블(BK_NO, FLT_NO, CLASS, AMT)에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?

    1. SELECT FLT_NO FROM BOOKING GROUP BY FLT_NO ORDER BY COUNT(*) DESC;
    2. SELECT FLT_NO, AMT FROM BOOKING ORDER BY CLASS, 2 DESC;
    3. SELECT FLT_NO FROM (SELECT FLT_NO, AMT FROM BOOKING) ORDER BY CLASS;
    4. SELECT FLT_NO AS F, AMT FROM BOOKING ORDER BY F, AMT DESC;
  23. 23. 다음 [FLIGHT] 테이블에서 환승 가능한 항공편 조합(앞 편의 도착지 = 뒤 편의 출발지)을 찾되, 출발지로 되돌아오는 왕복 조합은 제외하려고 한다. SQL을 실행했을 때 결과 값은?

    [FLIGHT]

    FLT_NO DEP ARR
    KE01 ICN NRT
    KE02 NRT ICN
    KE03 NRT LAX
    OZ04 ICN HND
    OZ05 HND LAX
    JL06 LAX NRT
    SELECT COUNT(*)
      FROM FLIGHT A, FLIGHT B
     WHERE A.ARR = B.DEP
       AND A.DEP <> B.ARR;
    1. 3
    2. 4
    3. 9
    4. 5
  24. 24. [SCHED]의 PK는 (FLT_NO, DEP_DATE)이고, [BOOKING]은 (FLT_NO, DEP_DATE)로 SCHED를 참조한다. 예약별 기종을 조회하려고 다음 SQL을 작성했을 때 결과 건수는?

    [SCHED]

    FLT_NO DEP_DATE AIRCRAFT
    KE01 0301 B737
    KE01 0302 A330
    OZ02 0301 A321

    [BOOKING]

    FLT_NO DEP_DATE PAX
    KE01 0301 P1
    KE01 0301 P2
    KE01 0302 P3
    OZ02 0301 P4
    SELECT B.PAX, S.AIRCRAFT
      FROM SCHED S, BOOKING B
     WHERE S.FLT_NO = B.FLT_NO;
    1. 7
    2. 4
    3. 6
    4. 12
  25. 25. 다음 [FLIGHT], [BOOKING] 테이블에 SQL을 실행했을 때 결과 건수와 BK_NO가 NULL인 행의 수로 옳은 것은?

    [FLIGHT]

    FLT_NO STATUS
    KE01 OPEN
    OZ02 CLOSED
    LJ03 OPEN

    [BOOKING]

    BK_NO FLT_NO
    1 KE01
    2 KE01
    3 OZ02
    SELECT F.FLT_NO, B.BK_NO
      FROM FLIGHT F
      LEFT OUTER JOIN BOOKING B
        ON F.FLT_NO = B.FLT_NO
       AND F.STATUS = 'OPEN';
    1. 3행 / 0행
    2. 4행 / 1행
    3. 4행 / 2행
    4. 3행 / 1행
  26. 26. 다음 [PAX], [TIER] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 값으로 옳은 것은?

    [PAX]

    PAX_ID MILE
    P1 500
    P2 1000
    P3 3000
    P4 5000
    P5 NULL

    [TIER]

    TIER_NM MIN_MILE MAX_MILE
    SILVER 0 1000
    GOLD 1000 5000
    VIP 5000 99999
    -- (가)
    SELECT COUNT(*)
      FROM PAX P INNER JOIN TIER T
        ON P.MILE BETWEEN T.MIN_MILE AND T.MAX_MILE;
    
    -- (나)
    SELECT COUNT(*)
      FROM PAX P LEFT OUTER JOIN TIER T
        ON P.MILE BETWEEN T.MIN_MILE AND T.MAX_MILE;
    1. (가) 4, (나) 5
    2. (가) 6, (나) 7
    3. (가) 6, (나) 6
    4. (가) 5, (나) 6
  27. 27. 다음 [FLIGHT] 테이블에 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은?

    [FLIGHT]

    FLT_NO DEP FARE
    KE01 ICN 300
    KE02 ICN 500
    OZ03 ICN 200
    LJ04 GMP 300
    LJ05 GMP 400
    7C06 PUS 200
    -- (가)
    SELECT FLT_NO FROM FLIGHT
     WHERE (DEP, FARE) IN (SELECT DEP, MIN(FARE) FROM FLIGHT GROUP BY DEP);
    
    -- (나)
    SELECT FLT_NO FROM FLIGHT
     WHERE FARE IN (SELECT MIN(FARE) FROM FLIGHT GROUP BY DEP);
    1. (가) 3건, (나) 4건
    2. (가) 3건, (나) 3건
    3. (가) 4건, (나) 4건
    4. (가) 3건, (나) 6건
  28. 28. 다음 [FLIGHT] 테이블에 (가)~(다) SQL을 실행했을 때 결과 값으로 옳은 것은? (DEP가 'CJU'인 행은 없다.)

    [FLIGHT]

    FLT_NO DEP FARE
    KE01 GMP 100
    OZ02 ICN 200
    LJ03 GMP 300
    KE04 ICN 400
    7C05 PUS 500
    -- (가)
    SELECT COUNT(*) FROM FLIGHT
     WHERE FARE > ALL (SELECT FARE FROM FLIGHT WHERE DEP = 'GMP');
    
    -- (나)
    SELECT COUNT(*) FROM FLIGHT
     WHERE FARE < ANY (SELECT FARE FROM FLIGHT WHERE DEP = 'GMP');
    
    -- (다)
    SELECT COUNT(*) FROM FLIGHT
     WHERE FARE > ALL (SELECT FARE FROM FLIGHT WHERE DEP = 'CJU');
    1. (가) 2, (나) 2, (다) 0
    2. (가) 2, (나) 1, (다) 5
    3. (가) 3, (나) 2, (다) 0
    4. (가) 2, (나) 2, (다) 5
  29. 29. 다음 두 테이블에 SQL을 실행했을 때 결과 건수는?

    [DOM_FLT]

    FLT_NO FARE
    KE01 100
    OZ02 NULL
    KE01 100

    [INTL_FLT]

    FLT_NO FARE
    KE01 300
    OZ02 500
    SELECT FLT_NO, FARE FROM DOM_FLT
    UNION
    SELECT FLT_NO, NULL FROM INTL_FLT;
    1. 2
    2. 3
    3. 4
    4. 5
  30. 30. 집합 연산자에 대한 설명으로 가장 적절하지 않은 것은?

    1. 결과 집합의 컬럼명은 첫 번째 SELECT 문의 컬럼명(또는 별칭)을 따른다.
    2. 정렬이 필요하면 ORDER BY는 전체 집합 연산의 마지막에 한 번만 쓸 수 있다.
    3. INTERSECT는 두 결과에 공통으로 존재하는 행을 중복까지 포함하여 모두 반환한다.
    4. SQL Server에서는 Oracle의 MINUS와 같은 차집합 연산에 EXCEPT를 사용한다.
  31. 31. 다음 SQL의 결과 건수는?

    [BK_SUM]

    DEP ARR CLASS AMT
    ICN NRT Y 10
    ICN NRT C 20
    ICN LAX Y 30
    GMP CJU Y 40
    GMP CJU Y 50
    SELECT DEP, ARR, CLASS, SUM(AMT)
      FROM BK_SUM
     GROUP BY DEP, ROLLUP(ARR, CLASS);
    1. 9건
    2. 10건
    3. 8건
    4. 12건
  32. 32. 다음 SQL의 결과에서 DEP와 CLASS가 모두 NULL로 표시되는 행의 수와, 그중 G 값이 0인 행의 S 값으로 옳은 것은?

    [BK]

    DEP CLASS AMT
    ICN Y 10
    ICN C 20
    GMP Y 30
    GMP NULL 40
    SELECT DEP, CLASS, SUM(AMT) AS S, GROUPING(CLASS) AS G
      FROM BK
     GROUP BY CUBE(DEP, CLASS);
    1. 1행, 100
    2. 2행, 100
    3. 2행, 70
    4. 2행, 40
  33. 33. 다음 SQL을 실행했을 때 DEP가 'ICN'인 행들의 LV1, LV2 값을 FARE 오름차순으로 나열한 것으로 옳은 것은?

    [FLIGHT]

    FLT_NO DEP FARE
    KE01 ICN 300
    KE02 ICN 400
    KE03 ICN 400
    KE04 ICN 600
    LJ05 GMP 100
    LJ06 GMP 200
    SELECT FLT_NO, FARE,
           LAST_VALUE(FARE) OVER (PARTITION BY DEP ORDER BY FARE) AS LV1,
           LAST_VALUE(FARE) OVER (PARTITION BY DEP ORDER BY FARE
                                  ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND UNBOUNDED FOLLOWING) AS LV2
      FROM FLIGHT;
    1. LV1: 600, 600, 600, 600 / LV2: 600, 600, 600, 600
    2. LV1: 300, 400, 400, 600 / LV2: 600, 600, 600, 600
    3. LV1: 300, 400, 400, 600 / LV2: 300, 400, 400, 600
    4. LV1: 600, 600, 600, 600 / LV2: 300, 400, 400, 600
  34. 34. 다음 SQL을 실행했을 때 MA 값을 출력 순서(FLT_NO, DAY 순)대로 나열한 것으로 옳은 것은? (LOAD_PCT는 탑승률이다.)

    [LOAD_LOG]

    FLT_NO DAY LOAD_PCT
    KE01 1 80
    KE01 2 NULL
    KE01 3 60
    KE01 4 100
    OZ02 1 50
    OZ02 2 70
    SELECT FLT_NO, DAY,
           AVG(LOAD_PCT) OVER (PARTITION BY FLT_NO ORDER BY DAY
                               ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS MA
      FROM LOAD_LOG
     ORDER BY FLT_NO, DAY;
    1. 40, 46.67, 53.33, 80, 60, 60
    2. 80, 70, 80, 70, 73.33, 60
    3. 80, 70, 80, 80, 60, 60
    4. 80, 80, 60, 80, 50, 60
  35. 35. 윈도우 함수에 대한 설명으로 가장 적절한 것은?

    1. 윈도우 함수는 결과 행 수를 줄이지 않으며, SUM 같은 집계 함수를 OVER 절과 함께 쓰면 각 행에 집계 값이 함께 표시된다.
    2. SUM(AMT) OVER (PARTITION BY DEP)처럼 ORDER BY 없이 쓰면 파티션 안에서 행 순서대로 누적합이 계산된다.
    3. ROWS는 ORDER BY 값의 논리적 범위를, RANGE는 물리적인 행 수를 기준으로 윈도우를 정한다.
    4. RANK 함수에 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW 같은 윈도우 절을 지정하면 순위 계산 범위를 바꿀 수 있다.
  36. 36. 다음 SQL의 실행 결과로 옳은 것은? (SQL Server 기준, 출력 순서대로 표기)

    [FLIGHT]

    FLT_NO FARE
    KE01 300
    OZ02 550
    LJ03 120
    7C04 480
    TW05 260
    ZE06 610
    SELECT TOP (40) PERCENT FLT_NO
      FROM FLIGHT
     ORDER BY FARE DESC;
    1. ZE06, OZ02
    2. ZE06, OZ02, 7C04, KE01
    3. LJ03, TW05, KE01
    4. ZE06, OZ02, 7C04
  37. 37. 출발지별로 운임이 높은 항공편 2개씩을 조회하려고 한다. 다음 SQL의 순위 함수 자리에 (가) ROW_NUMBER, (나) RANK, (다) DENSE_RANK를 각각 넣어 실행했을 때 결과 건수로 옳은 것은?

    [FLIGHT]

    FLT_NO DEP FARE
    A ICN 500
    B ICN 400
    C ICN 400
    D ICN 300
    E GMP 200
    F GMP 200
    G GMP 100
    SELECT *
      FROM (SELECT FLT_NO, DEP, FARE,
                   순위함수() OVER (PARTITION BY DEP ORDER BY FARE DESC) AS RN
              FROM FLIGHT)
     WHERE RN <= 2;
    1. (가) 4, (나) 4, (다) 6
    2. (가) 4, (나) 5, (다) 6
    3. (가) 4, (나) 5, (다) 5
    4. (가) 4, (나) 6, (다) 7
  38. 38. [PAX] 테이블의 REF_ID는 해당 승객을 추천한 승객의 ID이다. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준)

    [PAX]

    ID NAME REF_ID GRADE
    1 A NULL VIP
    2 B 1 GOLD
    3 C 1 VIP
    4 D 2 GOLD
    5 E 3 GOLD
    6 F 5 GOLD
    SELECT COUNT(*)
      FROM PAX
     START WITH GRADE = 'VIP'
    CONNECT BY PRIOR ID = REF_ID;
    1. 9
    2. 6
    3. 3
    4. 8
  39. 39. 다음 SQL의 실행 결과에 대한 설명으로 옳은 것은? (Oracle 기준)

    [PAX]

    ID NAME REF_ID
    1 A NULL
    2 B 1
    3 C 1
    4 D 2
    5 E 3
    6 F 5
    SELECT NAME, LEVEL, CONNECT_BY_ISLEAF AS ISLEAF,
           CONNECT_BY_ROOT NAME AS RT,
           SYS_CONNECT_BY_PATH(NAME, '/') AS PATH
      FROM PAX
     START WITH NAME = 'F'
    CONNECT BY ID = PRIOR REF_ID;
    1. A 행의 LEVEL은 1이다.
    2. CONNECT_BY_ISLEAF 값이 1인 행은 F이다.
    3. 결과는 4행이며, 모든 행의 RT 값은 F이다.
    4. 마지막으로 출력되는 행의 PATH 값은 '/A/C/E/F'이다.
  40. 40. 다음 SQL의 결과에 대한 설명으로 옳은 것은? (Oracle 기준)

    [BOOKING_M]

    BK_NO MON CLASS AMT
    1 01 Y 100
    2 01 Y 200
    3 01 C 500
    4 02 Y 300
    SELECT *
      FROM (SELECT MON, CLASS, AMT FROM BOOKING_M)
     PIVOT (SUM(AMT) AS S, COUNT(*) AS C
            FOR CLASS IN ('Y' AS Y, 'C' AS C))
     ORDER BY MON;
    1. 결과 컬럼은 MON, Y_S, Y_C, C_S, C_C이고, MON이 '02'인 행의 값은 300, 1, 0, 0이다.
    2. 결과 컬럼은 MON, S_Y, C_Y, S_C, C_C이고, MON이 '02'인 행의 값은 300, 1, NULL, 0이다.
    3. 결과 컬럼은 MON, Y_S, Y_C, C_S, C_C이고, MON이 '02'인 행의 값은 300, 1, NULL, NULL이다.
    4. 결과 컬럼은 MON, Y_S, Y_C, C_S, C_C이고, MON이 '02'인 행의 값은 300, 1, NULL, 0이다.
  41. 41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, C1, C2 순서로 표기)

    SELECT REGEXP_REPLACE('KE0123', '([A-Z]{2})0*([0-9]+)', '\1-\2') AS C1,
           REGEXP_SUBSTR('ICN>NRT>LAX', '[^>]+', 1, 3)               AS C2
      FROM DUAL;
    1. KE-0123, LAX
    2. KE-123, LAX
    3. KE-123, NRT
    4. KE0123, LAX
  42. 42. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, C1, C2, C3 순서로 표기)

    SELECT REGEXP_COUNT('Seat 12a, seat 12A, SEAT 3B', 'seat', 1, 'ic')        AS C1,
           REGEXP_COUNT('Seat 12a, seat 12A, SEAT 3B', '[0-9]+[a-z]', 1, 'i') AS C2,
           REGEXP_INSTR('Seat 12a, seat 12A, SEAT 3B', '\d+', 1, 3)           AS C3
      FROM DUAL;
    1. 1, 3, 26
    2. 3, 3, 26
    3. 1, 2, 26
    4. 1, 3, 27
  43. 43. 다음 두 테이블에 대해 아래 UPDATE 문을 실행(Oracle)한 후 SELECT SUM(fare), COUNT(fare) FROM flight;의 결과로 옳은 것은?

    FLIGHT

    FLT_NO FARE
    KE01 100
    OZ02 200
    LJ03 300
    7C04 400

    FARE_CHG

    FLT_NO NEW_FARE
    KE01 150
    LJ03 350
    ZE09 999
    UPDATE flight f
       SET fare = (SELECT c.new_fare
                     FROM fare_chg c
                    WHERE c.flt_no = f.flt_no);
    1. 1100, 4
    2. 500, 4
    3. 500, 2
    4. 1100, 2
  44. 44. 다음 두 테이블에 대해 아래 MERGE 문을 실행(Oracle)한 후 SELECT COUNT(*), SUM(avail) FROM seat_inv;의 결과로 옳은 것은?

    SEAT_INV

    FLT_NO CLASS AVAIL
    KE01 Y 10
    KE01 C 2
    OZ02 Y 5

    SEAT_CHG

    FLT_NO CLASS QTY
    KE01 Y -3
    KE01 C -5
    OZ02 C 4
    LJ03 Y 0
    MERGE INTO seat_inv t
    USING seat_chg s
       ON (t.flt_no = s.flt_no AND t.class = s.class)
     WHEN MATCHED THEN
          UPDATE SET t.avail = t.avail + s.qty
           WHERE t.avail + s.qty >= 0
     WHEN NOT MATCHED THEN
          INSERT (flt_no, class, avail)
          VALUES (s.flt_no, s.class, s.qty)
           WHERE s.qty > 0;
    1. 5, 18
    2. 4, 13
    3. 3, 14
    4. 4, 18
  45. 45. SEAT_CNT 테이블에는 AVAIL 값이 10인 한 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행한 후 SELECT avail FROM seat_cnt;의 결과는? (오류가 발생한 문장은 무시하고 다음 문장이 실행된다고 가정한다.)

    UPDATE seat_cnt SET avail = avail - 1;
    SAVEPOINT sp;
    UPDATE seat_cnt SET avail = avail - 2;
    SAVEPOINT sp;
    UPDATE seat_cnt SET avail = avail - 3;
    SAVEPOINT sp2;
    UPDATE seat_cnt SET avail = avail - 4;
    ROLLBACK TO sp;
    ROLLBACK TO sp2;
    UPDATE seat_cnt SET avail = avail - 1;
    COMMIT;
    1. 8
    2. 6
    3. 3
    4. 9
  46. 46. 트랜잭션 TX1이 좌석 12A의 운임을 조회하여 300,000원을 확인했다. 그 사이 TX2가 같은 좌석의 운임을 350,000원으로 UPDATE하고 COMMIT했고, TX1이 같은 조회를 다시 실행하자 350,000원이 조회되었다.

    이 현상의 이름과, 이 현상을 방지할 수 있는 가장 낮은 격리 수준(ANSI 표준 기준)을 바르게 짝지은 것은?

    1. Non-Repeatable Read – REPEATABLE READ
    2. Phantom Read – SERIALIZABLE
    3. Dirty Read – READ COMMITTED
    4. Non-Repeatable Read – READ COMMITTED
  47. 47. 다음과 같이 테이블을 만들고 ㄱ~ㅁ의 INSERT 문을 순서대로 실행했다. Oracle과 SQL Server에서 각각 성공하는 INSERT 문의 개수로 옳은 것은? (SQL Server에서는 VARCHAR2 대신 VARCHAR, NUMBER 대신 INT로 같은 구조를 만들었다고 가정하며, 오류가 난 문장은 무시하고 진행한다.)

    CREATE TABLE pax_t (
      pax_id    NUMBER PRIMARY KEY,
      passport  VARCHAR2(9) UNIQUE,
      mile      NUMBER CHECK (mile >= 0)
    );
    
    INSERT INTO pax_t VALUES (1, 'M1', 0);      -- ㄱ
    INSERT INTO pax_t VALUES (2, NULL, NULL);   -- ㄴ
    INSERT INTO pax_t VALUES (3, NULL, 100);    -- ㄷ
    INSERT INTO pax_t VALUES (4, 'M1', 50);     -- ㄹ
    INSERT INTO pax_t VALUES (5, 'M2', -10);    -- ㅁ
    1. Oracle 2개 / SQL Server 2개
    2. Oracle 3개 / SQL Server 3개
    3. Oracle 4개 / SQL Server 3개
    4. Oracle 3개 / SQL Server 2개
  48. 48. VIEW, INDEX, SEQUENCE에 대한 설명으로 가장 적절한 것은?

    1. 뷰는 생성 시점의 조회 결과를 별도로 저장하므로, 원본 테이블을 삭제해도 뷰는 계속 조회할 수 있다.
    2. 인덱스를 많이 만들수록 조회뿐 아니라 INSERT·UPDATE·DELETE 성능도 함께 좋아진다.
    3. Oracle에서는 ALTER VIEW로 뷰의 SELECT 정의를 바꿀 수 없으므로, CREATE OR REPLACE VIEW로 다시 생성한다.
    4. SQL Server는 순차 번호 생성에 IDENTITY 속성을 사용할 수 없으므로 반드시 SEQUENCE 객체를 만들어야 한다.
  49. 49. DBA가 아래 문장을 순서대로 실행했다. 실행 후 KIM과 LEE가 가진 권한으로 옳은 것은? (Oracle, 두 사용자는 이 문장들 외에 다른 권한이 없다.)

    CREATE ROLE r_read;
    GRANT SELECT ON air.flight TO r_read;
    
    CREATE ROLE r_agent;
    GRANT r_read TO r_agent;
    GRANT INSERT ON air.booking TO r_agent;
    
    GRANT r_agent TO kim;
    GRANT r_read  TO lee;
    
    REVOKE SELECT ON air.flight FROM r_read;
    1. KIM: FLIGHT SELECT, BOOKING INSERT / LEE: 없음
    2. KIM: BOOKING INSERT / LEE: 없음
    3. KIM: FLIGHT SELECT, BOOKING INSERT / LEE: FLIGHT SELECT
    4. KIM: BOOKING INSERT / LEE: FLIGHT SELECT
  50. 50. Oracle의 DCL에 대한 설명으로 가장 적절한 것은?

    1. WITH GRANT OPTION은 오브젝트 권한을, WITH ADMIN OPTION은 시스템 권한이나 롤을 다른 사용자에게 다시 부여할 수 있게 한다.
    2. WITH ADMIN OPTION으로 받은 시스템 권한을 회수하면, 그 사용자가 다른 사용자에게 부여한 같은 권한도 연쇄적으로 회수된다.
    3. CONNECT, RESOURCE 같은 롤은 Oracle이 제공하지 않으므로 DBA가 직접 CREATE ROLE로 만들어야 사용할 수 있다.
    4. GRANT나 REVOKE를 실행해도 진행 중인 트랜잭션의 DML은 커밋되지 않고 그대로 유지된다.

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