SQLD 모의고사 13회

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

  1. 1. 대학 학사 시스템 구축을 위해 모델링팀이 다음 분석을 수행하였다.

    • (가) 학생·강좌·수강·교수 등 업무와 관련된 데이터가 무엇인지, 그 데이터들이 서로 어떤 관계인지를 구조적으로 분석하였다.
    • (나) 수강신청·성적처리 업무 시나리오를 따라가며 업무가 실제로 무엇을 하는지(해야 하는지)를 분석하였다.
    • (다) 업무 프로세스를 행, 엔터티를 열로 놓고 각 프로세스가 엔터티에 주는 영향(C·R·U·D)을 표시하여 분석하였다.

    (가)~(다)를 데이터 모델링의 3가지 관점과 바르게 연결한 것은?

    1. (가) 프로세스 관점, (나) 데이터 관점, (다) 상관 관점
    2. (가) 데이터 관점, (나) 상관 관점, (다) 프로세스 관점
    3. (가) 데이터 관점, (나) 프로세스 관점, (다) 상관 관점
    4. (가) 상관 관점, (나) 프로세스 관점, (다) 데이터 관점
  2. 2. 학사 시스템의 엔터티 이름을 정하면서 다음과 같이 처리하였다. 엔터티 명명 규칙에 비추어 가장 적절한 것은?

    1. 학생이 강좌를 신청할 때 생성되는 엔터티를 '학생강좌'보다 생성 의미가 드러나는 '수강신청'으로 명명하였다.
    2. 엔터티는 여러 인스턴스의 집합이므로 '학생들', '강좌목록'처럼 복수형으로 명명하였다.
    3. 이름을 짧게 하려고 '교수'는 'PRF', '수강'은 'ENR'처럼 약어로 엔터티명을 정하였다.
    4. 학부 영역과 대학원 영역의 '학생' 엔터티는 관리 대상이 서로 다르지만 같은 이름 '학생'으로 두 개를 정의하였다.
  3. 3. 엔터티, 인스턴스, 속성, 속성값의 관계에 대한 설명으로 가장 적절하지 않은 것은?

    1. 속성은 업무에서 필요로 하는, 의미상 더 이상 분리되지 않는 최소의 데이터 단위이다.
    2. 한 개의 엔터티는 두 개 이상의 인스턴스 집합이어야 하고, 두 개 이상의 속성을 갖는다.
    3. 한 개의 인스턴스에서 한 개의 속성은 한 개의 속성값을 갖는다.
    4. 학생 엔터티에서 '김하늘', '이바다'와 같은 값 하나하나가 속성이며, '학생명'은 이 값들이 모인 인스턴스이다.
  4. 4. 학사 시스템에서 다음 두 관계를 정의하였다.

    • (가) 학과와 교수: 교수는 반드시 한 학과에 소속되어 존재한다.
    • (나) 학생과 수강신청: 학생이 수강신청이라는 행위를 해야 두 엔터티가 연결된다.

    관계의 분류와 표현에 대한 설명으로 가장 적절한 것은?

    1. (가)는 행위적 관계, (나)는 존재적 관계이다.
    2. (가)는 존재적 관계, (나)는 행위적 관계이며, ERD에서는 두 관계를 구분하지 않고 같은 관계선으로 표현한다.
    3. (가)는 존재적 관계, (나)는 행위적 관계이며, ERD에서는 행위적 관계를 점선으로 그려 구분한다.
    4. (가)는 행위적 관계, (나)는 존재적 관계이며, UML 클래스 다이어그램에서도 두 관계를 모두 실선으로 표현한다.
  5. 5. 학생 엔터티에는 학교가 부여하는 '학번'과 '주민등록번호'가 있다. 두 속성 모두 모든 학생에게 반드시 존재하고 서로 중복되지 않는다. 업무에서는 주로 학번으로 학생을 구분하므로 학번을 주식별자로 지정하였다.

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

    1. 주민등록번호도 학생을 유일하게 구분하므로, 수강 엔터티는 학번 대신 주민등록번호를 상속받아 학생과의 관계를 연결해도 된다.
    2. 주민등록번호는 보조식별자로, 인스턴스를 유일하게 구분할 수는 있지만 대표성이 없어 다른 엔터티와의 참조 관계 연결에는 사용하지 않는다.
    3. 학번은 학교가 정한 규칙에 따라 부여되므로 업무에 의해 만들어진 식별자가 아니라 인조식별자이다.
    4. 학번은 학생 엔터티가 다른 엔터티로부터 받아온 식별자이므로 외부식별자이다.
  6. 6. 다음 강좌 테이블의 PK는 강좌코드이며, 업무 규칙상 교수명과 교수연구실은 교수번호에 의해 결정된다.

    강좌코드 강좌명 교수번호 교수명 교수연구실
    C01 데이터베이스 P1 김교수 공학관 301
    C02 운영체제 P1 김교수 공학관 301
    C03 현대시론 P2 이교수 인문관 205

    다음 상황 (가)~(다)에 대한 설명으로 가장 적절한 것은?

    • (가) 아직 담당 강좌가 없는 신임 교수 P3의 연구실 정보를 입력할 수 없다.
    • (나) 교수 P1이 연구실을 옮기면 C01, C02 두 행을 모두 고쳐야 하며, 한 행만 고치면 데이터가 불일치한다.
    • (다) C03 강좌를 폐강하여 행을 삭제하면 교수 P2의 연구실 정보도 함께 사라진다.
    1. (가) 갱신 이상, (나) 삽입 이상, (다) 삭제 이상이며 제3정규화로 해결한다.
    2. (가) 삽입 이상, (나) 갱신 이상, (다) 삭제 이상이며 부분 함수 종속을 제거하는 제2정규화로 해결한다.
    3. (가) 삭제 이상, (나) 갱신 이상, (다) 삽입 이상이며 제3정규화로 해결한다.
    4. (가) 삽입 이상, (나) 갱신 이상, (다) 삭제 이상이며 교수 정보를 교수번호를 PK로 하는 별도 테이블로 분리하는 제3정규화로 해결한다.
  7. 7. 학사 시스템의 테이블이 다음과 같이 설계되어 있다. 학생과 강좌의 M:N 관계는 교차 엔터티 수강으로 해소하였고, 수강은 두 부모의 PK를 상속받는 식별 관계이다.

    • STUDENT(STU_NO PK, STU_NM, DEPT_CD)
    • COURSE(CRS_CD PK, CRS_NM, PROF_NO)
    • ENROLL(STU_NO, CRS_CD PK, SCORE) — STU_NO는 STUDENT, CRS_CD는 COURSE를 참조하는 FK

    다음 요구사항 중 다른 테이블과 조인하지 않고 ENROLL 테이블만으로 처리할 수 있는 것은?

    1. 강좌코드가 'C01'인 강좌를 수강한 학생들의 학번과 점수 조회
    2. 강좌코드가 'C01'인 강좌를 수강한 학생들의 이름 조회
    3. 학과코드가 'D10'인 학생들의 평균 점수 조회
    4. 교수번호가 'P01'인 교수가 담당하는 강좌의 수강생 수 조회
  8. 8. 학사 시스템 모델의 일부가 아래와 같다. (IE 표기법: |는 필수, o는 선택, {는 여러 건)

    업무 규칙상 수강 정정은 기존 강좌의 수강 행을 삭제하고 새 강좌의 수강 행을 입력하는 작업이며, 정정 도중 오류가 나면 기존 수강 내역이 그대로 유지되어야 한다.

    다음 중 하나의 트랜잭션으로 묶어 처리해야 하는 작업으로 가장 적절한 것은?

    교수 ||--o{ 강좌 : 담당한다
    학과 ||--o{ 학생 : 소속시킨다
    학생 ||--o{ 수강 : 신청한다
    강좌 ||--o{ 수강 : 개설된다
    1. 신임 교수 등록과 그 교수가 담당할 첫 강좌 개설
    2. 학과 신설과 그 학과의 첫 입학생 등록
    3. 수강 정정 시 기존 강좌 수강 행의 DELETE와 새 강좌 수강 행의 INSERT
    4. 학생 등록과 그 학생의 첫 학기 수강신청
  9. 9. 다음 [GRADE] 테이블에 SQL을 실행했을 때 결과로 옳은 것은? (Oracle 기준)

    [GRADE]

    STU MID FIN
    S1 60 70
    S2 40 NULL
    S3 60 NULL
    S4 NULL NULL
    S5 30 80
    SELECT STU
      FROM GRADE
     WHERE NOT (MID > 50 AND FIN > 50)
     ORDER BY STU;
    1. S5
    2. S3, S4
    3. S2, S3, S4, S5
    4. S2, S5
  10. 10. 학사 시스템의 식별자 설계에 대한 설명으로 가장 적절한 것은?

    1. 학번은 학교가 학생에게 부여하는 번호이므로 시스템이 만든 인조식별자로 분류한다.
    2. 수강 엔터티의 PK를 (학번, 수강순번)으로 정하면, 수강순번은 업무 의미 없이 편의상 부여한 값이므로 이 PK는 인조식별자에 해당한다.
    3. 인조식별자 '수강ID'를 PK로 사용하면 (학번, 강좌코드, 개설학기) 조합의 중복 입력도 PK 제약에 의해 자동으로 차단된다.
    4. 인조식별자는 업무 의미가 없으므로, 학생이 확인할 수 있도록 성적표 화면과 보고서에 반드시 출력한다.
  11. 11. 기본키(PK)와 외래키(FK)의 특성에 대한 설명으로 가장 적절한 것은?

    1. 외래키 컬럼은 NULL을 가질 수 있으며, 같은 값이 여러 행에 중복되어 나타날 수 있다.
    2. 한 테이블에는 기본키를 여러 개 정의할 수 있으며, 기본키 컬럼은 NULL을 허용한다.
    3. 외래키는 반드시 다른 테이블의 기본키를 참조해야 하므로 같은 테이블의 컬럼을 참조할 수 없다.
    4. 기본키는 반드시 하나의 컬럼으로 구성되어야 하며, 여러 컬럼을 묶어 기본키로 지정할 수 없다.
  12. 12. 다음 [STUDENT] 테이블에 대해 (가)~(라) SQL을 실행했을 때, 결과 행 수가 나머지 셋과 다른 것은?

    [STUDENT]

    STU_NO DEPT_CD GRADE
    1 CS 1
    2 CS 2
    3 EE 1
    4 NULL 1
    5 NULL 2
    6 CS 1
    -- (가)
    SELECT DISTINCT DEPT_CD FROM STUDENT;
    
    -- (나)
    SELECT DEPT_CD FROM STUDENT GROUP BY DEPT_CD;
    
    -- (다)
    SELECT DISTINCT DEPT_CD, GRADE FROM STUDENT;
    
    -- (라)
    SELECT DISTINCT DEPT_CD FROM STUDENT WHERE GRADE IN (1, 2);
    1. (가)
    2. (나)
    3. (다)
    4. (라)
  13. 13. 다음 [GRADE] 테이블에 SQL을 실행한 결과의 STU 출력 순서로 옳은 것은? (Oracle 기준)

    [GRADE]

    STU MID FIN
    S1 80 90
    S2 70 NULL
    S3 60 90
    S4 100 20
    SELECT STU, MID + FIN / 2 AS R
      FROM GRADE
     ORDER BY R DESC;
    1. S1, S4, S3, S2
    2. S2, S1, S3, S4
    3. S1, S3, S4, S2
    4. S2, S1, S4, S3
  14. 14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, 결과는 A / B / C / D 순서)

    SELECT REPLACE('2025-1학기', '-')                        AS A,
           LENGTH(TRIM('  DB 개론  '))                           AS B,
           LOWER(SUBSTR('SQLD_EXAM', INSTR('SQLD_EXAM', '_') + 1)) AS C,
           CONCAT(UPPER('db'), RPAD('1', 3, '0'))                AS D
      FROM DUAL;
    1. 20251학기 / 9 / exam / DB100
    2. 20251학기 / 5 / exam / DB100
    3. 2025 1학기 / 5 / _exam / DB001
    4. 20251학기 / 5 / sqld / DB001
  15. 15. 다음 [SCORE] 테이블에 SQL을 실행했을 때 GRD 값을 STU 순서(A~E)대로 나열한 것으로 옳은 것은? (Oracle 기준)

    [SCORE]

    STU PT
    A 100
    B 89.9
    C 90
    D NULL
    E 79
    SELECT STU,
           CASE TRUNC(PT / 10)
                WHEN 10 THEN 'A'
                WHEN 9  THEN 'A'
                WHEN 8  THEN 'B'
                ELSE 'F'
           END AS GRD
      FROM SCORE
     ORDER BY STU;
    1. A, B, A, F, F
    2. A, A, A, NULL, F
    3. A, B, A, NULL, F
    4. F, B, A, F, F
  16. 16. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, 결과는 A / B / C / D 순서)

    SELECT TO_CHAR(1234567, 'FM9,999,999')                    AS A,
           TO_NUMBER('025') + 1                                 AS B,
           TO_CHAR(DATE '2025-03-02' + 36/24, 'MM-DD HH24')     AS C,
           EXTRACT(DAY FROM LAST_DAY(DATE '2025-02-10'))        AS D
      FROM DUAL;
    1. 1234567 / 26 / 03-03 12 / 28
    2. 1,234,567 / 26 / 03-03 12 / 29
    3. 1,234,567 / 26 / 03-03 12 / 28
    4. 1,234,567 / 26 / 03-04 00 / 28
  17. 17. 다음 [ENROLL] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은?

    [ENROLL]

    STU_NO SCORE
    S1 95
    S2 70
    S3 85
    S4 NULL
    S5 60
    S6 90
    -- (가)
    SELECT COUNT(*) FROM ENROLL WHERE SCORE BETWEEN 90 AND 70;
    
    -- (나)
    SELECT COUNT(*) FROM ENROLL WHERE SCORE NOT BETWEEN 70 AND 90;
    1. (가) 3 / (나) 2
    2. (가) 0 / (나) 2
    3. (가) 3 / (나) 3
    4. (가) 0 / (나) 3
  18. 18. Oracle에서 비어 있는 STU_TEL 테이블(STU_NO NUMBER, TEL VARCHAR2(20))에 아래 INSERT 문을 실행하였다. 이후 (가)~(다)의 결과로 옳은 것은?

    INSERT INTO STU_TEL VALUES (1, '010-1111-2222');
    INSERT INTO STU_TEL VALUES (2, '');
    INSERT INTO STU_TEL VALUES (3, NULL);
    INSERT INTO STU_TEL VALUES (4, '010-3333-4444');
    
    -- (가)
    SELECT COUNT(*) FROM STU_TEL WHERE TEL = '';
    -- (나)
    SELECT COUNT(*) FROM STU_TEL WHERE TEL IS NULL;
    -- (다)
    SELECT COUNT(TEL) FROM STU_TEL;
    1. (가) 1 / (나) 1 / (다) 3
    2. (가) 1 / (나) 1 / (다) 2
    3. (가) 0 / (나) 1 / (다) 3
    4. (가) 0 / (나) 2 / (다) 2
  19. 19. 다음 [ENROLL] 테이블에 SQL을 실행한 결과로 옳은 것은? (학번 앞 4자리는 입학년도이다. 결과는 YR / CNT / AVG_SC 순서)

    [ENROLL]

    STU_NO CRS_CD SCORE
    2023001 C1 80
    2023002 C1 NULL
    2024001 C1 90
    2024002 C2 70
    2023001 C2 60
    2025001 C1 100
    SELECT SUBSTR(STU_NO, 1, 4) AS YR,
           COUNT(*)              AS CNT,
           AVG(SCORE)            AS AVG_SC
      FROM ENROLL
     GROUP BY SUBSTR(STU_NO, 1, 4)
    HAVING COUNT(SCORE) >= 2
     ORDER BY YR;
    1. 2023 / 3 / 70, 2024 / 2 / 80
    2. 2023 / 3 / 46.67, 2024 / 2 / 80
    3. 2023 / 2 / 70, 2024 / 2 / 80
    4. 2023 / 3 / 70, 2024 / 2 / 80, 2025 / 1 / 100
  20. 20. 다음 [ENROLL] 테이블에 SQL을 실행한 결과로 옳은 것은? (S1은 C1 강좌를 재수강하였다.)

    [ENROLL]

    STU_NO CRS_CD SCORE
    S1 C1 85
    S1 C1 95
    S2 C1 90
    S2 C2 70
    S3 C2 92
    S3 C3 NULL
    S4 C1 60
    S4 C3 88
    SELECT STU_NO
      FROM ENROLL
     GROUP BY STU_NO
    HAVING COUNT(DISTINCT CRS_CD) >= 2
       AND MAX(SCORE) >= 90
     ORDER BY STU_NO;
    1. S1, S2, S3
    2. S2
    3. S2, S3
    4. S2, S3, S4
  21. 21. 다음 [STUDENT] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle 기준)

    [STUDENT]

    STU_NM DEPT_CD GPA
    김 CS 3.5
    이 NULL 4.0
    박 EE NULL
    최 CS NULL
    정 NULL 3.2
    한 EE 3.9
    SELECT STU_NM, DEPT_CD, GPA
      FROM STUDENT
     ORDER BY 2 NULLS FIRST, GPA DESC NULLS LAST;
    1. 김, 최, 한, 박, 이, 정
    2. 이, 정, 김, 최, 한, 박
    3. 정, 이, 최, 김, 박, 한
    4. 이, 정, 최, 김, 박, 한
  22. 22. STUDENT(STU_NO, STU_NM, DEPT_CD, GPA) 테이블에 대해 Oracle에서 (가)~(라)를 실행할 때, 오류 없이 실행되는 것은?

    -- (가)
    SELECT DISTINCT DEPT_CD FROM STUDENT ORDER BY STU_NM;
    
    -- (나)
    SELECT DEPT_CD, COUNT(*) FROM STUDENT GROUP BY DEPT_CD ORDER BY GPA;
    
    -- (다)
    SELECT STU_NM
      FROM (SELECT STU_NM, DEPT_CD FROM STUDENT)
     ORDER BY GPA;
    
    -- (라)
    SELECT STU_NM FROM STUDENT ORDER BY GPA DESC, DEPT_CD;
    1. (가)
    2. (나)
    3. (다)
    4. (라)
  23. 23. 다음 [ENROLL], [GRADE_RANGE] 테이블에 SQL을 실행했을 때 결과 건수는?

    [ENROLL]

    STU_NO SCORE
    S1 95
    S2 90
    S3 85
    S4 65
    S5 NULL

    [GRADE_RANGE]

    GRADE LO HI
    A 90 100
    B 80 90
    C 70 79
    SELECT E.STU_NO, G.GRADE
      FROM ENROLL E, GRADE_RANGE G
     WHERE E.SCORE BETWEEN G.LO AND G.HI;
    1. 4건
    2. 3건
    3. 5건
    4. 2건
  24. 24. 다음 [PROFESSOR], [COURSE] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, 이름은 가나다순으로 정렬된다.)

    [PROFESSOR]

    PROF_NO PROF_NM
    P1 김
    P2 이
    P3 박

    [COURSE]

    CRS_CD PROF_NO
    C1 P1
    C2 P1
    C3 P3
    C4 NULL
    SELECT P.PROF_NM, COUNT(C.CRS_CD) AS CNT
      FROM PROFESSOR P, COURSE C
     WHERE P.PROF_NO = C.PROF_NO(+)
     GROUP BY P.PROF_NM
     ORDER BY P.PROF_NM;
    1. 김 2, 박 1
    2. 김 2, 박 1, 이 1
    3. 김 2, 박 1, 이 0
    4. 김 2, 박 1, 이 0, NULL 1
  25. 25. 다음 [STUDENT], [ENROLL], [COURSE] 테이블에 SQL을 실행한 결과로 옳은 것은? (행의 순서는 고려하지 않는다. (STU_NO, CRS_NM)으로 표기)

    [STUDENT]

    STU_NO
    S1
    S2
    S3

    [ENROLL]

    STU_NO CRS_CD
    S1 C1
    S1 C9
    S2 C2

    [COURSE]

    CRS_CD CRS_NM
    C1 DB
    C2 OS
    SELECT S.STU_NO, C.CRS_NM
      FROM STUDENT S
           LEFT OUTER JOIN ENROLL E ON S.STU_NO = E.STU_NO
           INNER JOIN COURSE C      ON E.CRS_CD = C.CRS_CD;
    1. (S1, DB), (S1, NULL), (S2, OS), (S3, NULL)
    2. (S1, DB), (S2, OS), (S3, NULL)
    3. (S1, DB), (S1, NULL), (S2, OS)
    4. (S1, DB), (S2, OS)
  26. 26. 다음 [PROFESSOR], [COURSE] 테이블에 SQL을 실행한 결과로 옳은 것은? (C1 / C2 / C3 순서)

    [PROFESSOR]

    PROF_NO
    P1
    P2
    P3

    [COURSE]

    CRS_CD PROF_NO
    C1 P1
    C2 P1
    C3 P4
    C4 NULL
    SELECT COUNT(*)          AS C1,
           COUNT(P.PROF_NO)  AS C2,
           COUNT(C.CRS_CD)   AS C3
      FROM PROFESSOR P
           FULL OUTER JOIN COURSE C
             ON P.PROF_NO = C.PROF_NO;
    1. 6 / 4 / 6
    2. 6 / 4 / 4
    3. 5 / 4 / 4
    4. 4 / 3 / 4
  27. 27. 다음 [DEPT], [STUDENT] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은? (Oracle 기준)

    [DEPT]

    DEPT_CD DEPT_NM COLLEGE
    D1 컴퓨터공학과 공과대학
    D2 전자공학과 공과대학
    D3 국문학과 인문대학

    [STUDENT]

    STU_NM DEPT_CD
    김 D1
    이 D2
    박 D3
    -- (가)
    SELECT STU_NM FROM STUDENT
     WHERE DEPT_CD = (SELECT DEPT_CD FROM DEPT WHERE DEPT_NM = '물리학과');
    
    -- (나)
    SELECT STU_NM FROM STUDENT
     WHERE DEPT_CD = (SELECT DEPT_CD FROM DEPT WHERE COLLEGE = '공과대학');
    1. (가)는 0건이 정상 조회되고, (나)는 오류가 발생한다.
    2. (가)와 (나) 모두 오류가 발생한다.
    3. (가)는 0건, (나)는 김, 이 2건이 조회된다.
    4. (가)는 전체 3건이 조회되고, (나)는 오류가 발생한다.
  28. 28. 장학 선정 기준표 [SCHOLAR]와 [STUDENT] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은?

    [STUDENT]

    STU_NM DEPT GRADE
    A CS 1
    B CS 2
    C EE 1
    D EE 2
    E ME 1

    [SCHOLAR]

    DEPT GRADE
    CS 1
    EE 2
    -- (가)
    SELECT COUNT(*) FROM STUDENT
     WHERE (DEPT, GRADE) IN (SELECT DEPT, GRADE FROM SCHOLAR);
    
    -- (나)
    SELECT COUNT(*) FROM STUDENT
     WHERE DEPT  IN (SELECT DEPT  FROM SCHOLAR)
       AND GRADE IN (SELECT GRADE FROM SCHOLAR);
    1. (가) 2 / (나) 2
    2. (가) 4 / (나) 4
    3. (가) 4 / (나) 2
    4. (가) 2 / (나) 4
  29. 29. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, 값의 순서는 고려하지 않는다)

    [A]

    X
    1
    1
    2

    [B]

    X
    2
    3

    [C]

    X
    3
    SELECT X FROM A
    UNION ALL
    SELECT X FROM B
    MINUS
    SELECT X FROM C;
    1. 1, 1, 2, 2
    2. 1, 1, 2
    3. 1, 2
    4. 1, 2, 3
  30. 30. 다음 [ENROLL] 테이블에서 DB와 OS 강좌를 모두 수강한 학생의 학번을 조회하려 한다. 표의 데이터에 대해 요구사항을 정확히 만족하는 SQL은? (S2는 DB를 재수강하였다.)

    [ENROLL]

    STU_NO CRS_CD TERM
    S1 DB 2024-1
    S1 OS 2024-2
    S2 DB 2024-1
    S2 DB 2025-1
    S3 OS 2025-1
    -- (가)
    SELECT STU_NO FROM ENROLL WHERE CRS_CD = 'DB' AND CRS_CD = 'OS';
    
    -- (나)
    SELECT STU_NO FROM ENROLL WHERE CRS_CD = 'DB'
    INTERSECT
    SELECT STU_NO FROM ENROLL WHERE CRS_CD = 'OS';
    
    -- (다)
    SELECT STU_NO FROM ENROLL
     WHERE CRS_CD IN ('DB', 'OS')
     GROUP BY STU_NO
    HAVING COUNT(*) >= 2;
    
    -- (라)
    SELECT STU_NO FROM ENROLL WHERE CRS_CD = 'DB'
    MINUS
    SELECT STU_NO FROM ENROLL WHERE CRS_CD = 'OS';
    1. (가)
    2. (나)
    3. (다)
    4. (라)
  31. 31. 다음 [SCHOLAR] 테이블에 SQL을 실행했을 때, DEPT와 GRADE가 모두 NULL로 출력되는 행의 수와 그중 GD가 1인 행의 S 값으로 옳은 것은?

    [SCHOLAR]

    DEPT GRADE FEE
    CS 1 100
    CS 2 200
    EE 1 300
    NULL 1 50
    SELECT DEPT, GRADE,
           SUM(FEE)       AS S,
           GROUPING(DEPT) AS GD
      FROM SCHOLAR
     GROUP BY ROLLUP(DEPT, GRADE);
    1. 2건 / 650
    2. 1건 / 650
    3. 2건 / 50
    4. 1건 / 700
  32. 32. 다음 [STUDENT] 테이블에 SQL을 실행했을 때 결과 건수는?

    [STUDENT]

    STU_NO DEPT GRADE
    1 CS 1
    2 CS 1
    3 CS 2
    4 EE 2
    5 EE 3
    SELECT DEPT, GRADE, COUNT(*) AS CNT
      FROM STUDENT
     GROUP BY CUBE(DEPT, GRADE)
    HAVING GROUPING(DEPT) = 1;
    1. 1건
    2. 3건
    3. 5건
    4. 4건
  33. 33. 다음 [ENROLL] 테이블에 SQL을 실행했을 때, STU가 B인 행과 E인 행의 (DIFF, CNT) 값으로 옳은 것은?

    [ENROLL]

    STU CRS SCORE
    A DB 60
    B DB 90
    C DB 90
    D OS 70
    E OS 60
    SELECT STU,
           SCORE - AVG(SCORE) OVER (PARTITION BY CRS)            AS DIFF,
           COUNT(*)           OVER (PARTITION BY CRS ORDER BY SCORE) AS CNT
      FROM ENROLL
     ORDER BY STU;
    1. B (10, 2) / E (-5, 1)
    2. B (10, 3) / E (5, 2)
    3. B (10, 3) / E (-5, 1)
    4. B (-10, 2) / E (-5, 2)
  34. 34. 다음 [CREDIT_LOG] 테이블에 SQL을 실행했을 때 PREV_SUM 값을 출력 순서대로 나열한 것으로 옳은 것은?

    [CREDIT_LOG]

    STU TERM CREDIT
    S1 T1 18
    S1 T2 15
    S1 T3 21
    S2 T1 12
    S2 T2 18
    SELECT STU, TERM,
           SUM(CREDIT) OVER (PARTITION BY STU
                             ORDER BY TERM
                             ROWS BETWEEN UNBOUNDED PRECEDING
                                      AND 1 PRECEDING) AS PREV_SUM
      FROM CREDIT_LOG
     ORDER BY STU, TERM;
    1. NULL, 18, 33, NULL, 12
    2. 0, 18, 33, 0, 12
    3. 18, 33, 54, 12, 30
    4. NULL, 18, 33, 54, 66
  35. 35. 다음 [ENROLL] 테이블에 SQL을 실행했을 때 RK 값을 STU 순서(A~E)대로 나열한 것으로 옳은 것은? (Oracle 기준)

    [ENROLL]

    STU SCORE
    A 90
    B NULL
    C 85
    D 90
    E 70
    SELECT STU,
           RANK() OVER (ORDER BY SCORE DESC) AS RK
      FROM ENROLL
     ORDER BY STU;
    1. 1, 5, 3, 1, 4
    2. 2, 1, 4, 2, 5
    3. 1, NULL, 3, 1, 4
    4. 2, 1, 3, 2, 4
  36. 36. 다음 [ENROLL] 테이블에 대해 (가)~(다)를 실행했을 때 결과 건수로 옳은 것은?

    [ENROLL]

    STU SCORE
    A 95
    B 90
    C 90
    D 85
    E 80
    -- (가)
    SELECT COUNT(*) FROM (SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS R FROM ENROLL) WHERE R <= 3;
    
    -- (나)
    SELECT COUNT(*) FROM (SELECT RANK()       OVER (ORDER BY SCORE DESC) AS R FROM ENROLL) WHERE R <= 3;
    
    -- (다)
    SELECT COUNT(*) FROM (SELECT DENSE_RANK() OVER (ORDER BY SCORE DESC) AS R FROM ENROLL) WHERE R <= 3;
    1. (가) 3 / (나) 3 / (다) 3
    2. (가) 3 / (나) 4 / (다) 4
    3. (가) 2 / (나) 3 / (다) 4
    4. (가) 3 / (나) 3 / (다) 4
  37. 37. 다음 [ENROLL] 테이블에 SQL을 실행했을 때 결과 건수는? (Oracle 12c 이상 기준)

    [ENROLL]

    STU SCORE
    A 95
    B 90
    C 90
    D 85
    E 80
    SELECT STU, SCORE
      FROM ENROLL
     ORDER BY SCORE DESC
     FETCH FIRST 40 PERCENT ROWS WITH TIES;
    1. 2건
    2. 5건
    3. 3건
    4. 4건
  38. 38. 다음 [ORG] 테이블에 SQL을 실행했을 때, 결과에 포함되는 행은? (Oracle 기준, NAME | P_NAME | LV 순서로 표기)

    [ORG]

    ID NAME PID
    1 대학본부 NULL
    2 공과대학 1
    3 인문대학 1
    4 컴퓨터공학과 2
    5 전자공학과 2
    6 국문학과 3
    SELECT NAME,
           PRIOR NAME AS P_NAME,
           LEVEL      AS LV
      FROM ORG
     START WITH ID = 2
    CONNECT BY PRIOR ID = PID;
    1. 컴퓨터공학과 | 공과대학 | 2
    2. 공과대학 | 대학본부 | 1
    3. 전자공학과 | 공과대학 | 3
    4. 국문학과 | 인문대학 | 2
  39. 39. 다음 [ORG] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, PATH / LV 순서로 표기)

    [ORG]

    ID NAME PID
    1 대학본부 NULL
    2 공과대학 1
    3 인문대학 1
    4 컴퓨터공학과 2
    5 전자공학과 2
    6 국문학과 3
    SELECT SYS_CONNECT_BY_PATH(NAME, '/') AS PATH,
           LEVEL                          AS LV
      FROM ORG
     WHERE CONNECT_BY_ISLEAF = 1
     START WITH NAME = '컴퓨터공학과'
    CONNECT BY ID = PRIOR PID;
    1. /대학본부/공과대학/컴퓨터공학과 / 3
    2. /컴퓨터공학과/공과대학/대학본부 / 3
    3. /컴퓨터공학과/공과대학/대학본부 / 1
    4. /대학본부/공과대학/컴퓨터공학과 / 1
  40. 40. 다음 [ENROLL_G] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, (DEPT, A, B, F)를 출력 순서대로 표기)

    [ENROLL_G]

    DEPT GRADE
    CS A
    CS B
    CS A
    EE B
    EE C
    SELECT *
      FROM (SELECT DEPT, GRADE FROM ENROLL_G)
     PIVOT (COUNT(*) FOR GRADE IN ('A' AS A, 'B' AS B, 'F' AS F))
     ORDER BY DEPT;
    1. (CS, 2, 1, NULL), (EE, NULL, 1, NULL)
    2. (CS, 2, 1, 0), (EE, 0, 1, 1)
    3. (CS, 1, 1, 0), (EE, 0, 1, 0)
    4. (CS, 2, 1, 0), (EE, 0, 1, 0)
  41. 41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, A / B / C 순서)

    SELECT REGEXP_SUBSTR('2025CS0123', '[[:alpha:]]+')          AS A,
           REGEXP_SUBSTR('ab1234c56d7', '[0-9]{2,}', 1, 2)      AS B,
           REGEXP_COUNT('a.b.c', '.')                           AS C
      FROM DUAL;
    1. CS / 1234 / 2
    2. 2025CS / 56 / 5
    3. CS / 56 / 5
    4. CS / 56 / 2
  42. 42. 다음 [STU_CODE] 테이블에 SQL을 실행했을 때 결과 값은? (Oracle 기준, 대소문자를 구분한다.)

    [STU_CODE]

    CODE
    CS101
    EE202
    XCS10
    ABEE
    cs303
    MEEE
    SELECT COUNT(*)
      FROM STU_CODE
     WHERE REGEXP_LIKE(CODE, '^CS|EE$');
    1. 3
    2. 2
    3. 4
    4. 5
  43. 43. Oracle에서 아래 문장을 순서대로 실행했을 때 마지막 SELECT의 결과로 옳은 것은? (SUM / COUNT 순서)

    CREATE TABLE enroll (
      stu_no  VARCHAR2(5),
      crs_cd  VARCHAR2(5),
      score   NUMBER DEFAULT 0
    );
    INSERT INTO enroll VALUES ('S1', 'DB', 80);
    INSERT INTO enroll (stu_no, crs_cd) VALUES ('S2', 'DB');
    INSERT INTO enroll VALUES ('S3', 'DB', NULL);
    INSERT INTO enroll VALUES ('S4', 'OS', 70);
    
    UPDATE enroll SET score = score + 10 WHERE crs_cd = 'DB';
    
    SELECT SUM(score), COUNT(score) FROM enroll;
    1. 160 / 2
    2. 170 / 3
    3. 180 / 4
    4. 150 / 3
  44. 44. 다음 두 테이블에 대해 아래 MERGE 문을 실행(Oracle)한 후 STU_GPA 테이블의 데이터로 옳은 것은? (STU_NO, GPA 순)

    STU_GPA

    STU_NO GPA
    S1 3.5
    S2 2.8
    S3 4.0

    NEW_GPA

    STU_NO GPA
    S1 3.2
    S2 3.1
    S4 3.6
    S5 2.5
    MERGE INTO stu_gpa t
    USING new_gpa s
       ON (t.stu_no = s.stu_no)
     WHEN MATCHED THEN
       UPDATE SET t.gpa = s.gpa
        WHERE s.gpa > t.gpa
     WHEN NOT MATCHED THEN
       INSERT (stu_no, gpa) VALUES (s.stu_no, s.gpa)
        WHERE s.gpa >= 3.0;
    1. (S1, 3.2), (S2, 3.1), (S3, 4.0), (S4, 3.6)
    2. (S1, 3.5), (S2, 3.1), (S3, 4.0), (S4, 3.6), (S5, 2.5)
    3. (S1, 3.2), (S2, 3.1), (S3, 4.0), (S4, 3.6), (S5, 2.5)
    4. (S1, 3.5), (S2, 3.1), (S3, 4.0), (S4, 3.6)
  45. 45. CRS_SEAT 테이블은 CRS_CD VARCHAR2(5) PRIMARY KEY, CNT NUMBER CHECK (CNT <= 3)으로 정의되어 있고, ('DB', 2) 한 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행한 후 CRS_SEAT 테이블의 데이터로 옳은 것은? (오류가 발생한 문장은 무시하고 다음 문장이 실행된다고 가정한다.)

    UPDATE crs_seat SET cnt = cnt + 1 WHERE crs_cd = 'DB';
    SAVEPOINT sp1;
    UPDATE crs_seat SET cnt = cnt + 1 WHERE crs_cd = 'DB';
    INSERT INTO crs_seat VALUES ('OS', 1);
    ROLLBACK TO sp1;
    COMMIT;
    1. ('DB', 2)
    2. ('DB', 4), ('OS', 1)
    3. ('DB', 3)
    4. ('DB', 3), ('OS', 1)
  46. 46. 성적 처리 트랜잭션 TX1이 학생 S1의 점수를 조회해 80점을 얻었다. 그 사이 다른 트랜잭션 TX2가 S1의 점수를 90점으로 UPDATE하고 COMMIT했고, TX1이 같은 SELECT를 다시 실행하자 90점이 조회되었다.

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

    1. Non-Repeatable Read / REPEATABLE READ
    2. Phantom Read / REPEATABLE READ
    3. Dirty Read / READ COMMITTED
    4. Non-Repeatable Read / READ COMMITTED
  47. 47. Oracle의 VIEW, INDEX, SEQUENCE에 대한 설명으로 가장 적절한 것은?

    1. 뷰는 정의 시점의 SELECT 결과를 별도 저장 공간에 복사해 두므로, 원본 테이블을 삭제해도 뷰는 계속 조회할 수 있다.
    2. 인덱스는 조회 속도를 높일 수 있지만, INSERT·UPDATE·DELETE 시 인덱스도 함께 갱신되어 DML 부하가 늘어날 수 있다.
    3. 뷰의 정의를 바꾸려면 ALTER VIEW 뷰명 AS SELECT …로 SELECT 문을 직접 수정한다.
    4. SQL Server는 순번 생성에 시퀀스만 사용할 수 있으며, 테이블 컬럼에 IDENTITY 속성을 지정할 수 없다.
  48. 48. Oracle에서 선수과목을 관리하기 위해 아래와 같이 COURSE 테이블을 생성한 뒤(처음에는 비어 있음) ㄱ~ㄹ을 순서대로 실행했다. 실패하는 문장을 모두 고른 것은? (오류가 발생한 문장은 무시하고 다음 문장이 실행된다고 가정한다.)

    CREATE TABLE course (
      crs_cd  VARCHAR2(5)  PRIMARY KEY,
      crs_nm  VARCHAR2(20) NOT NULL,
      pre_cd  VARCHAR2(5)  REFERENCES course(crs_cd)
    );
    
    ㄱ. INSERT INTO course VALUES ('C2', '자료구조', 'C1');
    ㄴ. INSERT INTO course VALUES ('C1', '프로그래밍', NULL);
    ㄷ. INSERT INTO course VALUES ('C2', '자료구조', 'C1');
    ㄹ. DELETE FROM course WHERE crs_cd = 'C1';
    1. ㄱ
    2. ㄹ
    3. ㄱ, ㄹ
    4. ㄱ, ㄷ, ㄹ
  49. 49. PROF 사용자가 소유한 GRADE 테이블(STU_NO, CRS_CD, SCORE)에 대해 조교 TA1에게 다음 요구사항에 맞게 권한을 부여하려 한다. 가장 적절한 문장은? (Oracle 기준)

    조교는 성적 테이블을 조회할 수 있어야 하고, 점수(SCORE) 컬럼만 수정할 수 있어야 한다. 조교가 자신의 권한을 다른 사용자에게 다시 부여할 수는 없어야 한다.

    1. GRANT SELECT, UPDATE ON prof.grade TO ta1;
    2. GRANT SELECT, UPDATE (score) ON prof.grade TO ta1 WITH GRANT OPTION;
    3. GRANT ALL ON prof.grade TO ta1;
    4. GRANT SELECT, UPDATE (score) ON prof.grade TO ta1;
  50. 50. DBMS가 제공하는 롤(ROLE)에 대한 설명으로 가장 적절한 것은?

    1. SQL Server의 db_datareader는 데이터베이스 수준 롤로, 해당 데이터베이스의 모든 사용자 테이블을 조회할 수 있는 권한을 묶어 둔 것이다.
    2. Oracle의 CONNECT 롤에는 CREATE TABLE 권한이 포함되어 있어 CONNECT 롤만 받아도 테이블을 만들 수 있다.
    3. Oracle의 롤에는 시스템 권한만 담을 수 있고, SELECT ON 테이블과 같은 오브젝트 권한은 담을 수 없다.
    4. 롤에 부여된 권한을 회수해도, 이미 그 롤을 부여받은 사용자에게는 회수 결과가 반영되지 않는다.

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