SQLD 모의고사 19회

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

  1. 1. 영화관 예매 시스템을 설계하면서 업무를 여러 관점에서 분석하고 있다. 데이터 모델링의 세 가지 관점과 그 분석 활동을 짝지은 것으로 가장 적절한 것은?

    1. 데이터 관점 - 예매 접수부터 결제·발권까지 업무가 어떤 순서로 처리되는지 시나리오로 분석한다.
    2. 상관 관점 - '예매 취소' 업무가 수행될 때 좌석 데이터의 상태가 어떻게 바뀌는지 CRUD 매트릭스로 분석한다.
    3. 프로세스 관점 - 관객과 예매 엔터티 사이에 어떤 관계가 있는지 정의한다.
    4. 상관 관점 - 관객 엔터티가 가져야 할 속성(이름, 생년월일 등)을 도출한다.
  2. 2. 공연 예매 시스템의 엔터티 이름을 정하려고 한다. 엔터티 명명 원칙에 대한 설명으로 가장 적절하지 않은 것은?

    1. 가능하면 현업에서 실제로 쓰는 업무 용어를 사용한다.
    2. 약어 사용은 가급적 제한하여 PRF_SCH보다 공연회차처럼 의미가 드러나게 한다.
    3. 엔터티는 여러 인스턴스의 집합이지만 이름은 관객들이 아닌 관객처럼 단수 명사로 쓴다.
    4. 같은 의미의 엔터티라도 사용하는 부서가 다르면 영업예매, 고객센터예매처럼 부서별로 다른 이름을 부여해 구분한다.
  3. 3. 상영 엔터티에 상영번호, 영화코드, 상영관번호, 상영시작시각 속성이 정의되어 있다. 엔터티·인스턴스·속성·속성값의 관계에 대한 설명으로 가장 적절한 것은?

    1. 하나의 상영 인스턴스에서 '상영시작시각' 속성은 하나의 속성값만 가진다.
    2. 상영 엔터티는 인스턴스가 1건만 존재하더라도 엔터티로 성립하는 데 문제가 없다.
    3. 하나의 상영 인스턴스는 엔터티에 정의된 속성 중 업무상 필요한 일부 속성만 선택적으로 가진다.
    4. 한 상영의 상영시작시각이 여러 개 필요하다면 하나의 속성에 '10:00,13:30'처럼 여러 값을 함께 저장하는 것이 원칙이다.
  4. 4. 다음 중 관계(Relationship)와 관계 페어링(Pairing)에 대한 설명으로 가장 적절한 것은?

    1. 관계 페어링은 엔터티와 엔터티 사이의 연관성을 뜻하고, 관계는 개별 인스턴스 사이의 연결을 뜻한다.
    2. 한 엔터티에 속한 인스턴스들은 모두 동일한 관계 페어링을 가져야 한다.
    3. 관객 '김영희'가 예매 'B001'을 신청한 것처럼 인스턴스 간의 개별 연결이 관계 페어링이며, 관계 페어링의 집합이 관계이다.
    4. 두 엔터티 사이에는 오직 하나의 관계만 정의할 수 있다.
  5. 5. 예매 엔터티의 속성이 다음과 같다.

    • 예매번호: 예매 시 시스템이 순차적으로 부여하는 번호. 다른 엔터티(결제, 발권)가 이 값을 참조한다.
    • 모바일티켓번호: 예매마다 유일하게 발급되며 예매번호 대신 인스턴스를 식별할 수도 있다. 다른 엔터티가 참조하지 않는다.
    • 관객번호: 관객 엔터티의 주식별자를 관계를 통해 받아온 속성

    식별자 분류에 대한 설명으로 가장 적절한 것은?

    1. 예매번호는 다른 엔터티와 관계를 연결하는 데 쓰일 수 없으므로 보조식별자이다.
    2. 모바일티켓번호는 인스턴스를 유일하게 식별할 수 있지만 대표성을 갖지 못하므로 보조식별자이다.
    3. 관객번호는 예매 엔터티 내부에서 스스로 만들어진 내부식별자이다.
    4. 예매번호는 시스템이 순차적으로 부여한 값이므로 본질식별자에 해당한다.
  6. 6. 다음 상영 테이블의 PK는 상영ID 단일 컬럼이다. 업무 규칙상 영화제목과 러닝타임은 영화코드에 의해 결정된다.

    상영ID 영화코드 영화제목 러닝타임 상영관번호 상영일시
    S01 M10 파묘 134 1 2026-10-20 10:00
    S02 M10 파묘 134 2 2026-10-20 13:00
    S03 M20 듄 166 1 2026-10-20 14:00

    영화 '듄'의 유일한 상영 일정인 S03을 삭제하자 '듄'의 제목과 러닝타임 정보까지 함께 사라졌다. 이 현상과 그 해결 방법을 짝지은 것으로 가장 적절한 것은?

    1. 삽입 이상 - 다중값 종속을 제거하는 제4정규화
    2. 삭제 이상 - 부분 함수 종속을 제거하는 제2정규화
    3. 갱신 이상 - 이행 함수 종속을 제거하는 제3정규화
    4. 삭제 이상 - 이행 함수 종속을 제거하는 제3정규화
  7. 7. 상영관 → 상영 → 예매로 이어지는 1:M 관계를 두 가지 방식으로 설계하였다. 예매 건별로 상영관명을 조회하려 할 때의 설명으로 가장 적절한 것은?

    -- (A) 식별 관계로 설계
    상영관 (상영관번호 PK, 상영관명)
    상영   (상영관번호 PK/FK, 상영순번 PK, 영화코드, 시작시각)
    예매   (상영관번호 PK/FK, 상영순번 PK/FK, 좌석번호 PK, 관객번호)
    
    -- (B) 비식별 관계로 설계
    상영관 (상영관번호 PK, 상영관명)
    상영   (상영ID PK, 상영관번호 FK, 영화코드, 시작시각)
    예매   (예매ID PK, 상영ID FK, 좌석번호, 관객번호)
    1. 두 설계 모두 예매와 상영관을 연결하려면 반드시 상영 테이블을 거쳐 조인해야 한다.
    2. (B) 설계에서는 예매에 상영관번호가 있으므로 상영을 거치지 않고 상영관과 바로 조인할 수 있다.
    3. (A) 설계에서는 예매의 PK에 상영관번호가 상속되어 있으므로 상영을 거치지 않고 예매와 상영관을 직접 조인할 수 있다.
    4. (A) 설계는 (B) 설계보다 예매의 PK 컬럼 수가 적어 하위 테이블로의 조인 조건이 더 단순하다.
  8. 8. 공연 예매 트랜잭션과 관련된 상황을 트랜잭션의 특성(ACID)과 짝지었다. 가장 적절하지 않은 것은?

    1. 좌석 2매를 예매하던 중 두 번째 좌석 INSERT가 실패하자 이미 입력된 첫 번째 좌석까지 모두 취소되었다. - 일관성(Consistency)
    2. 결제 완료 후 COMMIT 응답을 받은 직후 서버가 다운되었지만, 재기동 후에도 예매 내역이 그대로 남아 있었다. - 지속성(Durability)
    3. 관객 A의 예매 트랜잭션이 끝나기 전에는 관객 B가 '좌석은 점유되었으나 결제는 안 된' 중간 상태를 볼 수 없다. - 고립성(Isolation)
    4. '한 회차의 한 좌석에는 유효한 예매가 1건만 존재한다'는 규칙이 트랜잭션 수행 전후에 모두 지켜진다. - 일관성(Consistency)
  9. 9. Oracle에서 다음과 같이 테이블을 만들고 데이터를 입력하였다. SQL의 결과로 옳은 것은? (결과는 C1 / C2 / C3 순서)

    CREATE TABLE AUD_MEMO (ID NUMBER, NOTE VARCHAR2(10));
    INSERT INTO AUD_MEMO VALUES (1, 'VIP');
    INSERT INTO AUD_MEMO VALUES (2, '');
    INSERT INTO AUD_MEMO VALUES (3, NULL);
    INSERT INTO AUD_MEMO VALUES (4, ' ');
    
    SELECT COUNT(NOTE)                                AS C1,
           SUM(CASE WHEN NOTE IS NULL THEN 1 ELSE 0 END) AS C2,
           SUM(NVL(LENGTH(NOTE), 0))                    AS C3
      FROM AUD_MEMO;
    1. 3 / 1 / 4
    2. 2 / 2 / 3
    3. 3 / 1 / 3
    4. 2 / 2 / 4
  10. 10. 예매좌석 엔터티의 본질식별자는 (예매번호, 상영ID, 좌석번호)이다. 이 식별자가 하위 엔터티(발권, 입장기록)로 계속 상속되어 설계자가 인조식별자 예매좌석ID(시퀀스)를 PK로 도입하려 한다. 이에 대한 설명으로 가장 적절하지 않은 것은?

    1. 하위 엔터티로 상속되는 FK 컬럼 수가 줄어 조인 조건과 SQL이 단순해진다.
    2. PK가 예매좌석ID 하나로 바뀌어도 같은 상영의 같은 좌석이 중복 입력되는 것은 PK 제약이 막아 주므로 별도의 제약은 필요 없다.
    3. 실제 조회가 주로 (상영ID, 좌석번호) 조건으로 이루어진다면 PK 인덱스 외에 별도의 인덱스가 추가로 필요해질 수 있다.
    4. 본질식별자를 구성하는 컬럼이 많아 하위로 계속 상속되는 경우는 인조식별자 도입을 검토할 만한 상황이다.
  11. 11. 다음 두 릴레이션에 대해 **'모든 상영관에서 한 번 이상 상영된 영화'**를 구하려고 한다. 이 요구에 해당하는 관계 연산과 그 결과로 가장 적절한 것은?

    [상영실적]

    영화 상영관
    A 1
    A 2
    A 3
    B 1
    B 2
    C 1
    C 2
    C 3

    [상영관목록]

    상영관
    1
    2
    3
    1. 곱집합(Product) - A, C
    2. 조인(Join) - A, B, C
    3. 나누기(Division) - A, C
    4. 나누기(Division) - A, B, C
  12. 12. 다음 [TICKET] 테이블에 SQL을 실행했을 때 AMT 값을 TID 순서대로 나열한 것으로 옳은 것은?

    [TICKET]

    TID PRICE QTY DISC
    1 12000 2 1000
    2 15000 1 NULL
    3 NULL 3 0
    4 10000 2 500
    SELECT TID, PRICE * QTY - DISC * 2 AS AMT
      FROM TICKET
     ORDER BY TID;
    1. 22000, NULL, NULL, 19000
    2. 22000, 15000, NULL, 19000
    3. 46000, NULL, 0, 39000
    4. 22000, 15000, 0, 19000
  13. 13. 다음 [BOOKING] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과로 옳은 것은? ((가)와 (다)는 결과 행 수, (나)는 결과 값)

    [BOOKING]

    SHOW_ID SEAT_GRADE
    S1 R
    S1 R
    S1 NULL
    S2 S
    S2 NULL
    S2 NULL
    S1 S
    -- (가)
    SELECT DISTINCT SHOW_ID, SEAT_GRADE FROM BOOKING;
    
    -- (나)
    SELECT COUNT(DISTINCT SEAT_GRADE) FROM BOOKING;
    
    -- (다)
    SELECT DISTINCT SEAT_GRADE FROM BOOKING;
    1. (가) 5 / (나) 3 / (다) 3
    2. (가) 7 / (나) 2 / (다) 3
    3. (가) 5 / (나) 2 / (다) 2
    4. (가) 5 / (나) 2 / (다) 3
  14. 14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C 순서)

    SELECT SUBSTR('SEAT-H12', -3, 2)                        AS A,
           REPLACE('2026-10-20', '-')                       AS B,
           UPPER(SUBSTR('imax', 1, 1)) || LOWER(SUBSTR('IMAX', 2)) AS C
      FROM DUAL;
    1. 12 / 20261020 / Imax
    2. H1 / 20261020 / Imax
    3. H1 / 2026 10 20 / IMAX
    4. -H / NULL / Imax
  15. 15. 영화의 러닝타임 135분을 여러 형태로 표시하려고 한다. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C 순서)

    SELECT TRUNC(135 / 60) || '시간 ' || MOD(135, 60) || '분' AS A,
           CEIL(135 / 60)                                      AS B,
           ROUND(135 / 60, 1)                                  AS C
      FROM DUAL;
    1. 2시간 15분 / 2 / 2.2
    2. 2.25시간 15분 / 3 / 2.3
    3. 2시간 15분 / 3 / 2.3
    4. 2시간 15분 / 3 / 2.2
  16. 16. 다음 [SHOW] 테이블에 SQL을 실행했을 때 GB 값을 ID 순서대로 나열한 것으로 옳은 것은? (Oracle, 문자열 비교는 대소문자를 구분한다.)

    [SHOW]

    ID DT HH
    1 SAT 9
    2 SUN 14
    3 MON 23
    4 TUE 15
    5 sat 20
    SELECT ID,
           CASE WHEN HH < 11  THEN '조조'
                WHEN HH >= 22 THEN '심야'
                ELSE DECODE(DT, 'SAT', '주말',
                                'SUN', '주말',
                                       '일반')
           END AS GB
      FROM SHOW
     ORDER BY ID;
    1. 조조, 주말, 심야, 일반, 일반
    2. 조조, 주말, 심야, 일반, 주말
    3. 주말, 주말, 심야, 일반, 일반
    4. 조조, 주말, 일반, 일반, 일반
  17. 17. 다음 [BOOKING] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과로 옳은 것은?

    [BOOKING]

    ID PRICE GRADE
    1 15000 VIP
    2 12000 R
    3 9000 NULL
    4 13000 S
    5 8000 R
    -- (가)
    SELECT COUNT(*) FROM BOOKING WHERE PRICE BETWEEN 13000 AND 9000;
    
    -- (나)
    SELECT COUNT(*) FROM BOOKING WHERE GRADE NOT IN ('VIP', 'S');
    
    -- (다)
    SELECT COUNT(*) FROM BOOKING WHERE NOT (GRADE = 'R' OR PRICE > 13000);
    1. (가) 2 / (나) 2 / (다) 2
    2. (가) 0 / (나) 3 / (다) 2
    3. (가) 2 / (나) 2 / (다) 1
    4. (가) 0 / (나) 2 / (다) 1
  18. 18. [BOOKING] 테이블의 PRICE 컬럼 값이 다음과 같다. 아래 SQL의 빈칸에 각 조건을 넣었을 때, 결과 값이 나머지 셋과 다른 조건은? (Oracle)

    PRICE
    8000
    10000
    12000
    NULL
    15000
    SELECT COUNT(*)
      FROM BOOKING
     WHERE ________ ;
    1. NOT PRICE < 10000
    2. NVL(PRICE, 10000) >= 10000
    3. PRICE BETWEEN 10000 AND 15000
    4. PRICE IN (10000, 12000, 15000)
  19. 19. 다음 [BOOKING] 테이블에 SQL을 실행한 결과로 옳은 것은?

    [BOOKING]

    MOVIE CUST QTY
    파묘 C1 2
    파묘 C1 1
    파묘 C2 1
    듄 C1 4
    듄 C1 1
    웡카 C2 1
    웡카 C3 1
    웡카 C4 1
    SELECT MOVIE, COUNT(*) AS CNT, SUM(QTY) AS TOT
      FROM BOOKING
     GROUP BY MOVIE
    HAVING COUNT(DISTINCT CUST) >= 2
       AND SUM(QTY) > 3
     ORDER BY MOVIE;
    1. 파묘 | 3 | 4 (1행)
    2. 파묘 | 2 | 4 (1행)
    3. 웡카 | 3 | 3, 파묘 | 3 | 4 (2행)
    4. 듄 | 2 | 5, 파묘 | 3 | 4 (2행)
  20. 20. MOVIE(TITLE, GENRE, RATING, RUNTIME) 테이블에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?

    -- (가)
    SELECT GENRE, COUNT(*) FROM MOVIE GROUP BY GENRE, RATING;
    
    -- (나)
    SELECT COUNT(*) FROM MOVIE GROUP BY GENRE;
    
    -- (다)
    SELECT GENRE, RUNTIME, AVG(RUNTIME) FROM MOVIE GROUP BY GENRE;
    
    -- (라)
    SELECT GENRE, MAX(RUNTIME) - MIN(RUNTIME)
      FROM MOVIE
     GROUP BY GENRE
    HAVING AVG(RUNTIME) > 100;
    1. (가)
    2. (나)
    3. (다)
    4. (라)
  21. 21. ORDER BY 절에 대한 설명으로 가장 적절한 것은? (Oracle 기준)

    1. ORDER BY 2와 같은 위치 번호는 SELECT 목록에 없는 컬럼을 가리키는 데에도 사용할 수 있다.
    2. ORDER BY 절은 SELECT 절보다 나중에 처리되므로 SELECT에서 정의한 별칭을 사용할 수 있고, 별칭·위치 번호·컬럼명을 섞어서 쓸 수도 있다.
    3. 인라인 뷰 안에서 ORDER BY 절을 사용하면 문법 오류가 발생한다.
    4. ORDER BY 절을 생략하면 결과는 항상 PK 오름차순으로 정렬되어 출력된다.
  22. 22. 다음 [SHOW] 테이블에 SQL을 실행한 결과의 ID 출력 순서로 옳은 것은? (Oracle, 문자는 '1관' < '2관' 순서로 정렬된다.)

    [SHOW]

    ID SCREEN START_TM
    1 2관 14:00
    2 1관 NULL
    3 1관 10:30
    4 2관 09:00
    5 NULL 11:00
    SELECT ID
      FROM SHOW
     ORDER BY SCREEN DESC, START_TM;
    1. 4, 1, 3, 2, 5
    2. 5, 1, 4, 2, 3
    3. 4, 1, 2, 3, 5
    4. 5, 4, 1, 3, 2
  23. 23. 좌석 배치도에서 **나란히 붙은 두 빈 좌석(연석)**을 찾으려고 한다. 다음 [SEAT] 테이블에 SQL을 실행했을 때 결과 행 수는?

    [SEAT]

    ROW_CD NO ST
    A 1 빈
    A 2 빈
    A 3 빈
    A 4 예매
    A 5 빈
    B 1 예매
    B 2 빈
    B 3 빈
    C 1 빈
    SELECT A.ROW_CD, A.NO AS NO1, B.NO AS NO2
      FROM SEAT A, SEAT B
     WHERE A.ROW_CD = B.ROW_CD
       AND B.NO     = A.NO + 1
       AND A.ST     = '빈'
       AND B.ST     = '빈';
    1. 3
    2. 4
    3. 5
    4. 6
  24. 24. 다음 세 테이블에 SQL을 실행한 결과로 옳은 것은?

    [AUDIENCE]

    AID NAME AGE
    1 민수 8
    2 지영 17
    3 철수 35
    4 영희 70

    [AGE_RULE]

    GB MIN_AGE MAX_AGE RATE
    어린이 0 12 50
    청소년 13 18 30
    성인 19 64 0
    경로 65 120 40

    [BOOKING]

    BID AID PRICE
    B1 1 10000
    B2 2 12000
    B3 3 12000
    B4 3 15000
    B5 5 10000
    SELECT SUM(B.PRICE * (100 - R.RATE) / 100) AS PAY
      FROM BOOKING B, AUDIENCE A, AGE_RULE R
     WHERE B.AID = A.AID
       AND A.AGE BETWEEN R.MIN_AGE AND R.MAX_AGE;
    1. 34400
    2. 49000
    3. 40400
    4. 50400
  25. 25. 다음 세 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 값으로 옳은 것은?

    [MOVIE]

    MID
    M1
    M2
    M3

    [SHOW]

    SID MID HID
    S1 M1 H1
    S2 M1 H2
    S3 M2 H9

    [HALL]

    HID
    H1
    H2
    H3
    -- (가)
    SELECT COUNT(*)
      FROM MOVIE M
      LEFT OUTER JOIN SHOW S ON M.MID = S.MID
      LEFT OUTER JOIN HALL H ON S.HID = H.HID;
    
    -- (나)
    SELECT COUNT(*)
      FROM MOVIE M
      LEFT OUTER JOIN SHOW S ON M.MID = S.MID
     INNER JOIN HALL H       ON S.HID = H.HID;
    1. (가) 4 / (나) 4
    2. (가) 3 / (나) 2
    3. (가) 4 / (나) 3
    4. (가) 4 / (나) 2
  26. 26. 다음 [MOVIE], [SHOW] 테이블에 SQL을 실행한 결과로 옳은 것은? (C1 / C2 순서)

    [MOVIE]

    MID GENRE
    M1 액션
    M2 드라마
    M3 액션

    [SHOW]

    SID MID
    S1 M1
    S2 M2
    S3 M2
    S4 M3
    SELECT COUNT(*) AS C1, COUNT(S.SID) AS C2
      FROM MOVIE M
      LEFT OUTER JOIN SHOW S
        ON M.MID   = S.MID
       AND M.GENRE = '액션';
    1. 2 / 2
    2. 3 / 2
    3. 4 / 2
    4. 3 / 3
  27. 27. 다음 [BOOKING] 테이블에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?

    [BOOKING]

    BID MID PRICE
    B1 M1 12000
    B2 M1 15000
    B3 M2 9000
    B4 M3 15000
    B5 M2 12000
    -- (가)
    SELECT BID FROM BOOKING
     WHERE PRICE = (SELECT PRICE FROM BOOKING WHERE MID = 'M1');
    
    -- (나)
    SELECT BID FROM BOOKING
     WHERE PRICE = (SELECT MAX(PRICE) FROM BOOKING WHERE MID = 'M1');
    
    -- (다)
    SELECT BID FROM BOOKING
     WHERE PRICE = (SELECT PRICE FROM BOOKING WHERE MID = 'M3');
    
    -- (라)
    SELECT BID FROM BOOKING
     WHERE PRICE = (SELECT PRICE FROM BOOKING WHERE MID = 'M9');
    1. (가)
    2. (나)
    3. (다)
    4. (라)
  28. 28. 다음 [MOVIE], [SHOW] 테이블에 SQL을 실행한 결과로 옳은 것은? (출력 순서대로 표기)

    [MOVIE]

    MID TITLE
    M1 파묘
    M2 듄
    M3 웡카
    M4 범죄도시

    [SHOW]

    MID HID
    M1 H1
    M1 H2
    M2 H1
    M2 H3
    M3 H2
    M4 H1
    M4 H1
    SELECT M.TITLE
      FROM MOVIE M
     WHERE EXISTS     (SELECT 1 FROM SHOW S
                        WHERE S.MID = M.MID AND S.HID = 'H1')
       AND NOT EXISTS (SELECT 1 FROM SHOW S
                        WHERE S.MID = M.MID AND S.HID = 'H2')
     ORDER BY M.MID;
    1. 듄
    2. 파묘, 듄, 범죄도시
    3. 듄, 범죄도시
    4. 듄, 범죄도시, 범죄도시
  29. 29. 온라인 예매 고객과 현장 예매 고객 테이블이 다음과 같다. (가)~(다) SQL의 결과 행 수로 옳은 것은? (Oracle)

    [ONLINE_BK]

    CUST
    C1
    C2
    C2
    C3

    [OFFLINE_BK]

    CUST
    C3
    C4
    C4
    -- (가)
    SELECT CUST FROM ONLINE_BK
    UNION
    SELECT CUST FROM OFFLINE_BK WHERE 1 = 2;
    
    -- (나)
    SELECT CUST FROM ONLINE_BK
    MINUS
    SELECT CUST FROM OFFLINE_BK;
    
    -- (다)
    SELECT CUST FROM OFFLINE_BK
    INTERSECT
    SELECT CUST FROM ONLINE_BK;
    1. (가) 4 / (나) 3 / (다) 1
    2. (가) 3 / (나) 2 / (다) 1
    3. (가) 3 / (나) 3 / (다) 2
    4. (가) 4 / (나) 2 / (다) 1
  30. 30. 두 이벤트의 쿠폰 사용 기록이 다음과 같다. (가), (나) SQL의 결과로 옳은 것은? (Oracle, 행의 순서는 고려하지 않는다.)

    [EVENT_A]

    COUPON_CD
    A10
    NULL
    B20
    B20

    [EVENT_B]

    COUPON_CD
    NULL
    B20
    C30
    -- (가)
    SELECT COUPON_CD FROM EVENT_A
    INTERSECT
    SELECT COUPON_CD FROM EVENT_B;
    
    -- (나)
    SELECT COUPON_CD FROM EVENT_A
    MINUS
    SELECT COUPON_CD FROM EVENT_B;
    1. (가) B20 (1행) / (나) A10, NULL (2행)
    2. (가) B20 (1행) / (나) A10 (1행)
    3. (가) B20, B20 (2행) / (나) A10 (1행)
    4. (가) NULL, B20 (2행) / (나) A10 (1행)
  31. 31. 다음 [SALES] 테이블에 SQL을 실행했다. 결과에서 MOVIE가 NULL로 출력되는 행의 수와, 그중 G가 0인 행의 TOT 값으로 옳은 것은?

    [SALES]

    THEATER MOVIE AMT
    강남 파묘 100
    강남 듄 200
    홍대 파묘 300
    홍대 NULL 50
    SELECT THEATER, MOVIE, SUM(AMT) AS TOT,
           GROUPING(MOVIE) AS G
      FROM SALES
     GROUP BY ROLLUP(THEATER, MOVIE);
    1. 4행 / 50
    2. 3행 / 50
    3. 4행 / 350
    4. 3행 / 350
  32. 32. 다음 [SALES] 테이블에 SQL을 실행했을 때 결과 행 수는?

    [SALES]

    THEATER MOVIE GRADE AMT
    강남 파묘 일반 10
    강남 파묘 VIP 20
    강남 듄 일반 30
    홍대 파묘 일반 40
    홍대 파묘 일반 50
    SELECT THEATER, MOVIE, GRADE, SUM(AMT)
      FROM SALES
     GROUP BY THEATER, CUBE(MOVIE, GRADE);
    1. 10
    2. 11
    3. 12
    4. 14
  33. 33. 다음 [REVIEW] 테이블에 SQL을 실행했을 때, RID가 3인 행의 RN, RK, CN 값으로 옳은 것은?

    [REVIEW]

    RID MOVIE STAR
    1 파묘 5
    2 파묘 3
    3 파묘 5
    4 듄 4
    5 듄 2
    6 파묘 4
    SELECT RID,
           ROW_NUMBER() OVER (PARTITION BY MOVIE ORDER BY STAR DESC, RID) AS RN,
           RANK()       OVER (PARTITION BY MOVIE ORDER BY STAR DESC)      AS RK,
           COUNT(*)     OVER (PARTITION BY MOVIE ORDER BY STAR DESC)      AS CN
      FROM REVIEW;
    1. 2 / 1 / 1
    2. 1 / 1 / 2
    3. 2 / 2 / 2
    4. 2 / 1 / 2
  34. 34. 다음 [DAILY_AUD] 테이블에 SQL을 실행했을 때 S 값을 DAY 순서대로 나열한 것으로 옳은 것은? (DAY는 숫자형)

    [DAILY_AUD]

    DAY AUD
    1 100
    2 200
    4 300
    5 100
    8 400
    SELECT DAY,
           SUM(AUD) OVER (ORDER BY DAY
                          RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) AS S
      FROM DAILY_AUD
     ORDER BY DAY;
    1. 100, 300, 600, 600, 800
    2. 100, 300, 500, 400, 400
    3. 100, 300, 500, 600, 800
    4. 100, 300, 600, 400, 400
  35. 35. MOVIE(TITLE, GENRE, AUD) 테이블에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?

    -- (가)
    SELECT TITLE FROM MOVIE
     WHERE RANK() OVER (ORDER BY AUD DESC) <= 3;
    
    -- (나)
    SELECT TITLE
      FROM (SELECT TITLE, RANK() OVER (ORDER BY AUD DESC) AS RK FROM MOVIE)
     WHERE RK <= 3;
    
    -- (다)
    SELECT TITLE, AUD FROM MOVIE
     ORDER BY RANK() OVER (ORDER BY AUD DESC);
    
    -- (라)
    SELECT GENRE, SUM(AUD),
           RANK() OVER (ORDER BY SUM(AUD) DESC) AS RK
      FROM MOVIE
     GROUP BY GENRE;
    1. (가)
    2. (나)
    3. (다)
    4. (라)
  36. 36. SHOW_STAT(HALL, TITLE, AUD) 테이블에서 상영관(HALL)별로 관객수(AUD)가 가장 많은 영화를 조회하려 한다. 같은 상영관에서 최다 관객수가 동률이면 해당 영화를 모두 출력해야 한다. 요구사항을 만족하는 SQL은? (Oracle 12c 이상)

    -- (가)
    SELECT HALL, TITLE
      FROM (SELECT HALL, TITLE,
                   ROW_NUMBER() OVER (PARTITION BY HALL ORDER BY AUD DESC) AS RN
              FROM SHOW_STAT)
     WHERE RN = 1;
    
    -- (나)
    SELECT HALL, TITLE
      FROM (SELECT HALL, TITLE FROM SHOW_STAT ORDER BY AUD DESC)
     WHERE ROWNUM <= 1;
    
    -- (다)
    SELECT HALL, TITLE
      FROM (SELECT HALL, TITLE,
                   RANK() OVER (PARTITION BY HALL ORDER BY AUD DESC) AS RK
              FROM SHOW_STAT)
     WHERE RK = 1;
    
    -- (라)
    SELECT HALL, TITLE
      FROM SHOW_STAT
     ORDER BY AUD DESC
     FETCH FIRST 1 ROWS WITH TIES;
    1. (가)
    2. (나)
    3. (다)
    4. (라)
  37. 37. 다음 [MOVIE] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, 출력 순서대로 표기)

    [MOVIE]

    TITLE AUD
    파묘 1000
    듄 NULL
    웡카 800
    범죄도시 1200
    외계인 800
    SELECT TITLE
      FROM (SELECT TITLE, AUD
              FROM MOVIE
             ORDER BY AUD DESC)
     WHERE ROWNUM <= 3;
    1. 범죄도시, 파묘, 웡카
    2. 범죄도시, 파묘, 웡카, 외계인
    3. 범죄도시, 파묘, 듄
    4. 듄, 범죄도시, 파묘
  38. 38. 다음 [VENUE] 테이블에 SQL을 실행했을 때 결과 행 수와 '강남1관'의 LV 값으로 옳은 것은? (Oracle 기준)

    [VENUE]

    ID NAME PID
    1 전국 NULL
    2 서울 1
    3 부산 1
    4 강남점 2
    5 홍대점 2
    6 서면점 3
    7 강남1관 4
    8 강남2관 4
    9 홍대1관 5
    SELECT NAME, LEVEL AS LV
      FROM VENUE
     START WITH NAME = '서울'
    CONNECT BY PRIOR ID = PID;
    1. 6행 / 4
    2. 6행 / 3
    3. 9행 / 3
    4. 5행 / 3
  39. 39. 다음 [VENUE] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준)

    [VENUE]

    ID NAME PID
    1 전국 NULL
    2 서울 1
    3 부산 1
    4 강남점 2
    5 홍대점 2
    6 서면점 3
    7 강남1관 4
    8 강남2관 4
    9 홍대1관 5
    SELECT NAME
      FROM VENUE
     WHERE CONNECT_BY_ISLEAF = 1
     START WITH NAME = '강남2관'
    CONNECT BY ID = PRIOR PID;
    1. 전국
    2. 강남2관
    3. 강남1관, 강남2관
    4. 서울
  40. 40. 다음 [BOOKING] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, THEATER | R | S 순서로 표기)

    [BOOKING]

    BID THEATER GRADE QTY
    1 강남 R 2
    2 강남 S 3
    3 강남 R 1
    4 홍대 S 4
    5 홍대 A 5
    SELECT *
      FROM (SELECT THEATER, GRADE, QTY FROM BOOKING)
     PIVOT (SUM(QTY) FOR GRADE IN ('R' AS R, 'S' AS S))
     ORDER BY THEATER;
    1. 강남 | 3 | 3, 홍대 | 0 | 4
    2. 강남 | 3 | 3, 홍대 | NULL | 9
    3. 강남 | 3 | 3, 홍대 | NULL | 4
    4. 강남 | 2 | 3, 홍대 | NULL | 4
  41. 41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, C1 / C2 순서)

    SELECT REGEXP_SUBSTR('파묘,,듄,웡카', '[^,]+', 1, 2) AS C1,
           REGEXP_COUNT('파묘,,듄,웡카', '[^,]+')        AS C2
      FROM DUAL;
    1. NULL / 4
    2. 듄 / 3
    3. NULL / 3
    4. 듄 / 4
  42. 42. 예매번호 형식은 'B + 숫자 4자리 + 하이픈 + 구분코드(M 또는 E)'이다. 다음 [BOOKING] 테이블에 SQL을 실행했을 때 결과 값은? (Oracle 기준)

    [BOOKING]

    BNO
    B2026-M
    B026-E
    b2026-M
    B2026-ME
    B20261-E
    B1234-E
    B0000-M
    B9999-E
    SELECT COUNT(*)
      FROM BOOKING
     WHERE REGEXP_LIKE(BNO, '^B[0-9]{4}-(M|E)$');
    1. 1
    2. 2
    3. 3
    4. 4
  43. 43. 다음 두 테이블에 대해 아래 MERGE 문을 실행(Oracle)한 후 SELECT SUM(PRICE) FROM SEAT_PRICE;의 결과는?

    [SEAT_PRICE]

    GRADE PRICE
    R 12000
    S 10000
    A 8000

    [NEW_PRICE]

    GRADE PRICE
    R 13000
    S 9000
    VIP 20000
    B 7000
    MERGE INTO SEAT_PRICE T
    USING NEW_PRICE S
       ON (T.GRADE = S.GRADE)
     WHEN MATCHED THEN
          UPDATE SET T.PRICE = S.PRICE
           WHERE S.PRICE > T.PRICE
     WHEN NOT MATCHED THEN
          INSERT (GRADE, PRICE) VALUES (S.GRADE, S.PRICE)
           WHERE S.PRICE >= 10000;
    1. 50000
    2. 57000
    3. 51000
    4. 58000
  44. 44. Oracle에서 아래 문장을 순서대로 실행한 후 마지막 SELECT의 결과로 옳은 것은? (C1 / C2 / C3 순서)

    CREATE TABLE TICKET (
      TID     NUMBER PRIMARY KEY,
      PRICE   NUMBER  DEFAULT 10000,
      STATUS  CHAR(1) DEFAULT 'N'
    );
    
    INSERT INTO TICKET (TID) VALUES (1);
    INSERT INTO TICKET VALUES (2, NULL, 'Y');
    INSERT INTO TICKET (TID, PRICE)
      SELECT TID + 10, PRICE * 2 FROM TICKET;
    UPDATE TICKET SET PRICE = PRICE + 1000 WHERE STATUS = 'N';
    
    SELECT COUNT(*) AS C1, COUNT(PRICE) AS C2, SUM(PRICE) AS C3
      FROM TICKET;
    1. 4 / 2 / 32000
    2. 4 / 4 / 63000
    3. 2 / 2 / 31000
    4. 4 / 2 / 31000
  45. 45. SEAT 테이블에는 ('A1', '빈'), ('A2', '빈') 두 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행하였다. 오류가 발생한 문장은 무시하고 진행했을 때, 최종적으로 SEAT의 전체 행 수와 ST가 '예매'인 행 수로 옳은 것은?

    UPDATE SEAT SET ST = '예매' WHERE NO = 'A1';
    SAVEPOINT SP1;
    UPDATE SEAT SET ST = '예매' WHERE NO = 'A2';
    SAVEPOINT SP2;
    DELETE FROM SEAT WHERE NO = 'A1';
    ROLLBACK TO SP1;
    INSERT INTO SEAT VALUES ('A3', '예매');
    COMMIT;
    ROLLBACK TO SP2;
    DELETE FROM SEAT WHERE ST = '빈';
    ROLLBACK;
    1. 2행 / 1행
    2. 3행 / 2행
    3. 3행 / 3행
    4. 2행 / 2행
  46. 46. 두 트랜잭션이 아래 순서로 실행되었다. TX1에서 발생한 현상과, 이 현상을 방지할 수 있는 가장 낮은 격리 수준을 짝지은 것으로 옳은 것은? (ANSI 표준 기준)

    -- ① TX1
    SELECT PRICE FROM SEAT_PRICE WHERE GRADE = 'VIP';   -- 15000
    
    -- ② TX2
    UPDATE SEAT_PRICE SET PRICE = 18000 WHERE GRADE = 'VIP';
    COMMIT;
    
    -- ③ TX1 (아직 같은 트랜잭션 안에서 다시 조회)
    SELECT PRICE FROM SEAT_PRICE WHERE GRADE = 'VIP';   -- 18000
    1. Dirty Read - READ COMMITTED
    2. Phantom Read - SERIALIZABLE
    3. Non-Repeatable Read - READ COMMITTED
    4. Non-Repeatable Read - REPEATABLE READ
  47. 47. Oracle에서 아래와 같이 SHOW_T 테이블을 생성한 뒤 ㄱ~ㅁ의 INSERT 문을 각각 실행하였다. 성공한 INSERT 문을 모두 고른 것은?

    CREATE TABLE SHOW_T (
      SID   NUMBER PRIMARY KEY,
      ST    NUMBER,
      ET    NUMBER,
      HALL  VARCHAR2(5) DEFAULT 'H1' NOT NULL,
      CONSTRAINT SHOW_T_CK CHECK (ET > ST)
    );
    
    -- ㄱ
    INSERT INTO SHOW_T (SID, ST, ET) VALUES (1, 900, 1100);
    -- ㄴ
    INSERT INTO SHOW_T VALUES (2, 1300, NULL, 'H2');
    -- ㄷ
    INSERT INTO SHOW_T VALUES (3, 1500, 1500, 'H2');
    -- ㄹ
    INSERT INTO SHOW_T VALUES (4, 1000, 1200, NULL);
    -- ㅁ
    INSERT INTO SHOW_T (SID, ET) VALUES (5, 800);
    1. ㄱ
    2. ㄱ, ㄹ
    3. ㄱ, ㄴ, ㅁ
    4. ㄱ, ㄴ, ㄹ, ㅁ
  48. 48. 공연 예매 DB에서 VIEW, INDEX, SEQUENCE를 활용하려 한다. 이에 대한 설명으로 가장 적절하지 않은 것은?

    1. 관객용 뷰의 SELECT 정의를 바꿀 때는 ALTER VIEW 뷰이름 AS SELECT ... 문으로 기존 정의를 수정한다.
    2. 뷰는 데이터를 직접 저장하지 않는 가상 테이블이며, 관객의 연락처처럼 민감한 컬럼을 빼고 필요한 컬럼만 노출하는 보안 목적으로 활용할 수 있다.
    3. 예매 테이블의 공연일자 컬럼에 인덱스를 만들면 조회는 빨라질 수 있지만, INSERT·UPDATE·DELETE 시 인덱스도 함께 갱신되어 부하가 늘어난다.
    4. Oracle에서는 SEQUENCE로 예매번호 같은 순번을 생성할 수 있고, SQL Server에서는 주로 IDENTITY 속성으로 자동 증가 값을 만든다.
  49. 49. 공연 예매 DB의 권한 관리에 대한 설명으로 가장 적절하지 않은 것은? (Oracle 기준)

    1. 테이블 소유자는 자신이 만든 테이블에 대해 별도의 GRANT 없이 모든 오브젝트 권한을 가진다.
    2. 시스템 권한을 다시 부여할 수 있게 하려면 WITH ADMIN OPTION을, 오브젝트 권한은 WITH GRANT OPTION을 사용한다.
    3. ROLE에는 시스템 권한과 오브젝트 권한을 함께 담을 수 있고, ROLE을 다른 ROLE에 부여할 수도 있다.
    4. WITH GRANT OPTION으로 받은 오브젝트 권한을 회수해도, 그 사용자가 다른 사용자에게 다시 부여한 권한은 회수되지 않고 그대로 남는다.
  50. 50. SCOTT와 사용자들이 아래 순서로 DCL을 실행했다. 모든 문장이 실행된 후 SCOTT.SHOW_T에 대해 SELECT 권한을 가진 사용자를 모두 고른 것은? (Oracle, SCOTT는 SHOW_T의 소유자이며 SCOTT 자신은 제외한다.)

    -- SCOTT 실행
    GRANT SELECT ON scott.show_t TO u1 WITH GRANT OPTION;
    GRANT SELECT ON scott.show_t TO u2 WITH GRANT OPTION;
    
    -- U1 실행
    GRANT SELECT ON scott.show_t TO u3;
    
    -- U2 실행
    GRANT SELECT ON scott.show_t TO u3;
    
    -- SCOTT 실행
    REVOKE SELECT ON scott.show_t FROM u1;
    1. U2
    2. U2, U3
    3. U1, U2, U3
    4. U3

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