-
1/5스파르타/TIL(Today I Learned) 2024. 1. 5. 11:20
SQL 처음부터 끝까지라는 특강을 듣는 중 기억에 남으면 좋겠다 라는 내용을 정리하려고 한다.
1. 형변환시 (ALTER) 조심해야 할 점은 담기는 COLUMN의 사이즈가 커지면 상관이 없지만 작아지면 대부분은 문제가 생길 가능성이 높다.
CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, Name VARCHAR(50), Position VARCHAR(50), Salary DECIMAL(10, 2) ); ALTER TABLE Employees Name VARCHAR(10); DROP TABLE Employees;
위 쿼리는 TABLE을 생성하는 쿼리이고, ALTER를 통해 NAME이라는 COLUMN을 형변환 하는 쿼리이다.
기존 NAME은 VARCHAR(50)이지만 (10)으로 줄이게 되면, 10 이상의 사이즈 데이터는 사라진다.
예시로, 이름이 요상한 사람이 있어서 데이터베이스에 50까지 차있는 NAME이 있을 때, 10으로 줄ㅇ여버리면
40에 해당하는 뒷 이름이 다 사라지기 때문에 ALTER를 통해서 사이즈를 줄일 때는 주의를 해야한다.!
2. 조건이 1개이지만 CASE WHEN으로 사용하는 이유
CASE WHEN이 문법이기 때문에 문법적으로 사용하는 것이 좋다.
OVER절 : 윈도우 함수가 작동하는 행의 집합, 윈도우를 정의.
SELECT EmployeeID, SaleDate, AVG(SaleAmount) OVER (ORDER BY SaleDate ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS MovingAvg FROM Sales;
위 커리는 이동 평균을 계산하는 쿼리이다.
쿼리 진행 순서 및 데이터 흐름:
- Sales 테이블에서 EmployeeID, SaleAmount, SaleDate를 선택합니다.
- 각 행에 대해, 전후 1행을 포함한 윈도우 내에서 SaleAmount의 평균을 계산합니다.
- 계산된 이동 평균을 MovingAvg로 표시합니다.
ROWS/RANGE - 파티션 내의 시작점 및 끝점을 지정하여 파티션 내의 행을 제한합니다. ORDER BY 인수가 필요하며,
ORDER BY 인수가 지정된 경우 기본값은 파티션 시작부터 현재 요소까지입니다.
ROWS 절은 현재 행 이전 또는 다음의 고정 행 수를 지정하여 파티션 내의 행 수를 제한합니다
ORDER BY 절에 선언된 칼럼 값을 기준으로 그룹화하여 값을 표시하기 때문에, 모든 행의 값이 순차적으로 표시되기 원한다면
ORDER BY 절의 칼럼을 모든 행의 유일한 값으로 선언해야 한다.
주의점 : OVER절에 OREDER BY를 먼저하고, SELECT절에 ORDER BY가 나중에 실행이 되므로 순서가 엉킬 수 있다.
ROWS BETWEEN start_point AND end_point에서
start_point에는
- UNBOUNDED PRECEDING - 첫줄부터
- CURRENT ROW - 현재 줄까지
- 값 PRECEDING - 값부터
end_point에는
- UNBOUNDED FOLLOWING - 마지막 줄까지
- CURRENT ROW - 현재 줄까지
- 값 FOLLOWING - 값까지
특강에서 사용한 OVER 뒤 ROW는 현재 행을 기준으로 파티션내 앞뒤 한건씩을 범위로 지정이다.