* Youtube Link - https://www.youtube.com/watch?v=rDBZ6q0QqBU&list=PL6i7rGeEmTvpLoDkB-kECcuD1zDt_gaPn&index=9
01. SQL 조회 순서
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 의 순서로 조회가 된다.
HAVING의 경우 GROUP BY를 통해서 집계가 완료된 상태를 토대로 추가적인 필터링을 하는 것이다.
그리고 SELECT를 통해서 해당하는 데이터가 출력이 된다.
ORDER BY를 통해서 출력하는 대상을 특정 컬럼을 기준으로 정렬을 한다.
그래서 순서를 잘 암기해야 한다.
02. 다중 컬럼 연산
예를 들어 컬럼 IN (1,2,3); 이면
컬럼 = 1 OR 컬럼 = 2 OR 컬럼 = 3이 됩니다.
다중 컬럼 연산의 경우
WHERE (COL1, COL2) IN ('x', 'y'), ('KK', 'BB')); 이면
COL1 = 'x' 이고 COL2 = 'y' 이거나 COL1 = 'KK' 이고 COL2 = 'BB'인 경우이다.
각각 AND 그리고 OR 별로 처리가 된다.
여기서 NOT 연산은 TRUE -> FALSE로 그리고 FALSE -> TRUE로 변환하는 것이다.
그러면 해당 컬럼들을 제외한 값을 조회하는 결과가 되므로
같은 결과가 나온다.
이외 2~4번까지를 보면
가로 안에 OR 또는 = 연산자가 들어가는 것을 볼 수 있다.
이러한 방식으로도 연산이 가능하다.
다중 연산을 풀어서 설명한 그림이다.
정답은 (3)이다.
AND와 OR에는 우선순위가 있다.
AND -> OR 순서로 처리가 된다. 마치 수학에서 곱하기와 더하기와 같다.
03. WITH GRANT OPTION 과 권한 회수
예를 들어
REVOKE 권한 FROM B CASCADE 라고 작성을 하시면
WITH GRANT OPTOIN으로 권한을 주었던 그 대상도 연쇄적으로 뺏어버린다.
CASCADE 를 작성을 안 하면 B만 뺏기고 C는 그대로 권한을 갖고 있는 것이다.
CASCADE를 사용을 한 다는 가정하에 정답은 (4)이다.
그러나 CASCADE를 사용을 안 한다면 정답은 (3)이다.
04. CASCADE CONSTRAINT
만일 DROP TABLE [테이블명] CASCADE CONSTRAINTS; 를 하면
테이블과 그에 연관된 제약조건들이 전부 다 삭제가 된다.
예를 들어 STUDENT 테이블을 삭제를 하면 STUDENT_TEL과 STUDENT_ADDR과의 관계가 제거됩니다.
즉 STUDENT_TEL과 STUDENT_ADDR의 FK였던 데이터들은 그대로 남아 있지만 FK였던 제약조건은 의미가 없어지므로 제거가 됩니다.
그 반대로 CASCADE CONSTRAINTS를 붙이지 않는다면 STUDENT_TEL, STUDENT_ADDR은 제약조건에 의해서 제거가 되지 않습니다.
* CASCADE는 SQL-SERVER에서는 지원하지 않는다. SQL-SERVER는 MS사이다. ORACLE사가 아니다.
정답은 (4)이다.
05. DDL/DML/DCL/TCL
정답은 (2) DML에 대한 설명이다.
DCL은 데이터 컨트롤 언어이다.
06. NVL() 함수 사용
GROUP BY가 없으므로 전체를 대상으로 집계를 한다.
NVL() 함수를 사용하므로 만일 CNT 열이 NULL이라면 그 대체할 값을 출력해주는 함수이다.
NVL(CNT, 0) 이면 CNT열의 값이 NULL이면 0으로 대체된다.
그리고 숫자와 NULL을 연산을 하면 NULL은 제외하고 연산이 된다.
정답은 (3)이다.
07. GROUP BY 연산 문제
COUNT(*)의 경우 NULL과 관계없이 개수를 파악한다.
FROM 부터 시작을 해서 GROUP BY를 CLASS열 기준으로 하였다.
그리고 distince NAME으로 NAME열을 기준으로 중복을 제거 하였다.
그리고 count() 함수를 사용한 결과를 얻었으므로
정답은 (2)이다.
COUNT(1)의 경우
COUNT(*)과 같은 행의 수를 조회를 한다.
성능도 비슷하다. COUNT(*)을 사용할 것을 권장한다.
COUNT(컬럼)의 경우 만일 컬럼이 NULL이면 조회가 결국 되지 않고 개수가 파악된다.
이러한 결과가 조회된다.
08. WINDOW 함수 문제 (순위 문제)
OVER가 나온다면 WINDOW 함수라는 것을 캐치하시고
RANK()의 경우 중복된 순위 다음에는 그 다음 순위를 부여한다.
DENSE_RANK()의 경우 중복된 순위 다음에는 바로 다음 순위를 부여한다.
ROW_NUMBER()의 경우 그대로 1부터 차례대로 순위를 부여한다.
정답은 (2)이다.
09. 윈도우 함수 (집계 문제)
먼저 테스트할 데이터는 HR.EMPLOYEES의 SALARY, JOB_ID 그리고 EMPLOYEE_ID 이다.
OVER() 함수는 SUM(SALARY)의 기준을 정하는 함수이다. 집계 함수 바로 뒤에 붙여서 사용된다.
OVER() 함수에 PARTITION BY를 사용을 하면 JOB_ID를 파티션으로 연봉의 합계를 구한다.
ORDER BY를 통해서 EMPLOYEE_ID를 기준으로 오름차순한다.
RANGE BETWEEN은 행을 어디까지 처리할 것이냐는 의미이다.
UNBOUNDED PRECEDING AND UNBOUNDED FOLLWING 은 구분 없는 이전 그리고 구분 없는 이후까지 행을 처리하겠다는 의미이다.
하지만 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW는
각 행별로 누적값을 구하게 된다.
정답은 오류가 발생하는 (3)이다. 이미 UNBOUNDED PRECEDING이 범위에 나왔기 때문이다.
감사합니다.