본문 바로가기

SQLD

[SQLD 공부] 34회 기출문제 오답 및 모르는 것 정리

참고 : https://yunamom.tistory.com/237 

 

위 블로그에서 SQLD 기출문제를 열심히 돌리며 한글로 정리하다가

어차피 정리할 바에 블로그에도 쓰면 어디서든 볼 수 있으니 좋겠다는 생각이 들었다. 후후

열심히 업로드 해봐야지

 


 

 

11. 삭제

  • DROP : 구조, 데이터 전체 삭제
  • TRUNCATE : 구조 유지, 데이터만 전체 삭제
  • DELETE : 원하는 데이터만 삭제, 복구가능, 데이터 안줄음

 

 

12. ORDER BY 숫자

  • 해당 숫자 = SELECT절에서 언급한 컬럼 순서

 

 

13. Procedure, Trigger

 

 

 

16. WHERE절에 별도 조건절이 없을 경우, NESTED LOOP JOIN이 무조건 좋은 것은 아님

 

 

 

17. SUM NULL

  • SUM(COL1+COL2+COL3+COL4) : 한 행씩 다 더하는데 NULL이 있으면 NULL
  • SUM(COL1)+SUM(COL2)+SUM(COL3)+SUM(COL4) : NULL빼고 다 더하기

 

 

22. 집계함수

  • ROLLUP : 인수 순서중요(계층적), ORDER BY로 정렬
  • CUBE : 모든 값에 다차원집계 생성, 시스템에 많은 부하
  • GROUPING SETS : 인수 순서 무관(평등)

 

 

30. UPDATE -> CREATE -> ROLLBACK SQL SERVER/ORACLE 차이

  • ORACLE : DDL(CREATE, ALTER, DROP, TRUNCATE, RENAME) 시 커밋되므로,
  • CREATE 취소X, UPDATE만 진행
  • SQL SERVER : AUTO COMMIT을 꺼두면 UPDATE, CREATE 모두 취소, 테이블 생성 X

 

 

36.

CREATE TABLE 주문 (
    C1 NUMBER(10),
    C2 DATE,
    C3 VARCHAR(10),
    C4 NUMBER DEFAULT 100
);

INSERT INTO 주문 (C1,C2,C3) VALUES (1, SYSDATE, 'TEST1');

CREATE TABLE DEFAULT 값을 지정한 컬럼도 INSERT 시에 VALUES에 적어주어야함.

 

 

37. ORDER BY

  • ASC : 오름차순
  • DESC : 내림차순
  • 정렬할 컬럼을 SELECT절에 명시하지 않아도 됨
  • null : oracle은 가장 큰 값, sql server는 가장 작은 값으로 취급하여 정렬함
  • ORDER BY 1, COL1 과 같이 숫자와 컬럼을 혼용하여 사용할 수 있음

 

41. 집합연산자

참고 ㅣ https://keep-cool.tistory.com/45

  • UNION (합집합) : 중복X 결과의 합
  • UNION ALL (합집합) : 중복O 포함한 결과의 합
  • INTERSECT (교집합) : 양쪽 모두 포함된 행
  • 차집합 : MINUS(오라클), EXCEPT(SQL서버)  - 첫 번째에서 두 번째를 제외한 나머지

 

 

44. 계층구조

- start with로 지정된 값은 order by에 걸리지 않음(첫번째 행 제외)

 

 

 

47. with

- 서브쿼리를 with절로 정리가능, 임시테이블로 생각해도 무방함

상위 id값을 모두 더해야 한다

WITH WITH_TAB (last_name, EMP_ID, MGR_ID, sum_salary ) 
AS (
   SELECT last_name,EMPLOYEE_ID,MANAGER_ID, salary 
   FROM HR.EMPLOYEES
   WHERE MANAGER_ID IS NULL
UNION ALL
   SELECT a.last_name, a.EMPLoYEE_ID, a.MANAGER_ID, a.salary + b.sum_salary 
   FROM HR.EMPLOYEES A, WITH_TAB B
   WHERE B.EMP_ID = A.MANAGER_ID 
   )
SELECT SUM_SALARY FROM WITH_TAB 
WHERE EMP_ID = 105;

 

 

 

 

49. NTILE

- 전체 건수를 인수값으로 N등분

NTILE(4)니까 4개의 그룹으로 나눔. 남은 값은 윗 그룹부터 하나씩 나눠가짐

SELECT VAL, COUNT(*) AS CNT
  FROM (
       SELECT NTILE(4) OVER (ORDER BY COL1) AS VAL 
       FROM SQLD_34_X7
       ) 
WHERE 1=1
GROUP BY VAL 
ORDER BY 1;

 

 

 

50. LAG

- LAG(컬럼명 A, n) : n번째 이전 행의 A컬럼 값을 가져옴

SELECT EMPLOYEE_ID, 
     DEPARTMENT_ID, 
     LAST_NAME, 
     SALARY,
     LAG(SALARY, 2) OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY)
AS BEFORE_SALARY
FROM SQLD_50
WHERE EMPLOYEE_ID < 190;