SQLD 모의고사 11회

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

  1. 1. 다음 사례에서 가장 직접적으로 부족했던 좋은 데이터 모델의 요소는?

    온라인 쇼핑몰 S사는 주문·상품·회원·배송 위주로 데이터 모델을 설계하고 서비스를 오픈하였다. 그런데 오픈 직후 반품 접수가 시작되자 반품 사유, 반품 수거일, 환불 금액 등을 저장할 엔터티와 속성이 모델 어디에도 정의되어 있지 않다는 사실이 드러났고, 결국 급히 테이블을 추가하고 프로그램을 수정해야 했다.

    1. 중복 배제
    2. 완전성
    3. 데이터 재사용
    4. 의사소통
  2. 2. 온라인 쇼핑몰 모델링 회의에서 다음과 같은 엔터티 이름이 제안되었다. 엔터티 명명 규칙에 가장 부합하는 것은?

    1. 고객이 결제한 주문 - 업무 의미가 드러나도록 서술식으로 작성한 이름
    2. 주문상품들 - 엔터티는 여러 인스턴스의 집합이므로 복수형으로 작성한 이름
    3. 반품 - 현업에서 실제로 쓰는 용어를 단수 명사로 간결하게 작성한 이름
    4. ORD_DLV_T - 이름 길이를 줄이기 위해 영문 약어를 조합한 이름
  3. 3. 온라인 쇼핑몰의 상품 엔터티에 옵션정보 속성을 두고 다음과 같이 값을 저장하도록 설계하였다.

    상품코드 상품명 옵션정보
    P01 라운드티 빨강/S:재고5:+0원, 빨강/M:재고3:+1000원, 검정/L:재고0:+1000원

    이 설계에 대한 판단으로 가장 적절한 것은?

    1. 옵션은 한 상품에 여러 개 존재하고 각각 재고·추가금액이라는 고유한 설명 정보를 가지므로, 상품옵션 엔터티로 분리하는 것이 적절하다.
    2. 옵션정보는 하나의 문자열 값으로 저장되므로 단일값 속성에 해당하며 현재 설계가 적절하다.
    3. 옵션별 재고는 다른 속성으로부터 계산되는 파생 속성이므로 저장하지 않고 조회 시 계산해야 한다.
    4. 다중값 속성은 옵션1, 옵션2, 옵션3처럼 같은 성격의 속성을 반복해서 펼쳐 두는 것이 원칙이다.
  4. 4. 온라인 쇼핑몰의 업무 규칙이 다음과 같다.

    • 모든 배송은 반드시 하나의 주문에 대해 생성된다.
    • 하나의 주문은 아직 배송이 시작되지 않아 배송이 없을 수도 있고, 분할 배송되어 배송이 여러 건일 수도 있다.

    이를 IE 표기법으로 바르게 나타낸 것은? (|는 필수 또는 1, o는 선택, {는 여러 건을 뜻하며, 각 기호는 가까이 있는 엔터티에 대한 표시이다.)

    1. 주문 ||--|{ 배송
    2. 주문 o|--o{ 배송
    3. 주문 ||--o| 배송
    4. 주문 ||--o{ 배송
  5. 5. 온라인 쇼핑몰의 엔터티별 주식별자를 정하려 한다. 주식별자 도출 기준에 대한 설명으로 가장 적절하지 않은 것은?

    1. 해당 업무에서 인스턴스를 구분할 때 실제로 자주 이용하는 속성을 주식별자로 지정한다.
    2. 상품명처럼 이름으로 기술되는 속성은 동명 상품이나 이름 변경 가능성이 있으므로 주식별자로 지정하지 않는 것이 좋다.
    3. 복합식별자를 구성할 때는 유일성을 확실히 보장하기 위해 관련 속성을 가능한 한 많이 포함한다.
    4. 주식별자는 한번 정해지면 변하지 않아야 하므로 업무상 자주 수정되는 속성은 피한다.
  6. 6. 온라인 쇼핑몰의 주문 테이블은 다음과 같다. PK는 주문번호이며, 모든 컬럼은 원자값만 가진다.

    주문(주문번호, 주문일자, 회원번호, 회원등급, 등급할인율)

    업무 규칙상 함수 종속은 다음과 같다.

    • 주문번호 → 주문일자, 회원번호
    • 회원번호 → 회원등급
    • 회원등급 → 등급할인율

    이 테이블이 만족하는 가장 높은 정규형과 그 이유로 옳은 것은?

    1. 제1정규형 - 회원등급이 PK의 일부에만 종속되는 부분 함수 종속이 있다.
    2. 제2정규형 - PK가 단일 속성이라 부분 함수 종속은 없지만, 주문번호 → 회원번호 → 회원등급 → 등급할인율의 이행 함수 종속이 있다.
    3. 제3정규형 - 모든 일반 속성이 결국 주문번호에 의해 결정되므로 이행 함수 종속 문제가 없다.
    4. BCNF - 주문번호 하나로 모든 속성이 결정되므로 모든 결정자가 후보키이다.
  7. 7. 온라인 쇼핑몰의 관계를 조인으로 구현할 때의 설명으로 가장 적절하지 않은 것은?

    1. 주문→회원 관계가 필수(모든 주문은 반드시 한 회원에 속함)이고 주문의 회원번호 FK가 NOT NULL이면, 주문을 기준으로 회원을 INNER JOIN해도 주문 행이 누락되지 않는다.
    2. 회원 쪽에서 주문이 선택(주문이 없는 회원 존재)이면, 주문이 없는 회원까지 함께 조회하려면 회원을 기준으로 OUTER JOIN해야 한다.
    3. 1:M 관계인 회원과 주문을 조인 조건으로 INNER JOIN하면, 결과 행 수는 회원 수가 아니라 조건을 만족하는 주문(M쪽) 행 수를 따른다.
    4. M:N 관계인 회원과 상품은 교차 엔터티 없이도 두 테이블의 PK끼리 직접 조인하여 '어떤 회원이 어떤 상품을 찜했는지'를 구할 수 있다.
  8. 8. 온라인 쇼핑몰의 ERD 일부를 IE 표기법으로 나타내면 다음과 같다. (|는 필수, o는 선택, {는 여러 건을 의미한다.) 이 모델을 바탕으로 한 트랜잭션 설계로 가장 적절한 것은?

    회원 ||--o{ 주문     : 주문한다
    주문 ||--|{ 주문상품 : 포함한다
    상품 ||--o{ 주문상품 : 판매된다
    1. 주문과 주문상품은 양쪽 모두 필수 관계이므로 주문 INSERT와 주문상품 INSERT를 하나의 트랜잭션으로 묶어 함께 COMMIT해야 한다.
    2. 회원 쪽에서 주문이 선택이지만, 회원 가입과 첫 주문 입력은 반드시 하나의 트랜잭션으로 묶어 처리해야 한다.
    3. 상품과 주문상품은 1:M 관계이므로 상품을 등록할 때 주문상품도 최소 1건 함께 입력해야 한다.
    4. 주문상품은 상품을 참조하므로 상품 등록과 주문 생성은 항상 하나의 트랜잭션으로 처리해야 한다.
  9. 9. 다음 [MEMBER] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과로 옳은 것은? (Oracle 기준)

    [MEMBER]

    MEM_NO GRADE
    1 VIP
    2 NULL
    3 GOLD
    4 NULL
    5 VIP
    -- (가)
    SELECT COUNT(DISTINCT GRADE) FROM MEMBER;
    
    -- (나)
    SELECT COUNT(*) FROM (SELECT DISTINCT GRADE FROM MEMBER);
    
    -- (다)
    SELECT COUNT(*) FROM MEMBER WHERE GRADE IN ('VIP', NULL);
    1. (가) 2, (나) 2, (다) 2
    2. (가) 3, (나) 3, (다) 4
    3. (가) 2, (나) 3, (다) 2
    4. (가) 2, (나) 3, (다) 4
  10. 10. 온라인 쇼핑몰의 가격이력 엔터티는 본질식별자 (상품코드, 판매채널코드, 회원등급코드, 적용시작일시)로 식별된다. 이 식별자가 주문상품, 가격변경로그, 프로모션적용, 정산상세 등 여러 하위 엔터티로 상속되면서 하위 테이블의 PK가 계속 길어지고 조인 조건도 복잡해지고 있다. 업무상 같은 (상품, 채널, 등급, 적용시작일시) 조합의 가격은 하나만 존재해야 한다. 가장 적절한 개선 방안은?

    1. 본질식별자를 그대로 유지하고 하위 엔터티로 계속 상속하는 것이 정규화 원칙상 유일한 방법이므로 구조를 바꾸지 않는다.
    2. 인조식별자 가격이력번호를 주식별자로 두고, (상품코드, 판매채널코드, 회원등급코드, 적용시작일시)에는 UNIQUE 제약을 걸어 업무 중복을 막는다.
    3. 인조식별자 가격이력번호를 주식별자로 두면 본질식별자 조합의 유일성도 자동으로 보장되므로 별도의 제약은 필요 없다.
    4. 속성 수를 줄이기 위해 적용시작일시 하나만 주식별자로 지정한다.
  11. 11. 다음 SQL에서 ㉠ WHERE 절과 ㉡ SELECT 절이 각각 수행하는 관계 연산으로 옳은 것은?

    SELECT MEM_NM, EMAIL        -- ㉡
      FROM MEMBER
     WHERE GRADE = 'VIP';        -- ㉠
    1. ㉠ 투영(Projection) / ㉡ 선택(Select)
    2. ㉠ 조인(Join) / ㉡ 투영(Projection)
    3. ㉠ 선택(Select) / ㉡ 조인(Join)
    4. ㉠ 선택(Select) / ㉡ 투영(Projection)
  12. 12. PRODUCT 테이블에는 PROD_ID, PROD_NM, CATEGORY, BRAND, PRICE 컬럼이 있다. 다음 중 Oracle(19c 기준)에서 실행 시 오류가 발생하는 SQL은?

    1. SELECT CATEGORY AS CAT, COUNT(*) AS CNT FROM PRODUCT GROUP BY CATEGORY ORDER BY CNT DESC;
    2. SELECT CATEGORY AS CAT, COUNT(*) FROM PRODUCT GROUP BY CAT;
    3. SELECT P.*, PRICE * 0.9 AS SALE_PRICE FROM PRODUCT P;
    4. SELECT PROD_NM || '(' || BRAND || ')' AS "상품 표시명" FROM PRODUCT;
  13. 13. 다음 [PRODUCT] 테이블에 SQL을 실행했을 때 결과 건수는?

    [PRODUCT]

    PROD_ID CATEGORY BRAND
    1 의류 A
    2 의류 A
    3 의류 NULL
    4 의류 NULL
    5 신발 A
    6 신발 B
    7 NULL NULL
    SELECT DISTINCT CATEGORY, BRAND
      FROM PRODUCT;
    1. 5건
    2. 6건
    3. 7건
    4. 3건
  14. 14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C / D 순서)

    SELECT LENGTH('S,M,L,XL') - LENGTH(REPLACE('S,M,L,XL', ',')) AS A,
           SUBSTR('ORD-2025-0042', -4)                          AS B,
           INSTR('ORD-2025-0042', '-', -1)                       AS C,
           RPAD('VIP', 6, '*')                                   AS D
      FROM DUAL;
    1. 3 / 0042 / 4 / VIP***
    2. 4 / 0042 / 9 / ***VIP
    3. 3 / 0042 / 9 / VIP***
    4. 3 / 2025 / 9 / VIP***
  15. 15. 다음 [PRODUCT] 테이블에 SQL을 실행한 결과를 PROD_ID 순서로 나열한 것으로 옳은 것은? (Oracle)

    [PRODUCT]

    PROD_ID PRICE DISC
    P1 12900 10
    P2 8000 NULL
    P3 25550 20
    SELECT PROD_ID,
           ROUND(PRICE * (100 - NVL(DISC, 0)) / 100, -2) AS SALE_PRICE,
           CASE WHEN DISC >= 20  THEN 'HOT'
                WHEN DISC IS NULL THEN 'NONE'
                ELSE 'SALE'
           END AS TAG
      FROM PRODUCT
     ORDER BY PROD_ID;
    1. 11610 SALE / 8000 NONE / 20440 HOT
    2. 11600 SALE / NULL NONE / 20400 HOT
    3. 11700 SALE / 8000 NONE / 20500 HOT
    4. 11600 SALE / 8000 NONE / 20400 HOT
  16. 16. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C / D 순서)

    SELECT TO_CHAR(ADD_MONTHS(DATE '2025-02-28', 1), 'MM-DD')        AS A,
           MONTHS_BETWEEN(DATE '2025-05-15', DATE '2025-02-15')       AS B,
           TO_CHAR(DATE '2025-03-01' - 1, 'DD')                       AS C,
           EXTRACT(DAY FROM DATE '2025-12-25' + 10)                   AS D
      FROM DUAL;
    1. 03-31 / 3 / 28 / 4
    2. 03-28 / 3 / 28 / 4
    3. 03-31 / -3 / 29 / 4
    4. 03-28 / -3 / 28 / 4
  17. 17. 다음 [PRODUCT] 테이블에 SQL을 실행했을 때 결과 값은?

    [PRODUCT]

    PROD_NM CATEGORY PRICE
    P1 도서 15000
    P2 의류 8000
    P3 NULL 25000
    P4 의류 NULL
    P5 식품 12000
    P6 도서 30000
    P7 의류 21000
    SELECT COUNT(*)
      FROM PRODUCT
     WHERE PRICE NOT BETWEEN 10000 AND 20000
       AND CATEGORY <> '도서';
    1. 1
    2. 2
    3. 3
    4. 4
  18. 18. WHERE 절의 연산자에 대한 설명으로 가장 적절하지 않은 것은? (Oracle 기준)

    1. <>, !=, ^=는 모두 '같지 않다'를 의미한다.
    2. 논리 연산자의 우선순위는 NOT, AND, OR 순이므로 괄호가 없으면 AND가 OR보다 먼저 평가된다.
    3. PRICE BETWEEN 30000 AND 10000처럼 작은 값을 뒤에 쓰면 조건을 만족하는 행이 없다.
    4. PROD_NM LIKE '할인%'는 '할인'으로 시작하는 값을 찾되, 값이 정확히 '할인' 두 글자인 행은 포함하지 않는다.
  19. 19. 다음 [ORDERS] 테이블에 SQL을 실행한 결과로 옳은 것은? (MEM_NO, DAYS, CNT 순서로 표기)

    [ORDERS]

    ORD_NO MEM_NO ORD_DT AMT
    1 M1 2025-03-01 10000
    2 M1 2025-03-01 25000
    3 M1 2025-03-05 12000
    4 M2 2025-03-02 30000
    5 M2 2025-03-09 35000
    6 M3 2025-03-03 5000
    7 M3 2025-03-03 40000
    8 M4 2025-03-04 NULL
    SELECT MEM_NO,
           COUNT(DISTINCT ORD_DT) AS DAYS,
           COUNT(AMT)             AS CNT
      FROM ORDERS
     GROUP BY MEM_NO
    HAVING MAX(AMT) - MIN(AMT) >= 10000
     ORDER BY MEM_NO;
    1. (M1, 3, 3), (M3, 2, 2)
    2. (M1, 2, 3), (M3, 1, 2), (M4, 1, 0)
    3. (M1, 2, 3), (M3, 1, 2)
    4. (M1, 2, 3), (M2, 2, 2), (M3, 1, 2)
  20. 20. PRODUCT(PROD_ID, CATEGORY, PRICE) 테이블에 대해 Oracle(19c 기준)에서 실행할 때 오류 없이 실행되는 SQL은?

    1. SELECT COUNT(*), SUM(PRICE) FROM PRODUCT HAVING COUNT(*) >= 1;
    2. SELECT CATEGORY, COUNT(*) FROM PRODUCT GROUP BY CATEGORY HAVING PRICE >= 10000;
    3. SELECT CATEGORY, MAX(PRICE) FROM PRODUCT GROUP BY 1;
    4. SELECT CATEGORY, AVG(MAX(PRICE)) FROM PRODUCT GROUP BY CATEGORY;
  21. 21. 다음 [REVIEW] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle 기준)

    [REVIEW]

    RV_ID PROD_ID STAR LIKES
    1 A 5 10
    2 B NULL 3
    3 C 4 10
    4 D 5 NULL
    5 E 4 7
    SELECT RV_ID
      FROM REVIEW
     ORDER BY STAR DESC, LIKES;
    1. 1, 4, 3, 5, 2
    2. 2, 1, 4, 5, 3
    3. 2, 4, 1, 5, 3
    4. 4, 1, 5, 3, 2
  22. 22. 다음 [ORDERS] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은?

    [ORDERS]

    MEM_NO AMT
    M1 100
    M1 200
    M2 500
    M3 50
    M3 60
    M3 70
    M4 300
    SELECT MEM_NO
      FROM ORDERS
     GROUP BY MEM_NO
     ORDER BY COUNT(*) DESC, SUM(AMT);
    1. SELECT 절에 없는 집계 함수로 정렬하므로 오류가 발생한다.
    2. M3, M1, M2, M4
    3. M1, M3, M4, M2
    4. M3, M1, M4, M2
  23. 23. 다음 [MEMBER] 테이블의 REF_NO는 추천인의 MEM_NO이다(FK 제약 없음). SQL을 실행한 결과의 REF 값을 MEM_NO 순서대로 나열한 것으로 옳은 것은? (Oracle 기준)

    [MEMBER]

    MEM_NO NAME GRADE REF_NO
    1 가 VIP NULL
    2 나 GOLD 1
    3 다 SILVER 1
    4 라 GOLD 2
    5 마 SILVER 9
    SELECT M.MEM_NO,
           NVL(R.NAME, '-') AS REF
      FROM MEMBER M, MEMBER R
     WHERE M.REF_NO   = R.MEM_NO(+)
       AND R.GRADE(+) = 'VIP'
     ORDER BY M.MEM_NO;
    1. (+)를 상수와 비교하는 조건에는 사용할 수 없으므로 오류가 발생한다.
    2. -, 가, 가, 나, -
    3. -, 가, 가, -, -
    4. 가, 가 (2행)
  24. 24. 조인에 대한 설명으로 가장 적절한 것은?

    1. Non-EQUI JOIN은 = 이외의 연산자(BETWEEN, >, <= 등)를 조인 조건으로 사용하여 두 테이블을 연결한다.
    2. N개의 테이블을 카티션 곱 없이 조인하려면 최소 N개의 조인 조건이 필요하다.
    3. CROSS JOIN의 결과 행 수는 두 테이블 행 수의 합과 같다.
    4. SELF JOIN은 같은 테이블을 한 번만 참조하므로 테이블 별칭 없이도 컬럼을 구분할 수 있다.
  25. 25. 다음 세 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 값으로 옳은 것은?

    [MEMBER]

    MEM_NO NAME
    1 가
    2 나
    3 다
    4 라

    [ORDERS]

    ORD_NO MEM_NO
    101 1
    102 1
    103 2
    104 3

    [DELIVERY]

    DLV_NO ORD_NO
    D1 101
    D2 103
    -- (가)
    SELECT COUNT(*)
      FROM MEMBER M
           LEFT OUTER JOIN ORDERS O   ON M.MEM_NO = O.MEM_NO
           INNER JOIN      DELIVERY D ON O.ORD_NO = D.ORD_NO;
    
    -- (나)
    SELECT COUNT(*)
      FROM MEMBER M
           LEFT OUTER JOIN ORDERS O   ON M.MEM_NO = O.MEM_NO
           LEFT OUTER JOIN DELIVERY D ON O.ORD_NO = D.ORD_NO;
    1. (가) 2, (나) 5
    2. (가) 4, (나) 5
    3. (가) 5, (나) 5
    4. (가) 2, (나) 4
  26. 26. 다음 SQL과 같은 결과를 반환하는 SQL로 가장 적절한 것은? (Oracle 기준, 결과에 완전히 같은 행이 중복되는 경우는 없으며 행의 출력 순서는 고려하지 않는다.)

    SELECT M.MEM_NO, C.CPN_CD
      FROM MEMBER M
           FULL OUTER JOIN COUPON C
           ON M.MEM_NO = C.MEM_NO;
    1. SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M LEFT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO UNION ALL SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M RIGHT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO;
    2. SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M, COUPON C WHERE M.MEM_NO(+) = C.MEM_NO(+);
    3. SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M LEFT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO UNION SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M RIGHT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO;
    4. SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M INNER JOIN COUPON C ON M.MEM_NO = C.MEM_NO UNION ALL SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M LEFT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO;
  27. 27. 다음 [PRODUCT] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과 값으로 옳은 것은?

    [PRODUCT]

    PROD_ID CATEGORY PRICE
    1 도서 12000
    2 도서 NULL
    3 도서 18000
    4 의류 15000
    5 의류 25000
    6 식품 9000
    7 의류 20000
    -- (가)
    SELECT COUNT(*) FROM PRODUCT
     WHERE PRICE > ALL (SELECT PRICE FROM PRODUCT WHERE CATEGORY = '도서');
    
    -- (나)
    SELECT COUNT(*) FROM PRODUCT
     WHERE PRICE > ANY (SELECT PRICE FROM PRODUCT WHERE CATEGORY = '도서');
    
    -- (다)
    SELECT COUNT(*) FROM PRODUCT
     WHERE PRICE > ALL (SELECT PRICE FROM PRODUCT
                         WHERE CATEGORY = '도서' AND PRICE IS NOT NULL);
    1. (가) 2, (나) 4, (다) 2
    2. (가) 0, (나) 4, (다) 2
    3. (가) 0, (나) 5, (다) 2
    4. (가) 2, (나) 5, (다) 2
  28. 28. 서브쿼리에 대한 설명으로 가장 적절하지 않은 것은? (Oracle 기준)

    1. = 같은 단일행 비교 연산자와 함께 쓴 서브쿼리가 2건 이상을 반환하면 오류가 발생한다.
    2. 연관 서브쿼리는 메인쿼리의 컬럼을 참조하며, 메인쿼리의 각 행마다 서브쿼리가 수행되는 것처럼 동작한다.
    3. FROM 절에 쓰는 인라인 뷰 안에서는 ORDER BY를 사용할 수 있다.
    4. 스칼라 서브쿼리는 SELECT 절에서만 사용할 수 있으며 WHERE 절이나 ORDER BY 절에서는 사용할 수 없다.
  29. 29. 다음 [CPN_A], [CPN_B] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 기준)

    [CPN_A]

    CPN_CD
    C1
    C2
    NULL
    NULL
    C3

    [CPN_B]

    CPN_CD
    C2
    NULL
    C4
    -- (가)
    SELECT CPN_CD FROM CPN_A UNION     SELECT CPN_CD FROM CPN_B;
    -- (나)
    SELECT CPN_CD FROM CPN_A INTERSECT SELECT CPN_CD FROM CPN_B;
    -- (다)
    SELECT CPN_CD FROM CPN_A MINUS     SELECT CPN_CD FROM CPN_B;
    1. (가) 5, (나) 2, (다) 2
    2. (가) 4, (나) 1, (다) 2
    3. (가) 6, (나) 2, (다) 2
    4. (가) 5, (나) 1, (다) 3
  30. 30. MEM_2024, MEM_2025 테이블은 모두 MEM_NO(NUMBER), NAME(VARCHAR2) 컬럼을 가진다. 다음 중 Oracle에서 실행 시 오류가 발생하는 SQL은?

    1. SELECT MEM_NO AS ID FROM MEM_2024 UNION SELECT MEM_NO FROM MEM_2025 ORDER BY ID;
    2. SELECT MEM_NO AS ID FROM MEM_2024 UNION SELECT MEM_NO AS NO FROM MEM_2025 ORDER BY NO;
    3. SELECT MEM_NO, NAME FROM MEM_2024 UNION SELECT MEM_NO, NULL FROM MEM_2025 ORDER BY 2;
    4. SELECT MEM_NO FROM MEM_2024 UNION ALL SELECT MEM_NO FROM MEM_2025 ORDER BY 1 DESC;
  31. 31. 다음 [SALES] 테이블에 SQL을 실행했을 때 결과 건수와, CATEGORY가 NULL인 행의 TOT 값으로 옳은 것은?

    [SALES]

    CATEGORY BRAND AMT
    의류 A 100
    의류 B 200
    의류 A 50
    신발 A 300
    신발 C 100
    가방 B 80
    SELECT CATEGORY, SUM(AMT) AS TOT
      FROM SALES
     GROUP BY ROLLUP(CATEGORY, BRAND)
    HAVING GROUPING(BRAND) = 1;
    1. 9행, 830
    2. 3행, 830
    3. 4행, 830
    4. 4행, 350
  32. 32. 다음 SQL과 같은 그룹핑 결과를 만드는 GROUP BY 절은? (행의 출력 순서는 고려하지 않는다.)

    SELECT CATEGORY, BRAND, SUM(AMT)
      FROM SALES
     GROUP BY CUBE(CATEGORY, BRAND);
    1. GROUP BY ROLLUP(CATEGORY, BRAND)
    2. GROUP BY GROUPING SETS (CATEGORY, BRAND, ())
    3. GROUP BY GROUPING SETS ((CATEGORY, BRAND), CATEGORY, BRAND)
    4. GROUP BY GROUPING SETS ((CATEGORY, BRAND), CATEGORY, BRAND, ())
  33. 33. 다음 [ORDERS] 테이블에 SQL을 실행했을 때 S2 값을 출력 순서대로 나열한 것으로 옳은 것은?

    [ORDERS]

    MEM_NO ORD_SEQ AMT
    M1 1 100
    M1 2 200
    M1 3 50
    M2 1 300
    M2 2 100
    SELECT MEM_NO, ORD_SEQ,
           SUM(AMT) OVER (PARTITION BY MEM_NO
                          ORDER BY ORD_SEQ
                          ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS S2
      FROM ORDERS
     ORDER BY MEM_NO, ORD_SEQ;
    1. 100, 300, 350, 300, 400
    2. 100, 300, 250, 300, 400
    3. 100, 300, 250, 350, 400
    4. 300, 250, 50, 400, 100
  34. 34. 다음 [ORDERS] 테이블에 SQL을 실행했을 때 GAP 값을 출력 순서대로 나열한 것으로 옳은 것은? (Oracle, ORD_DT는 시각 정보가 없는 DATE 타입)

    [ORDERS]

    MEM_NO ORD_DT
    M1 2025-03-01
    M1 2025-03-04
    M1 2025-03-10
    M2 2025-03-02
    M2 2025-03-03
    SELECT MEM_NO, ORD_DT,
           LEAD(ORD_DT) OVER (PARTITION BY MEM_NO ORDER BY ORD_DT) - ORD_DT AS GAP
      FROM ORDERS
     ORDER BY MEM_NO, ORD_DT;
    1. 3, 6, NULL, 1, NULL
    2. NULL, 3, 6, NULL, 1
    3. 3, 6, 0, 1, 0
    4. 3, 9, NULL, 1, NULL
  35. 35. 윈도우 함수에 대한 설명으로 가장 적절하지 않은 것은?

    1. PARTITION BY를 생략하면 전체 결과 집합을 하나의 파티션으로 보고 함수를 적용한다.
    2. SUM(AMT) OVER (PARTITION BY MEM_NO)처럼 ORDER BY 없이 쓰면 각 행에 해당 파티션 전체의 합계가 출력된다.
    3. ROW_NUMBER는 ORDER BY 값이 같은 행에는 같은 번호를 부여하고, 그다음 번호는 같은 행의 수만큼 건너뛴다.
    4. 윈도우 함수는 결과 행 수를 줄이지 않으므로, 순위로 행을 걸러 내려면 인라인 뷰로 감싼 뒤 바깥 WHERE 절에서 조건을 건다.
  36. 36. 다음 [PRODUCT] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, 출력 순서대로 표기)

    [PRODUCT]

    PROD_NM SALES_CNT
    가방 120
    모자 NULL
    셔츠 300
    양말 110
    장갑 80
    SELECT PROD_NM
      FROM (SELECT PROD_NM
              FROM PRODUCT
             ORDER BY SALES_CNT DESC)
     WHERE ROWNUM <= 3;
    1. 셔츠, 가방, 양말
    2. 셔츠, 가방, 모자
    3. 가방, 모자, 셔츠
    4. 모자, 셔츠, 가방
  37. 37. 다음 [BEST] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 12c 이상 기준)

    [BEST]

    PROD_ID SALES
    A 500
    B 400
    C 400
    D 300
    E 300
    F 200
    -- (가)
    SELECT COUNT(*) FROM (SELECT RANK() OVER (ORDER BY SALES DESC) AS RK FROM BEST)
     WHERE RK <= 3;
    
    -- (나)
    SELECT COUNT(*) FROM (SELECT DENSE_RANK() OVER (ORDER BY SALES DESC) AS RK FROM BEST)
     WHERE RK <= 3;
    
    -- (다)
    SELECT PROD_ID FROM BEST
     ORDER BY SALES DESC
     FETCH FIRST 2 ROWS WITH TIES;
    1. (가) 3, (나) 3, (다) 2
    2. (가) 3, (나) 5, (다) 3
    3. (가) 4, (나) 5, (다) 3
    4. (가) 3, (나) 5, (다) 2
  38. 38. 쇼핑몰의 상품 카테고리가 다음 [CATEGORY] 테이블에 저장되어 있다. SQL의 실행 결과로 옳은 것은? (Oracle 기준)

    [CATEGORY]

    CAT_ID CAT_NM PARENT_ID
    1 전체 NULL
    2 패션 1
    3 가전 1
    4 남성의류 2
    5 여성의류 2
    6 신발 2
    7 운동화 6
    8 TV 3
    9 구두 6
    SELECT COUNT(*)   AS CNT,
           MAX(LEVEL) AS MX
      FROM CATEGORY
     WHERE LEVEL > 1
     START WITH CAT_NM = '패션'
    CONNECT BY PRIOR CAT_ID = PARENT_ID;
    1. CNT = 5, MX = 3
    2. CNT = 6, MX = 3
    3. CNT = 5, MX = 4
    4. CNT = 3, MX = 2
  39. 39. 다음 [CATEGORY] 테이블에 셀프 조인 SQL을 실행했을 때 출력되는 C.CAT_NM을 모두 나열한 것은?

    [CATEGORY]

    CAT_ID CAT_NM PARENT_ID
    1 전체 NULL
    2 패션 1
    3 가전 1
    4 남성의류 2
    5 여성의류 2
    6 신발 2
    7 운동화 6
    8 TV 3
    9 구두 6
    SELECT C.CAT_NM, P.CAT_NM AS PARENT_NM
      FROM CATEGORY C
           INNER JOIN CATEGORY P
                   ON C.PARENT_ID = P.CAT_ID
           LEFT OUTER JOIN CATEGORY G
                   ON P.PARENT_ID = G.CAT_ID
     WHERE G.CAT_NM IS NULL;
    1. 전체
    2. 전체, 패션, 가전
    3. 남성의류, 여성의류, 신발, TV
    4. 패션, 가전
  40. 40. 다음 [SALES_W] 테이블은 상품별 월 판매수량을 열로 펼쳐 저장한 것이다. SQL의 실행 결과로 옳은 것은? (Oracle 기준, (MON, CNT, TOT)를 출력 순서대로 표기)

    [SALES_W]

    PROD_NM M1 M2 M3
    가방 10 NULL 30
    모자 NULL NULL 5
    셔츠 20 15 NULL
    SELECT MON, COUNT(*) AS CNT, SUM(QTY) AS TOT
      FROM SALES_W
    UNPIVOT (QTY FOR MON IN (M1 AS 'M1', M2 AS 'M2', M3 AS 'M3'))
     GROUP BY MON
     ORDER BY MON;
    1. (M1, 3, 30), (M2, 3, 15), (M3, 3, 35)
    2. (M1, 2, 30), (M2, 1, 15)
    3. (M1, 2, 30), (M2, 1, 15), (M3, 2, 35)
    4. (M1, 2, 30), (M2, 2, 15), (M3, 2, 35)
  41. 41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, A / B 순서로 표기)

    SELECT REGEXP_REPLACE('010-1234-5678',
                          '([0-9]{3})-([0-9]{3,4})-([0-9]{4})',
                          '\1-****-\3')                          AS A,
           REGEXP_SUBSTR('kim.sj@shop.co.kr', '@([a-z]+)', 1, 1, NULL, 1) AS B
      FROM DUAL;
    1. 010-****-5678 / shop
    2. 010-****-5678 / @shop
    3. ***-****-5678 / shop
    4. 010-1234-**** / shop.co.kr
  42. 42. 다음 [PRODUCT] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 값으로 옳은 것은? (Oracle 기준, 기본 설정에서 정규 표현식은 대소문자를 구분하며, 표의 AB 123은 가운데에 공백 한 칸이 있는 값이다.)

    [PRODUCT]

    PROD_CD
    AB123
    ab123
    AB1234
    A1234
    XY001
    XY01A
    AB 123
    -- (가)
    SELECT COUNT(*) FROM PRODUCT
     WHERE REGEXP_LIKE(PROD_CD, '^[A-Z]{2}[0-9]{3}$');
    
    -- (나)
    SELECT COUNT(*) FROM PRODUCT
     WHERE REGEXP_LIKE(PROD_CD, '^[A-Z]{2}[0-9]{3}$', 'i');
    1. (가) 2, (나) 2
    2. (가) 2, (나) 3
    3. (가) 3, (나) 3
    4. (가) 3, (나) 4
  43. 43. Oracle에서 아래 문장을 순서대로 실행한 후 마지막 SELECT의 결과로 옳은 것은? (결과는 COUNT(QTY), SUM(QTY), COUNT(MEMO) 순서)

    CREATE TABLE CART (
      MEM_NO   NUMBER,
      PROD_ID  NUMBER,
      QTY      NUMBER       DEFAULT 1,
      MEMO     VARCHAR2(20) DEFAULT '없음'
    );
    
    INSERT INTO CART (MEM_NO, PROD_ID)      VALUES (1, 10);          -- ①
    INSERT INTO CART                        VALUES (1, 20, NULL, NULL); -- ②
    INSERT INTO CART (MEM_NO, PROD_ID, QTY) VALUES (2, 10, 3);       -- ③
    INSERT INTO CART (MEM_NO, PROD_ID, MEMO)                        -- ④
    SELECT MEM_NO, PROD_ID + 1, '복사' FROM CART WHERE QTY IS NOT NULL;
    
    SELECT COUNT(QTY), SUM(QTY), COUNT(MEMO) FROM CART;
    1. 6, 8, 6
    2. 4, 6, 5
    3. 5, 7, 5
    4. 4, 6, 4
  44. 44. 다음 두 테이블에 대해 (가), (나) UPDATE 문을 각각 원래 데이터에서 실행한 후 SELECT SUM(PRICE) FROM PRODUCT;의 결과로 옳은 것은?

    [PRODUCT]

    PROD_ID PRICE
    1 1000
    2 2000
    3 3000
    4 4000

    [NEW_PRICE]

    PROD_ID PRICE
    1 1500
    3 2500
    5 9000
    -- (가)
    UPDATE PRODUCT P
       SET PRICE = (SELECT N.PRICE FROM NEW_PRICE N WHERE N.PROD_ID = P.PROD_ID);
    
    -- (나)
    UPDATE PRODUCT P
       SET PRICE = (SELECT N.PRICE FROM NEW_PRICE N WHERE N.PROD_ID = P.PROD_ID)
     WHERE EXISTS (SELECT 1 FROM NEW_PRICE N WHERE N.PROD_ID = P.PROD_ID);
    1. (가) 10000, (나) 10000
    2. (가) 4000, (나) 4000
    3. (가) 4000, (나) 10000
    4. (가) 13000, (나) 10000
  45. 45. ORDERS 테이블에는 ORD_NO가 1, 2인 두 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행했을 때 최종적으로 ORDERS에 남아 있는 ORD_NO는? (오류가 발생한 문장은 무시하고 다음 문장이 실행된다고 가정한다.)

    INSERT INTO ORDERS (ORD_NO) VALUES (3);
    SAVEPOINT s1;
    INSERT INTO ORDERS (ORD_NO) VALUES (4);
    SAVEPOINT s2;
    DELETE FROM ORDERS WHERE ORD_NO <= 2;
    ROLLBACK TO s1;
    ROLLBACK TO s2;
    INSERT INTO ORDERS (ORD_NO) VALUES (5);
    COMMIT;
    1. 1, 2, 3, 4, 5
    2. 1, 2, 3, 5
    3. 3, 4, 5
    4. 1, 2, 5
  46. 46. Oracle의 자동 커밋·자동 롤백에 대한 설명으로 가장 적절하지 않은 것은?

    1. DML을 실행한 뒤 COMMIT 없이 CREATE TABLE을 실행하면, 앞서 실행한 DML도 함께 커밋된다.
    2. DML을 실행한 뒤 GRANT 문을 실행하면 앞선 DML은 암묵적으로 커밋된다.
    3. SQL*Plus를 EXIT로 정상 종료하면 커밋되고, 세션이 비정상 종료되면 진행 중이던 트랜잭션은 롤백된다.
    4. DML을 실행한 뒤 이미 존재하는 테이블 이름으로 CREATE TABLE을 실행해 오류가 나면, 앞선 DML은 커밋되지 않은 상태로 남아 ROLLBACK으로 취소할 수 있다.
  47. 47. Oracle에서 아래와 같이 COUPON 테이블을 생성하고 ㄱ~ㅅ을 순서대로 실행했다. 실패하는 INSERT 문을 모두 고른 것은?

    CREATE TABLE COUPON (
      CPN_ID     NUMBER       PRIMARY KEY,
      CPN_CD     VARCHAR2(10) UNIQUE,
      DISC_RATE  NUMBER       CHECK (DISC_RATE BETWEEN 1 AND 50),
      MEM_NO     NUMBER       NOT NULL
    );
    
    ㄱ. INSERT INTO COUPON VALUES (1, 'WELCOME', 10, 100);
    ㄴ. INSERT INTO COUPON VALUES (2, NULL, NULL, 101);
    ㄷ. INSERT INTO COUPON VALUES (3, NULL, 60, 102);
    ㄹ. INSERT INTO COUPON VALUES (4, NULL, 50, 103);
    ㅁ. INSERT INTO COUPON VALUES (5, 'WELCOME', 20, 104);
    ㅂ. INSERT INTO COUPON VALUES (NULL, 'VIP', 5, 105);
    ㅅ. INSERT INTO COUPON (CPN_ID, CPN_CD, DISC_RATE) VALUES (6, 'VIP', 5);
    1. ㄷ, ㅁ, ㅂ, ㅅ
    2. ㄴ, ㄷ, ㅁ, ㅂ, ㅅ
    3. ㄷ, ㄹ, ㅁ, ㅂ, ㅅ
    4. ㄷ, ㅁ, ㅅ
  48. 48. Oracle에서 아래와 같이 테이블과 FK 제약조건이 정의되어 있고 데이터가 입력되어 있다. 두 DELETE 문을 순서대로 실행한 후(오류가 발생한 문장은 무시하고 진행) ORDERS와 ORDER_ITEM의 행 수로 옳은 것은?

    • MEMBER: MEM_NO 1, 2, 3
    • ORDERS: (101, 회원 1), (102, 회원 2), (103, 회원 2), (104, 회원 3)
    • ORDER_ITEM: (101, 1), (102, 1), (102, 2), (103, 1), (104, 1)
    • REVIEW: (R1, 회원 1)
    CREATE TABLE ORDERS (
      ORD_NO NUMBER PRIMARY KEY,
      MEM_NO NUMBER REFERENCES MEMBER(MEM_NO) ON DELETE CASCADE
    );
    CREATE TABLE ORDER_ITEM (
      ORD_NO NUMBER REFERENCES ORDERS(ORD_NO) ON DELETE CASCADE,
      SEQ    NUMBER
    );
    CREATE TABLE REVIEW (
      RV_ID  VARCHAR2(5) PRIMARY KEY,
      MEM_NO NUMBER REFERENCES MEMBER(MEM_NO)
    );
    
    DELETE FROM MEMBER WHERE MEM_NO = 1;
    DELETE FROM MEMBER WHERE MEM_NO = 2;
    1. ORDERS 4건, ORDER_ITEM 5건
    2. ORDERS 1건, ORDER_ITEM 1건
    3. ORDERS 2건, ORDER_ITEM 2건
    4. ORDERS 3건, ORDER_ITEM 4건
  49. 49. 아래 DCL을 순서대로 실행했다. 실행 후 SHOP.ORDERS에 대해 SELECT 권한을 가진 사용자와 UPDATE 권한을 가진 사용자를 바르게 짝지은 것은? (Oracle, KIM·LEE·PARK은 접속 권한 외에 다른 권한이 없다.)

    -- DBA 실행
    CREATE ROLE R_ORD;
    CREATE ROLE R_CS;
    GRANT R_ORD TO R_CS;
    GRANT R_CS  TO LEE;
    GRANT R_ORD TO KIM;
    
    -- SHOP 실행
    GRANT SELECT ON SHOP.ORDERS TO R_ORD;
    GRANT SELECT ON SHOP.ORDERS TO PARK;
    GRANT UPDATE ON SHOP.ORDERS TO R_CS;
    REVOKE SELECT ON SHOP.ORDERS FROM R_ORD;
    1. SELECT: LEE, PARK / UPDATE: LEE
    2. SELECT: PARK / UPDATE: LEE
    3. SELECT: PARK / UPDATE: 없음
    4. SELECT: KIM, LEE, PARK / UPDATE: LEE
  50. 50. Oracle의 롤(ROLE)에 대한 설명으로 가장 적절하지 않은 것은?

    1. 기본 제공 롤인 CONNECT에는 데이터베이스 접속 권한인 CREATE SESSION이 포함되어 있다.
    2. 기본 제공 롤인 RESOURCE는 CREATE TABLE, CREATE SEQUENCE 등 객체 생성 권한을 묶은 롤이다.
    3. 롤에 권한을 추가하거나 회수하면 그 롤을 부여받은 모든 사용자에게 변경이 반영되므로 권한 관리가 쉬워진다.
    4. 롤에는 시스템 권한만 담을 수 있으며, SELECT·INSERT 같은 오브젝트 권한은 롤에 부여할 수 없다.

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