SQLD 모의고사 20회

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

  1. 1. H사는 인사·급여 시스템을 구축하면서 여러 모델링 활동을 수행하였다. 각 활동과 데이터 모델링 관점을 짝지은 것으로 가장 적절한 것은?

    1. 사원·부서·직급 엔터티와 그 사이의 관계를 정의하는 활동 - 프로세스 관점
    2. '월 급여 계산' 업무가 어떤 절차로 수행되는지 시나리오를 분석하는 활동 - 데이터 관점
    3. '월 급여 계산' 업무가 근태 데이터를 읽고 급여명세 데이터를 생성하는지 CRUD 매트릭스로 분석하는 활동 - 상관 관점
    4. 개념 모델, 논리 모델, 물리 모델을 차례로 작성하는 활동 - 상관 관점
  2. 2. 인사 시스템을 분석하던 중 다음 엔터티 후보가 제시되었다. 엔터티로 정의하기에 가장 적절하지 않은 것은? (이 회사는 단일 법인이며 대표이사는 1명이다.)

    1. 회사대표정보: 회사 대표이사 1명의 성명과 취임일만 관리한다.
    2. 근태기록: 사원별·일자별 출퇴근 시각을 관리하며 급여 계산 시 조회된다.
    3. 직급: 사원·대리·과장 등 직급별 기본급 기준을 관리하며 사원이 직급을 참조한다.
    4. 휴가신청: 사원이 신청한 휴가의 기간·사유·승인상태를 관리한다.
  3. 3. 사원 엔터티에 '보유자격증' 정보를 관리하려 한다. 한 사원은 자격증을 0개 이상 여러 개 보유할 수 있다(예: 김하늘 - SQLD, 정보처리기사, ADsP). 이에 대한 설명으로 가장 적절한 것은?

    1. 하나의 속성에 여러 의미가 섞여 있으므로 복합 속성이며, 자격증명·발급기관 같은 하위 속성으로 쪼개어 사원에 그대로 둔다.
    2. 자격증 개수를 세어 얻는 값이므로 파생 속성에 해당한다.
    3. 'SQLD,정보처리기사,ADsP'처럼 쉼표로 구분하여 한 컬럼에 저장해도 제1정규형을 만족한다.
    4. 한 인스턴스가 여러 값을 가지는 다중값 속성이므로 사원자격증 같은 별도 엔터티로 분리하여 1:M 관계로 표현하는 것이 원칙이다.
  4. 4. 인사 시스템에서 다음과 같은 관계가 도출되었다.

    • 사원은 하나의 부서에 소속된다.
    • 사원은 휴가를 신청한다. (휴가를 신청해야 사원과 휴가신청이 연결된다.)

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

    1. 사원과 부서의 '소속' 관계는 사원이 소속 행위를 해야 성립하므로 행위적 관계이다.
    2. 사원과 휴가신청의 관계는 신청이라는 행위가 있어야 성립하므로 행위적 관계이다.
    3. ERD에서는 행위적 관계를 점선으로 그려 존재적 관계와 구분한다.
    4. UML 클래스 다이어그램에서 존재적 관계에 가까운 연관 관계는 점선으로 표현한다.
  5. 5. 인사 시스템의 두 엔터티가 다음과 같이 정의되어 있다.

    • 사원: 사원번호(입사 시 시스템이 부여), 주민등록번호(모든 사원이 보유하며 중복 없음), 사원명
    • 급여명세: 사원번호, 지급년월, 지급액 — 주식별자는 (사원번호, 지급년월)이며 사원번호는 사원을 참조한다.

    사원의 주식별자는 사원번호이다. 식별자에 대한 설명으로 가장 적절한 것은?

    1. 주민등록번호도 사원을 유일하게 구분하므로 사원 엔터티는 주식별자를 두 개 가진다.
    2. 급여명세의 사원번호는 사원으로부터 관계를 통해 받은 외부식별자이며, 주식별자의 일부이므로 두 엔터티는 식별 관계이다.
    3. 급여명세의 주식별자 (사원번호, 지급년월)은 한 엔터티의 주식별자이므로 단일식별자에 해당한다.
    4. 사원의 사원번호는 시스템이 부여하는 값이므로 외부식별자에 해당한다.
  6. 6. 다음 사원 테이블의 PK는 사원번호이며, 업무 규칙상 부서명과 부서장사번은 부서코드에 의해 결정된다.

    [사원]

    사원번호 사원명 부서코드 부서명 부서장사번
    E01 김하늘 D1 인재개발 E09
    E02 박서준 D1 인재개발 E09
    E03 이도윤 D2 급여운영 E11

    이 테이블과 이상현상에 대한 설명으로 가장 적절한 것은?

    1. PK가 아닌 속성이 PK의 일부에만 종속되는 부분 함수 종속이 있으므로 제2정규형을 위반한다.
    2. 사원이 아직 없는 신설 부서 'D3'를 등록할 수 없는 문제는 갱신 이상에 해당한다.
    3. 부서명·부서장사번이 부서코드를 거쳐 사원번호에 종속되는 이행 함수 종속이 있으므로, 부서 정보를 별도 테이블로 분리하면 제3정규형을 만족한다.
    4. 정규화를 수행하면 테이블 수가 줄어들어 사원과 부서명을 함께 조회할 때 조인이 필요 없어진다.
  7. 7. 사원과 사원상세는 1:1 관계이며, 사원상세는 사원 쪽에서 선택(Optional) 관계이다. 데이터가 다음과 같을 때 (가), (나) SQL의 결과로 옳은 것은?

    [HR_EMP]

    EMP_NO EMP_NM
    1001 김하늘
    1002 박서준
    1003 이도윤
    1004 최유나

    [EMP_DETAIL]

    EMP_NO ADDR
    1001 서울
    1003 대전
    1004 NULL
    -- (가)
    SELECT COUNT(*)
      FROM HR_EMP E
      INNER JOIN EMP_DETAIL D
        ON E.EMP_NO = D.EMP_NO;
    
    -- (나)
    SELECT COUNT(D.ADDR)
      FROM HR_EMP E
      LEFT OUTER JOIN EMP_DETAIL D
        ON E.EMP_NO = D.EMP_NO;
    1. (가) 3, (나) 2
    2. (가) 3, (나) 4
    3. (가) 4, (나) 3
    4. (가) 3, (나) 3
  8. 8. 인사·급여 시스템의 ERD가 다음과 같다. (IE 표기법, |는 필수, o는 선택, {는 여러 건을 의미한다.)

    신입 사원은 입사 직후에는 급여지급 이력이 없다. 이 모델을 바탕으로 한 트랜잭션 설계로 가장 적절한 것은?

    사원     ||--o{ 급여지급     : 받는다
    급여지급 ||--|{ 급여지급상세 : 구성된다
    1. 신규 입사자를 등록할 때는 첫 급여지급 데이터도 반드시 같은 트랜잭션에서 함께 생성해야 한다.
    2. 급여지급(헤더)을 먼저 INSERT하고 COMMIT한 뒤, 급여지급상세는 별도 트랜잭션으로 나중에 입력하는 것이 바람직하다.
    3. 급여지급상세 중 한 항목의 INSERT가 실패하면 성공한 항목만 COMMIT하는 것이 원자성을 지키는 방법이다.
    4. 급여지급과 급여지급상세는 하나의 트랜잭션으로 묶고, 사원 등록은 급여지급과 별도의 트랜잭션으로 처리할 수 있다.
  9. 9. 다음 [ATTEND_SUM] 테이블에 SQL을 실행한 결과로 옳은 것은? (LATE는 지각 횟수, ABSENT는 결근 일수이다.)

    [ATTEND_SUM]

    EMP_ID LATE ABSENT
    A 3 0
    B NULL 1
    C 0 NULL
    D NULL NULL
    E 5 2
    F 1 0
    SELECT EMP_ID
      FROM ATTEND_SUM
     WHERE NOT (LATE > 2 OR ABSENT > 0)
     ORDER BY EMP_ID;
    1. C, D, F
    2. C, F
    3. F
    4. 결과 없음
  10. 10. 업무 규칙상 한 사원은 하루에 근태 기록을 한 건만 가지며, 근태 조회는 대부분 사원번호와 근무일자로 수행된다. 근태 테이블을 다음과 같이 인조식별자 ATT_ID(시퀀스로 부여)를 PK로 설계하였다. 이 설계에 대한 설명으로 가장 적절한 것은?

    CREATE TABLE ATTEND (
      ATT_ID   NUMBER       PRIMARY KEY,
      EMP_NO   NUMBER       NOT NULL,
      WORK_DT  DATE         NOT NULL,
      IN_TM    VARCHAR2(5),
      OUT_TM   VARCHAR2(5),
      CONSTRAINT ATTEND_UK UNIQUE (EMP_NO, WORK_DT)
    );
    1. 본질식별자 (EMP_NO, WORK_DT)에 UNIQUE 제약을 두었으므로 같은 사원·같은 날짜의 근태 중복 입력은 막을 수 있지만, PK 인덱스와 UNIQUE 인덱스를 함께 유지해야 하므로 DML 부담이 늘어난다.
    2. ATT_ID가 PK이므로 ATTEND_UK가 없더라도 같은 사원의 같은 날짜 근태 중복 입력은 PK 제약으로 차단된다.
    3. 업무 조회가 주로 EMP_NO, WORK_DT로 이루어지므로 ATT_ID에 생성된 PK 인덱스가 조회 성능을 주로 담당한다.
    4. (EMP_NO, WORK_DT)는 부모인 사원으로부터 상속받은 사원번호를 포함하므로 인조식별자에 해당한다.
  11. 11. 인사팀이 '부서별 평균 급여'를 조회하려 한다. 관계형 데이터베이스와 SQL에 대한 설명으로 가장 적절한 것은?

    1. SQL은 절차적 언어이므로 '부서별 평균 급여'를 구하려면 행을 하나씩 읽는 반복 처리 순서를 직접 기술해야 한다.
    2. SQL은 원하는 결과(무엇)만 기술하고, 데이터를 어떤 경로와 순서로 읽을지(어떻게)는 옵티마이저가 결정한다.
    3. 관계 연산에서 WHERE 절은 투영(Projection)에, SELECT 절은 선택(Selection)에 해당한다.
    4. 관계형 데이터베이스는 정규화로 중복을 줄일 수 있지만, 여러 사용자의 동시 접근을 제어하는 기능은 제공하지 않는다.
  12. 12. 다음 [HR_EMP] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, 결과는 출력 순서대로 '이름(연봉)'으로 표기)

    [HR_EMP]

    EMP_NO NAME BASE_PAY ALLOWANCE
    1 한지우 300 50
    2 오세린 280 NULL
    3 문태오 350 0
    SELECT NAME, BASE_PAY * 12 + ALLOWANCE * 2 AS "연봉"
      FROM HR_EMP
     ORDER BY "연봉" DESC;
    1. 문태오(4200), 한지우(3700), 오세린(3360)
    2. 문태오(4200), 한지우(3700), 오세린(NULL)
    3. 오세린(NULL), 문태오(8400), 한지우(7300)
    4. 오세린(NULL), 문태오(4200), 한지우(3700)
  13. 13. HR_EMP 테이블에는 EMP_NO, NAME, DEPT_CD, BASE_PAY 컬럼이 있다. 다음 중 Oracle에서 오류 없이 실행되는 SQL은?

    1. SELECT E.*, E.BASE_PAY * 1.1 AS NEW_PAY FROM HR_EMP E;
    2. SELECT *, BASE_PAY * 1.1 AS NEW_PAY FROM HR_EMP;
    3. SELECT NAME AS EMP NAME, BASE_PAY FROM HR_EMP;
    4. SELECT DISTINCT NAME, DISTINCT DEPT_CD FROM HR_EMP;
  14. 14. 근속 기간과 급여 기준일을 계산하는 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 날짜는 YYYY-MM-DD로 표시, 결과는 A / B / C 순서)

    SELECT TRUNC(MONTHS_BETWEEN(DATE '2025-03-15', DATE '2020-09-20') / 12) AS A,
           ADD_MONTHS(DATE '2024-02-29', 12)                               AS B,
           LAST_DAY(DATE '2025-08-27')                                     AS C
      FROM DUAL;
    1. 4 / 2025-03-01 / 2025-08-31
    2. 5 / 2025-02-28 / 2025-08-31
    3. 4 / 2025-02-28 / 2025-08-31
    4. 5 / 2025-03-01 / 2025-08-31
  15. 15. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C / D 순서)

    SELECT SUBSTR('HR-2023-0157', INSTR('HR-2023-0157', '-', 1, 2) + 1) AS A,
           LPAD(TO_CHAR(57), 5, '0')                                  AS B,
           REPLACE('HR-2023-0157', '-')                               AS C,
           LENGTH(TRIM('  김 대리  '))                                AS D
      FROM DUAL;
    1. 0157 / 00057 / HR20230157 / 6
    2. 0157 / 00057 / HR20230157 / 4
    3. 2023-0157 / 57000 / HR 2023 0157 / 4
    4. 2023-0157 / 00057 / HR20230157 / 3
  16. 16. 다음 [PAYROLL] 테이블에 SQL을 실행했을 때 ALLOW 값을 EMP 순서(A~D)대로 나열한 것으로 옳은 것은? (Oracle)

    [PAYROLL]

    EMP POS OT_HOURS
    A 과장 5
    B 대리 NULL
    C 사원 0
    D NULL 3
    SELECT EMP,
           DECODE(POS, '과장', 30, '대리', 20, 10)
             + NVL2(OT_HOURS, OT_HOURS * 2, 0) AS ALLOW
      FROM PAYROLL
     ORDER BY EMP;
    1. 40, NULL, 10, 16
    2. 40, 20, 10, NULL
    3. 40, 20, 10, 6
    4. 40, 20, 10, 16
  17. 17. 다음 [STAFF] 테이블에 SQL을 실행한 결과로 옳은 것은?

    [STAFF]

    EMP_NO NAME
    1 김수진
    2 이수
    3 박민수
    4 수정란
    5 최수아수
    SELECT NAME
      FROM STAFF
     WHERE NAME LIKE '_수%'
       AND NAME NOT LIKE '%수'
     ORDER BY EMP_NO;
    1. 김수진, 이수
    2. 김수진, 최수아수
    3. 김수진, 이수, 최수아수
    4. 김수진
  18. 18. Oracle에서 다음과 같이 데이터를 입력하고 COMMIT하였다. (가)~(다) SQL의 결과로 옳은 것은? (REMARK는 VARCHAR2(20) 타입이며, 4번 행의 값은 공백 한 칸이다.)

    INSERT INTO STAFF_MEMO (EMP_NO, REMARK) VALUES (1, '휴직');
    INSERT INTO STAFF_MEMO (EMP_NO, REMARK) VALUES (2, '');
    INSERT INTO STAFF_MEMO (EMP_NO, REMARK) VALUES (3, NULL);
    INSERT INTO STAFF_MEMO (EMP_NO, REMARK) VALUES (4, ' ');
    COMMIT;
    
    -- (가)
    SELECT COUNT(*) FROM STAFF_MEMO WHERE REMARK IS NULL;
    -- (나)
    SELECT COUNT(*) FROM STAFF_MEMO WHERE REMARK = '';
    -- (다)
    SELECT COUNT(*) FROM STAFF_MEMO WHERE LENGTH(REMARK) >= 1;
    1. (가) 2, (나) 0, (다) 2
    2. (가) 1, (나) 1, (다) 2
    3. (가) 2, (나) 0, (다) 3
    4. (가) 1, (나) 0, (다) 3
  19. 19. 다음 [PAY_HIST] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 'DEPT CNT TOT' 순서)

    [PAY_HIST]

    EMP DEPT YM AMT
    서하준 개발 2025-01 400
    서하준 개발 2025-02 410
    윤채원 개발 2025-02 380
    정로운 영업 2025-01 350
    정로운 영업 2025-02 360
    강다인 인사 2025-02 300
    강다인 인사 2025-03 300
    SELECT DEPT, COUNT(DISTINCT EMP) AS CNT, SUM(AMT) AS TOT
      FROM PAY_HIST
     WHERE YM >= '2025-02'
     GROUP BY DEPT
    HAVING COUNT(*) >= 2
     ORDER BY DEPT;
    1. 개발 2 790 / 영업 1 360 / 인사 1 600
    2. 개발 3 1190 / 인사 2 600
    3. 개발 2 790 / 인사 1 600
    4. 개발 2 790 / 인사 2 600
  20. 20. 다음 [STAFF] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 'BAND CNT AVG_B' 순서)

    [STAFF]

    NAME SAL BONUS
    가온 450 50
    나린 400 NULL
    다엘 300 30
    라희 NULL 20
    마음 250 10
    SELECT CASE WHEN SAL >= 400 THEN 'H' ELSE 'L' END AS BAND,
           COUNT(*)   AS CNT,
           AVG(BONUS) AS AVG_B
      FROM STAFF
     GROUP BY CASE WHEN SAL >= 400 THEN 'H' ELSE 'L' END
     ORDER BY BAND;
    1. H 2 25 / L 3 20
    2. H 2 50 / L 3 20
    3. H 2 50 / L 2 20 / NULL 1 20
    4. H 2 25 / L 2 20
  21. 21. 다음 [STAFF] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle, 문자는 가나다순으로 정렬된다.)

    [STAFF]

    NAME DEPT BONUS
    하윤 개발 30
    지호 영업 NULL
    서연 개발 NULL
    도현 영업 50
    민서 개발 30
    SELECT NAME
      FROM STAFF
     ORDER BY DEPT, BONUS DESC, NAME;
    1. 서연, 민서, 하윤, 지호, 도현
    2. 민서, 하윤, 서연, 도현, 지호
    3. 하윤, 민서, 서연, 도현, 지호
    4. 서연, 하윤, 민서, 지호, 도현
  22. 22. 다음 [STAFF] 테이블에 대해 (1)~(4)의 ORDER BY 절로 정렬했을 때, 출력 순서가 나머지와 다른 것은? (Oracle)

    [STAFF]

    NAME SAL
    유진 320
    태민 NULL
    소율 410
    건우 280
    SELECT NAME, SAL AS PAY
      FROM STAFF
     ORDER BY ...;  -- (1)~(4)의 ORDER BY 절을 각각 적용
    1. ORDER BY PAY DESC
    2. ORDER BY 2 DESC
    3. ORDER BY -SAL
    4. ORDER BY SAL DESC
  23. 23. 다음 [STAFF], [ALLOW_RULE] 테이블에 SQL을 실행한 결과로 옳은 것은? (근속연수 구간별 부서 수당 규정이다.)

    [STAFF]

    NAME DEPT YEARS
    가 개발 3
    나 개발 5
    다 영업 3
    라 영업 10
    마 인사 1

    [ALLOW_RULE]

    DEPT MIN_YR MAX_YR AMT
    개발 0 3 10
    개발 3 6 20
    영업 0 5 15
    영업 5 9 25
    인사 2 9 5
    SELECT COUNT(*) AS CNT, SUM(R.AMT) AS TOT
      FROM STAFF S, ALLOW_RULE R
     WHERE S.DEPT = R.DEPT
       AND S.YEARS BETWEEN R.MIN_YR AND R.MAX_YR;
    1. CNT = 3, TOT = 45
    2. CNT = 5, TOT = 90
    3. CNT = 4, TOT = 55
    4. CNT = 4, TOT = 65
  24. 24. [STAFF] 테이블의 EVAL_NO는 평가자, MENTOR_NO는 멘토의 EMP_NO이다(FK 제약은 없다). 다음 SQL의 결과로 옳은 것은? (결과는 '사원-평가자-멘토' 형식)

    [STAFF]

    EMP_NO NAME EVAL_NO MENTOR_NO
    1 강민 NULL NULL
    2 노을 1 1
    3 류현 1 2
    4 문솔 2 NULL
    5 백설 3 9
    SELECT E.NAME, V.NAME AS EVAL_NM, M.NAME AS MENTOR_NM
      FROM STAFF E, STAFF V, STAFF M
     WHERE E.EVAL_NO   = V.EMP_NO
       AND E.MENTOR_NO = M.EMP_NO
     ORDER BY E.EMP_NO;
    1. 노을-강민-강민, 류현-강민-노을, 문솔-노을-NULL
    2. 노을-강민-강민, 류현-강민-노을
    3. 노을-강민-강민, 류현-강민-노을, 문솔-노을-NULL, 백설-류현-NULL
    4. 류현-강민-노을
  25. 25. 다음 [STAFF], [DEPT_M], [LOC_M] 테이블에 SQL을 실행했을 때 결과 행으로 옳은 것은?

    [STAFF]

    NAME DEPT_CD
    김 D1
    이 D2
    박 NULL
    최 D9

    [DEPT_M]

    DEPT_CD DNAME LOC_CD
    D1 개발 L1
    D2 영업 NULL
    D3 인사 L2

    [LOC_M]

    LOC_CD CITY
    L1 서울
    L2 부산
    SELECT S.NAME, D.DNAME, L.CITY
      FROM STAFF S
      LEFT OUTER JOIN DEPT_M D
        ON S.DEPT_CD = D.DEPT_CD
     INNER JOIN LOC_M L
        ON D.LOC_CD = L.LOC_CD;
    1. (김, 개발, 서울) 1행
    2. (김, 개발, 서울), (이, 영업, NULL) 2행
    3. (김, 개발, 서울), (이, 영업, NULL), (박, NULL, NULL), (최, NULL, NULL) 4행
    4. (김, 개발, 서울), (박, NULL, NULL), (최, NULL, NULL) 3행
  26. 26. 다음 [STAFF], [DEPT_M] 테이블에 (가), (나) SQL을 실행한 결과로 옳은 것은? (두 테이블에서 이름이 같은 컬럼은 DEPT_CD와 USE_YN이다.)

    [STAFF]

    EMP_NO DEPT_CD USE_YN
    1 D1 Y
    2 D1 N
    3 D2 Y
    4 D3 Y

    [DEPT_M]

    DEPT_CD DNAME USE_YN
    D1 개발 Y
    D2 영업 N
    D3 인사 Y
    -- (가)
    SELECT COUNT(*) FROM STAFF NATURAL JOIN DEPT_M;
    
    -- (나)
    SELECT COUNT(*) FROM STAFF JOIN DEPT_M USING (DEPT_CD);
    1. (가) 4, (나) 4
    2. (가) 2, (나) 2
    3. (가) 2, (나) 4
    4. (가) 4, (나) 2
  27. 27. 다음 [STAFF], [DEPT_M] 테이블에 (가), (나) SQL을 실행한 결과로 옳은 것은?

    [STAFF]

    NAME DEPT_CD BONUS
    김 D1 100
    이 D1 NULL
    박 D2 200
    최 NULL 150

    [DEPT_M]

    DEPT_CD DNAME
    D1 개발
    D2 영업
    D3 인사
    -- (가)
    SELECT COUNT(*)
      FROM DEPT_M D
     WHERE EXISTS (SELECT NULL
                     FROM STAFF S
                    WHERE S.DEPT_CD = D.DEPT_CD
                      AND S.BONUS IS NULL);
    
    -- (나)
    SELECT COUNT(*)
      FROM DEPT_M D
     WHERE NOT EXISTS (SELECT 1
                         FROM STAFF S
                        WHERE S.DEPT_CD = D.DEPT_CD
                          AND S.BONUS > 120);
    1. (가) 0, (나) 2
    2. (가) 1, (나) 2
    3. (가) 1, (나) 0
    4. (가) 2, (나) 2
  28. 28. 다음 [STAFF] 테이블에 대해 실행할 때 오류가 발생하는 SQL은? (Oracle)

    [STAFF]

    NAME DEPT_CD SAL
    송지안 D1 380
    임하람 D1 420
    배시온 D2 350
    진다올 D3 300
    1. SELECT NAME FROM STAFF WHERE SAL > (SELECT AVG(SAL) FROM STAFF WHERE DEPT_CD = 'D1');
    2. SELECT NAME FROM STAFF WHERE SAL > ALL (SELECT SAL FROM STAFF WHERE DEPT_CD = 'D1');
    3. SELECT NAME FROM STAFF WHERE SAL = (SELECT SAL FROM STAFF WHERE DEPT_CD = 'D9');
    4. SELECT NAME FROM STAFF WHERE SAL > (SELECT SAL FROM STAFF WHERE DEPT_CD = 'D1');
  29. 29. 정규직 급여(PAY_REG)와 계약직 급여(PAY_CON)를 합쳐 부서별 급여 합계를 구하려고 다음 SQL을 실행했다. 결과로 옳은 것은?

    [PAY_REG]

    DEPT AMT
    개발 300
    개발 300
    영업 250

    [PAY_CON]

    DEPT AMT
    개발 200
    영업 250
    인사 180
    SELECT DEPT, SUM(AMT) AS TOT
      FROM (SELECT DEPT, AMT FROM PAY_REG
            UNION
            SELECT DEPT, AMT FROM PAY_CON)
     GROUP BY DEPT
     ORDER BY DEPT;
    1. 개발 500 / 영업 250 / 인사 180
    2. 개발 800 / 영업 500 / 인사 180
    3. 개발 500 / 영업 500 / 인사 180
    4. 개발 800 / 영업 250 / 인사 180
  30. 30. 다음 [GRADE_A], [GRADE_B] 테이블에 (가), (나) SQL을 실행한 결과로 옳은 것은?

    [GRADE_A]

    DEPT_CD GRADE
    D1 S
    D2 NULL
    D3 A

    [GRADE_B]

    DEPT_CD GRADE
    D2 NULL
    D3 A
    D4 B
    -- (가)
    SELECT COUNT(*)
      FROM (SELECT DEPT_CD, GRADE FROM GRADE_A
            INTERSECT
            SELECT DEPT_CD, GRADE FROM GRADE_B);
    
    -- (나)
    SELECT COUNT(*)
      FROM GRADE_A A
      JOIN GRADE_B B
        ON A.DEPT_CD = B.DEPT_CD
       AND A.GRADE   = B.GRADE;
    1. (가) 1, (나) 1
    2. (가) 2, (나) 2
    3. (가) 2, (나) 1
    4. (가) 3, (나) 1
  31. 31. 다음 [ATT_OT] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, 결과는 (DEPT | GRADE | OT)로 출력 순서대로 표기)

    [ATT_OT]

    DEPT GRADE OT_HR
    개발 대리 10
    개발 대리 6
    개발 과장 4
    영업 대리 8
    영업 사원 2
    SELECT DEPT, GRADE, SUM(OT_HR) AS OT
      FROM ATT_OT
     GROUP BY ROLLUP(DEPT, GRADE)
    HAVING GROUPING(GRADE) = 1
     ORDER BY DEPT;
    1. (개발 | NULL | 20), (영업 | NULL | 10)
    2. (개발 | NULL | 20), (영업 | NULL | 10), (NULL | NULL | 30)
    3. (NULL | 대리 | 24), (NULL | 과장 | 4), (NULL | 사원 | 2), (NULL | NULL | 30)
    4. (개발 | 대리 | 16), (개발 | 과장 | 4), (영업 | 대리 | 8), (영업 | 사원 | 2)
  32. 32. 다음 SQL과 항상 같은 결과 집합(행 순서는 무시)을 반환하도록 GROUP BY 절을 바꾼 것으로 옳은 것은?

    SELECT DEPT, GRADE, SUM(OT_HR) AS OT
      FROM ATT_OT
     GROUP BY ROLLUP(DEPT, GRADE);
    1. GROUP BY GROUPING SETS (DEPT, GRADE, ())
    2. GROUP BY CUBE(DEPT, GRADE)
    3. GROUP BY GROUPING SETS ((DEPT, GRADE), GRADE, ())
    4. GROUP BY GROUPING SETS ((DEPT, GRADE), DEPT, ())
  33. 33. 다음 [STAFF] 테이블에 SQL을 실행했을 때 S1 값을 NAME 순서(가~마)대로 나열한 것으로 옳은 것은?

    [STAFF]

    NAME DEPT SAL
    가 D1 300
    나 D1 300
    다 D1 400
    라 D2 200
    마 D2 250
    SELECT NAME,
           SUM(SAL) OVER (PARTITION BY DEPT ORDER BY SAL) AS S1
      FROM STAFF
     ORDER BY NAME;
    1. 300, 600, 1000, 200, 450
    2. 600, 600, 1000, 450, 450
    3. 600, 600, 1000, 200, 450
    4. 1000, 1000, 1000, 450, 450
  34. 34. 다음 [PAY_HIST] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 (EMP, YM)을 출력 순서대로 표기)

    [PAY_HIST]

    EMP YM AMT
    A 01 300
    A 02 300
    A 03 330
    B 01 280
    B 02 290
    B 03 285
    SELECT EMP, YM
      FROM (SELECT EMP, YM,
                   AMT - LAG(AMT) OVER (PARTITION BY EMP ORDER BY YM) AS DIFF
              FROM PAY_HIST)
     WHERE DIFF > 0
     ORDER BY EMP, YM;
    1. (A, 03), (B, 02)
    2. (A, 01), (A, 03), (B, 01), (B, 02)
    3. (A, 03), (B, 01), (B, 02)
    4. (A, 03)
  35. 35. 다음 [WORK_LOG] 테이블에 SQL을 실행했을 때 M 값을 DAY 순서대로 나열한 것으로 옳은 것은?

    [WORK_LOG]

    DAY HRS
    1 8
    2 10
    3 7
    4 9
    5 6
    SELECT DAY,
           MIN(HRS) OVER (ORDER BY DAY
                          ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS M
      FROM WORK_LOG
     ORDER BY DAY;
    1. 8, 8, 7, 7, 6
    2. 8, 7, 7, 6, 6
    3. 7, 7, 6, 6, 6
    4. 6, 6, 6, 6, 6
  36. 36. 다음 [STAFF] 테이블에 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 12c 이상)

    [STAFF]

    NAME SAL
    가 500
    나 450
    다 450
    라 450
    마 300
    -- (가)
    SELECT NAME, SAL FROM STAFF
     ORDER BY SAL DESC
     FETCH FIRST 2 ROWS ONLY;
    
    -- (나)
    SELECT NAME, SAL FROM STAFF
     ORDER BY SAL DESC
     FETCH FIRST 2 ROWS WITH TIES;
    1. (가) 2건, (나) 2건
    2. (가) 2건, (나) 3건
    3. (가) 4건, (나) 4건
    4. (가) 2건, (나) 4건
  37. 37. 급여 상위 2명을 조회하려고 다음 SQL을 작성했다. 결과로 옳은 것은? (Oracle, 테이블의 행은 표에 나온 순서대로 읽힌다고 가정하며 출력 순서는 고려하지 않는다.)

    [STAFF]

    NAME SAL
    정하윤 300
    한도겸 500
    윤슬기 400
    강예준 450
    조은비 350
    SELECT NAME
      FROM (SELECT ROWNUM AS RN, NAME, SAL
              FROM STAFF
             ORDER BY SAL DESC)
     WHERE RN <= 2;
    1. 한도겸, 정하윤
    2. 한도겸, 강예준
    3. 강예준, 윤슬기
    4. 결과 없음
  38. 38. 다음 [HR_ORG] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle, 문자는 가나다순으로 정렬된다.)

    [HR_ORG]

    ORG_ID ORG_NM UP_ID
    1 본사 NULL
    2 영업본부 1
    3 개발본부 1
    4 국내영업팀 2
    5 해외영업팀 2
    6 백엔드팀 3
    7 데이터팀 3
    SELECT ORG_NM
      FROM HR_ORG
     START WITH UP_ID IS NULL
    CONNECT BY PRIOR ORG_ID = UP_ID
     ORDER SIBLINGS BY ORG_NM;
    1. 본사, 개발본부, 영업본부, 데이터팀, 백엔드팀, 국내영업팀, 해외영업팀
    2. 본사, 영업본부, 국내영업팀, 해외영업팀, 개발본부, 백엔드팀, 데이터팀
    3. 본사, 개발본부, 데이터팀, 백엔드팀, 영업본부, 국내영업팀, 해외영업팀
    4. 개발본부, 국내영업팀, 데이터팀, 백엔드팀, 본사, 영업본부, 해외영업팀
  39. 39. 다음 [STAFF] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, MGR_NO는 상사의 EMP_NO이다. 결과는 TOT / MAX_LV 순서)

    [STAFF]

    EMP_NO NAME MGR_NO SAL
    1 서지환 NULL 900
    2 정다빈 1 600
    3 류승호 1 650
    4 남궁민 2 400
    5 황보람 2 420
    6 오시윤 4 300
    7 탁재희 3 380
    SELECT SUM(SAL) AS TOT, MAX(LEVEL) AS MAX_LV
      FROM STAFF
     START WITH NAME = '정다빈'
    CONNECT BY PRIOR EMP_NO = MGR_NO;
    1. 1720 / 4
    2. 1720 / 3
    3. 1120 / 2
    4. 3650 / 4
  40. 40. 다음 [PAY_Q] 테이블에 SQL을 실행했을 때 DEPT가 '개발'인 행의 값으로 옳은 것은? (Oracle)

    [PAY_Q]

    DEPT QTR AMT
    개발 Q1 100
    개발 Q1 50
    개발 Q2 80
    영업 Q2 70
    영업 Q3 90
    SELECT *
      FROM (SELECT DEPT, QTR, AMT FROM PAY_Q)
     PIVOT (SUM(AMT) AS S, COUNT(*) AS C
            FOR QTR IN ('Q1' AS Q1, 'Q2' AS Q2))
     ORDER BY DEPT;
    1. Q1_S = 150, Q1_C = 1, Q2_S = 80, Q2_C = 1
    2. S_Q1 = 150, C_Q1 = 2, S_Q2 = 80, C_Q2 = 1
    3. Q1_S = 100, Q1_C = 2, Q2_S = 80, Q2_C = 1
    4. Q1_S = 150, Q1_C = 2, Q2_S = 80, Q2_C = 1
  41. 41. 사원의 보유 자격증 목록이 쉼표로 구분되어 저장되어 있다. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 C / S 순서)

    SELECT REGEXP_COUNT('SQLD,ADsP,,정보처리기사', '[^,]+')        AS C,
           REGEXP_SUBSTR('SQLD,ADsP,,정보처리기사', '[^,]+', 1, 3) AS S
      FROM DUAL;
    1. 3 / 정보처리기사
    2. 4 / NULL
    3. 4 / 정보처리기사
    4. 3 / ADsP
  42. 42. 다음 [EMP_ID_T] 테이블에 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle)

    [EMP_ID_T]

    EMP_ID
    EMP0123
    emp0456
    EMP12345
    EMP-0789
    XEMP0001
    -- (가)
    SELECT COUNT(*) FROM EMP_ID_T
     WHERE REGEXP_LIKE(EMP_ID, '^EMP[0-9]{4}$');
    
    -- (나)
    SELECT COUNT(*) FROM EMP_ID_T
     WHERE REGEXP_LIKE(EMP_ID, '^EMP[0-9]{4}$', 'i');
    1. (가) 1건, (나) 1건
    2. (가) 1건, (나) 2건
    3. (가) 2건, (나) 2건
    4. (가) 2건, (나) 3건
  43. 43. 다음 [STAFF] 테이블에 UPDATE 문을 실행한 후 SELECT SUM(SAL), SUM(BONUS) FROM STAFF;의 결과로 옳은 것은?

    [STAFF]

    EMP_NO SAL BONUS
    1 300 20
    2 400 NULL
    UPDATE STAFF
       SET SAL   = SAL + BONUS,
           BONUS = SAL * 0.1;
    1. 320, 32
    2. 720, 70
    3. 320, 70
    4. 720, 72
  44. 44. PAY_LOG(EMP_NO, AMT)와 BONUS_LOG(EMP_NO)는 처음에 비어 있고 제약조건은 없다. [STAFF] 테이블이 다음과 같을 때, 아래 문장을 실행(Oracle)한 후 PAY_LOG와 BONUS_LOG의 행 수로 옳은 것은?

    [STAFF]

    EMP_NO DEPT_CD SAL BONUS
    1 D1 300 30
    2 D1 280 NULL
    3 D2 350 20
    INSERT ALL
      INTO PAY_LOG (EMP_NO, AMT) VALUES (EMP_NO, SAL)
      INTO PAY_LOG (EMP_NO, AMT) VALUES (EMP_NO, BONUS)
      INTO BONUS_LOG (EMP_NO)    VALUES (EMP_NO)
    SELECT EMP_NO, SAL, BONUS
      FROM STAFF
     WHERE DEPT_CD = 'D1';
    1. PAY_LOG 2건, BONUS_LOG 2건
    2. PAY_LOG 3건, BONUS_LOG 2건
    3. PAY_LOG 4건, BONUS_LOG 4건
    4. PAY_LOG 4건, BONUS_LOG 2건
  45. 45. STAFF_PAY 테이블에는 (EMP_NO, SAL) = (1, 100)인 한 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행한 후 SELECT SAL FROM STAFF_PAY WHERE EMP_NO = 1;의 결과는? (오류가 발생한 문장은 무시하고 진행한다.)

    UPDATE staff_pay SET sal = 200 WHERE emp_no = 1;
    SAVEPOINT a;
    UPDATE staff_pay SET sal = 300 WHERE emp_no = 1;
    SAVEPOINT b;
    UPDATE staff_pay SET sal = 400 WHERE emp_no = 1;
    ROLLBACK TO a;
    UPDATE staff_pay SET sal = sal + 50 WHERE emp_no = 1;
    ROLLBACK TO b;
    COMMIT;
    1. 250
    2. 300
    3. 100
    4. 350
  46. 46. Oracle에서 급여 테이블에 UPDATE를 실행하고 아직 COMMIT하지 않은 상태이다. 이후 다음 상황이 일어났을 때, 진행 중이던 트랜잭션이 종료되지 않는 경우는?

    1. 같은 세션에서 CREATE TABLE 문을 실행했다.
    2. 같은 세션에서 ROLLBACK TO sp1;을 실행했다. (sp1은 UPDATE 이전에 지정한 저장점이다.)
    3. 같은 세션에서 다른 사용자에게 GRANT 문을 실행했다.
    4. 네트워크 장애로 세션이 비정상 종료되었다.
  47. 47. 인사 시스템의 DEPT_H(부모)와 STAFF_H(자식) 테이블을 설계할 때 DDL에 대한 설명으로 가장 적절하지 않은 것은?

    1. STAFF_H의 FK가 DEPT_H를 참조하고 있으면 Oracle에서 DROP TABLE DEPT_H;는 실패하며, DROP TABLE DEPT_H CASCADE CONSTRAINTS;로 참조 제약까지 함께 삭제해야 한다.
    2. 부서별 사원을 보여 주는 뷰의 정의를 바꾸려면 CREATE OR REPLACE VIEW로 다시 생성한다.
    3. Oracle에서 FK에 ON UPDATE CASCADE를 지정하면 DEPT_H의 부서코드를 변경할 때 STAFF_H의 부서코드도 함께 변경된다.
    4. STAFF_H의 EMAIL 컬럼에 UNIQUE 제약을 두면 Oracle에서는 EMAIL이 NULL인 행을 여러 건 넣을 수 있지만, SQL Server에서는 한 건만 넣을 수 있다.
  48. 48. Oracle에서 아래 문장을 순서대로 실행했다. 실패한 문장과 마지막 SELECT의 결과로 옳은 것은? (오류가 발생한 문장은 무시하고 진행한다. DEPT_H에는 'D1', 'D2', STAFF_H에는 (1, 'D1'), (2, 'D1'), (3, 'D2')가 커밋되어 있다.)

    CREATE TABLE dept_h (
      dept_cd  CHAR(2)  PRIMARY KEY,
      dname    VARCHAR2(20)
    );
    CREATE TABLE staff_h (
      emp_no   NUMBER   PRIMARY KEY,
      dept_cd  CHAR(2)  REFERENCES dept_h(dept_cd) ON DELETE SET NULL
    );
    -- (데이터 입력 및 COMMIT 완료)
    
    DELETE FROM dept_h WHERE dept_cd = 'D1';        -- ㄱ
    DROP TABLE dept_h;                              -- ㄴ
    DROP TABLE dept_h CASCADE CONSTRAINTS;          -- ㄷ
    INSERT INTO staff_h VALUES (4, 'D9');           -- ㄹ
    
    SELECT COUNT(*), COUNT(dept_cd) FROM staff_h;
    1. ㄴ만 실패 / 3, 1
    2. ㄴ, ㄹ 실패 / 3, 1
    3. ㄱ, ㄴ 실패 / 4, 3
    4. ㄴ만 실패 / 4, 2
  49. 49. 인사 스키마 HRADM의 객체에 대한 권한을 부여하려 한다. Oracle의 오브젝트 권한에 대한 설명으로 가장 적절한 것은?

    1. 시퀀스 HRADM.EMP_SEQ에는 SELECT 권한과 ALTER 권한을 부여할 수 있다.
    2. 뷰 HRADM.V_PAY에 INDEX 권한을 부여하면 해당 사용자가 뷰에 인덱스를 생성할 수 있다.
    3. 급여 계산 프로시저 HRADM.CALC_PAY를 실행하게 하려면 SELECT 권한을 부여한다.
    4. REFERENCES 권한은 다른 사용자가 해당 뷰를 참조하는 FK 제약조건을 만들 수 있게 하는 권한이다.
  50. 50. 다음 문장을 순서대로 실행할 때 오류가 발생하는 문장을 모두 고른 것은? (Oracle, PAYROLL은 HRADM 소유 테이블이며 U1~U3는 이 문장들 외에 다른 권한을 받은 적이 없다.)

    -- DBA 실행
    GRANT CREATE VIEW TO u1 WITH ADMIN OPTION;            -- ①
    GRANT CREATE VIEW TO u2 WITH ADMIN OPTION;            -- ②
    -- U1 실행
    GRANT CREATE VIEW TO u3;                              -- ③
    -- U2 실행
    REVOKE CREATE VIEW FROM u3;                           -- ④
    -- HRADM 실행
    GRANT SELECT ON hradm.payroll TO u1 WITH GRANT OPTION;  -- ⑤
    GRANT SELECT ON hradm.payroll TO u2 WITH GRANT OPTION;  -- ⑥
    -- U1 실행
    GRANT SELECT ON hradm.payroll TO u3;                  -- ⑦
    -- U2 실행
    REVOKE SELECT ON hradm.payroll FROM u3;               -- ⑧
    1. ④
    2. ⑧
    3. ④, ⑧
    4. 없음

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