WorkHard/자격증

[SQLD 개발자] 기출문제 공부(34회)

코딩공대 2023. 3. 3. 22:14
728x90

1. 주식별자를 도출하기 위한 기준?

  • 주식별자 특징은 -> 유 최 불 존
  • 유일성 : 유일하게 인스턴스를 구분 가능하다.
  • 최소성 : 주식별자의 속성 수가 최소이다.
  • 불변성 : 주식별자의 값은 변경이 안된다.
  • 존재성 : 반드시 값이 들어와야한다.(NOT NULL)

2. 속성의 특징?

  • Entity는 2개 이상의 속성으로 구성된다.
  • Entity를 설명하고, 인트턴스의 구성요소이다.
  • 하나의 속성은 하나의 값을 갖는다.
  • 속성은 모든 일반적인 기본속성, 새로만드는 설계속성, 영향을 받아서 발생하고, 빠른 성능과 계산을 하는 파생속성이 있다.

3. TABLE 명령어의 특징?

  • DROP : 구조까지 모두 삭제한다.
  • TRUNCATE : 구조를 유지하고 데이터만 삭제한다.
  • DELETE : 원하는 데티어만 삭제, 복구 가능하다. 용량이 줄지않고 느리다.

4. PROCEDURE, TRIGGER에 대한 설명?

  • PROCEDURE : EXECUTE명령어로 실행한다, CREATE PROCEDURE, COMMIT과 ROLLBACK이 가능하다.
  • TRIGGER : 이벤트 발생 시 자동실행된다, CREATE TRIGGER, COMMIT과 ROLLBACK이 불가능하다.

5. SQL을 ORACLE과 SQL SERVER에서 수행할 때에 대한 설명?

  • ORACLE의 경우 기본 값이 AUTO COMMIT OFF로 DDL이 일어날 경우 묵시적으로 COMMIT이 된다.(설정이 불가능하다.)
  • SQL SERVER의 경우 기본 값이 AUTO COMMIT ON으로 FALSE가 될 경우 DDL도 묵시적으로 COMMIT이 되지 않는다.
  • SQL SERVER의 경우, AUTO COMMIT을 OFF해두면 UPDATE, CREATE 모두 취소되고 다시 테이블이 생성되지 않는다.
  • ORACLE은 DDL의 AUTI COMMIT이 기본이기 때문에 CREATE와 UPDATE가 취소되지 않는다.

6. SQL결과가 다른것?

  • SELECT 고객ID, 이용일자 -> 왼쪽 테이블 전체
    FROM SQLD_34_22_01
    UNION -> 중복을 허용하지 않는 합집합
    SELECT 고객ID, 이용일자 -> 오른쪽 테이블 전체
    FROM SQLD_34_22_03 -> FILL OUTER JOIN
  1. A, B, 고객ID, 이용일자를 중복없이 모두 선택해서 CROSS JOIN이다.
  2. A, B, 고객ID, 이용일자 전부 선택해서 FULL OUTER JOIN이다.
  3. A의 고객ID, 이용일자 전부 선택한다, 중복을 허용하지 않는 합집합, B의 고객ID,이용일자를 전부 선택한다.
  4. A의 고객ID, 이용일자를 선택하되, B와 같은 고객ID는 허용하지 않는다.
    NOT EXIST(SELECT 'X' -> 'X'는 무시해도 괜찮다.
                         FROM ~~~
                         WHERE A.고객ID = B.고객ID)

7. 빈 칸에 들어갈 SQL문?

  • SELECT MIN(ID) FROM SQLD_34_32 GROUP BY NAME
     : FROM으로 표를 선택하고 이름으로 그룹을 만든다음 가장 작은 ID선택한다.

8. SQL중 잘못 된 것은?

  1. INSERT INTO 주문 VALUES(2, SYSDATE, 'TEST2') -> 행은 4개인데 3개만 INSERT되어서 안된다.
  2. 3. DELETE에서는 FROM이 생략될 수 있다.

9. ORDER BY의 특징?

  • ORDER BY의 기본 정렬은 오름차순이다.
  • SELECT 구문에 사용되지 않은 컬럼도 ORDER BY구문에서 사용할 수 있다.
  • ORDER BY 1, COL1과 같이 숫자와 컬럼을 혼용하여 사용할 수 있다.
  • ORACLE은 NULL을 가장 큰 값으로 취급하여 ORDER BY시 맨 뒤로 정렬되고 SQL SERVER에서는 반대로 가장 앞으로 정렬한다.

 


10. 사원과 관리자, 그리고 최상위 관리자가 나오도록 작성된 SQL을 완성하라.

  1. INNER JOIN을 하면 일치하는 것만 가져오니 최상위 관리자가 누락되서 불가능하다.
  2. INNER JOIN을 하면 일치하는 것만 가져오니 최상위 관리자가 누락되서 불가능하다.
  3. LEFT OUTER JOIN을 해야 최상위 관리자가 나오고 A.MANAGER_ID = B.MANAGER_ID가 되야 된다.
  4. A.EMPLOYEE_ID = B.MAANGER_ID로 반대가 되서 안된다.

11. 집합연산자?

  • 합집합 : UNION(느리다.)
  • 중복허용 합집합 : UNION ALL(빠르다.)
  • 차집합 : MINUS(ORACLE), EXCEPT(SQL SERVER)
  • 교집합 : INTERSECT

12. WINDOW FUNCTION?

  • PARTITION BY와 GROUP BY는 파티션 분할한다는 점에서 유사하다.
  • 집계 WINDOW FUNCTION(SUM, MAX, MIN) 쓸 때 WINDOW절과 함께하면 레코드 범위(집계대상) 지정이 가능하다.
  • WINDOW FUNCTION은 순위, 합계, 평균, 행위치 조작이 가능하다.
  • WINDOW FUNCTION은 행, 행 간 관계를 정의하는데 사용한다.
  • WINDOW FUNCTION으로 결과 건수가 줄지 않는다.
  • GROUP BY, WINDOW FUNCTION은 병행이 불가능하다.

13. 부서명, 부서에 소속된 사원명, 부서번호를 보여주고자 하고, 사원이 없는 부서도 보여주고자 할때 SQL문을 완성해라.

  • 사원이 없는 부서도 보여줘야한다. 따라서 모든 DEPT(부서)를 보여줘야 한다.
  • LEFT OUTER JOIN으로 보여줄 수 있다.

14. 아래 테이블에서 연봉이 2번째, 3번째로 높은 사원의 정보를 구해라

  • SALARY < (SELECT(MAX)(SALARY) FROM EMPLOYEES) )
  • 최댓값보다 작은 월급을 구하는 문제이기 때문에 '월급 < 최댓값'을 하면 2번째 월급부터 구할 수 있고 WHERE RN < 3; 으로 3번째까지 구할 수 있다.

15. SQL 문자 정리

  • UPPER() : 전부 대문자로 바꾼다.
  • LOWER() : 전부 소문자로 바꾼다.
  • LPAD(왼쪽) : LPAD("값", "총 문자길이", "채움문자")
                          LPAD(30, 5) -> 3자리가 공백으로 자동처리
                          LPAD(30, 5, '0') -> 출력값 : 00030
  • RPAD(오른쪽) : RPAD("값", "총 문자길이", "채움문자")
                              RPAD(30, 5) -> 3자리가 공백으로 자동처리
                              RPAD(30, 5, '0') -> 출력값 : 30000
  • LTRIM : LTRIM("문자열", "옵션")
                  LTRIM("  아") -> 왼쪽공백을 제거한다. 따라서 출력값은 '아'가 된다.
                  LTRIM("00030", "0") -> 왼쪽 반복문자를 제거한다. 따라서 출력값은 '30'이 된다.
                  LTRIM("ACCUT", "ACC") -> ACC를 지우고 'UT'만 남는다.
  • RTRIM : RTRIM("문자열", "옵션")
                  RTRIM("아  ") -> 오른쪽공백을 제거한다. 따라서 출력값은 '아'가 된다.
                  RTRIM("00030", "0") -> 오른쪽 반복문자를 제거한다. 따라서 출력값은 '0003'이 된다.
  • SUBSTR : SUBSTR("문자열", "시작위치", "길이")
                      SUBSTR("ABCD", 2) -> 앞쪽 두글자만 나오고 나머지는 자른다. 따라서 출력값은 'AB'가 된다.
                      SUBSTR("ABCD", -2) -> 뒤쪽 두글자만 나오고 나머지는 자른다. 따라서 출력값은'CD'가 된다.
                      SUBSTR("ABCD", 2, 1) -> 두번째에서 한글자를 출력한다. 따라서 출력값은 'B'가 된다.
  • INSTR : INSTR("문자열", "찾을 문자 값", "찾기 시작하는 위치(1, -1)", "찾은 결과 순번")
                  INSTR("HELLO WORLD", "O") -> 앞에서부터 5번째니까 5가된다.
                  INSTR("HELLO WORLD", "LO") -> 앞에서부터 4번째니까 4가된다.
                  INSTR("HELLO WORLD", "LVO") -> 없다.
                  INSTR("HELLO WORLD", "L", 1, 2) -> 1번부터 2번째 L을 찾아라. 따라서 출력값은 '4'가 된다.

16.SQL의 수행결과?

  • 문제에서 a.salary + b.sum_salary는 현재 SAL(EMPLOYEE_ID = 105)에서 루트SAL(MANAGER_ID IS NULL)까지 더하하는 뜻이고 조건은 B > EMPLOYEE_ID = A.MANAGER_ID 이다.
  • 현재 EMPLOYEE_ID 105에서 루트 100까지 SALARY를 더하되, B.EMPLOYEE_ID = A.MANAGER_ID인 105, 103, 102, 100의 SALARY를 더한다.
  • 따라서 4800 + 9000 + 17000 + 24000 = 54800이다.

17. SQL의 수행결과?

  • NOT -> AND -> OR순으로 연산한다.
  • MGR_ID IS NULL AND CODE = 'B'를 연산하면 아무것도 선택되지 않는다.
  • SALARY > 200 OR NULL 이기 때문에 SALARY > 200인 것만 선택한다.
  • EMP_ID가 2, 4, 5번 3개이기 때문에 3이된다.

18. 빈칸에 들어갈 SQL문은?

  • SQLD_34_49에서 RESULT를 보면 4개로 나눠져있다.
  • SELECT()(4)~~~~ -> ()안에 전체 건수를 인수값으로 N등분하는 'NTILE'를 넣어주면 RESULT처럼 4등분된 값이 나온다.

19. 

  • LAG(SALARY, () ) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY)  AS BEFORE_SALARY
  • LAG는 이전 N번째 행을 가지고 온다.    <->   LEAD는 이후 N번째 행을 가지고 온다.
  • DEPARTMENT_ID로 그룹을 묶고, SALARY로 오름차순 정렬한다.
  • 따라서 BEFORE_SALARY를 보면 두번째 이전의 SALARY값을 가지고 오므로 '2'가 된다.