13강 | 자르기
정리
- Group By 구의 기능
- 자르기
- 집약
- 키(기준)에 따른 자르기
- 단순한 필드뿐만 아니라, CAS와 같이 복잡한 수식을 기준으로도 자를 수 있다.
- GROUP BY 구와 SELECT 구에 모두 적을 수 있다.
- PARTITION BY 구를 사용한 자르기
- GROUP BY의 집약 기능을 제외하면 실질적인 기능에 차이가 없음(차이점 : PARTITION BY는 기존 행의 세세한 정보가 그대로 남은 채로 나뉨 → 집약이 안되기 때문 !!)
- CASE,계산식 등 복잡한 기준을 사용할 수 있음
예제문제 1
Persons 테이블에서 첫문자 알파벳마다 몇명의 사람이 존재하는지 계산하여야 한다.
- Persons 테이블
- 생성
CREATE TABLE Persons (
name VARCHAR(255),
age INT,
height INT,
weight INT
);
INSERT INTO Persons (name, age, height, weight) VALUES
('Anderson', 30, 188, 90),
('Adela', 21, 167, 55),
('BATES', 887, 158, 48),
('BILL', 39, 177, 120),
('Chris', 90, 175, 4);
- 계산
select substring(name,1,1) as label , count(*)
from Persons
group by label;
- 결과
예제문제 2
Persons 테이블에서 나이대별로 잘라야 한다.
- 계산
SELECT CASE WHEN age<20 THEN '어린이'
WHEN age BETWEEN 20 AND 69 THEN '성인'
WHEN age>=70 THEN '노인'
ELSE NULL END AS age_class, COUNT(*)
FROM Persons
GROUP BY age_class;
- 결과
- PARTITION BY에 식을 지정하여 자르기
SELECT name,age, CASE WHEN age < 20 THEN '어린이'
WHEN age BETWEEN 20 AND 69 THEN '성인'
WHEN age >= 70 THEN '노인'
ELSE NULL END AS age_class,
RANK() OVER(PARTITION BY CASE WHEN age < 20 THEN '어린이'
WHEN age BETWEEN 20 AND 69 THEN '성인'
WHEN age >= 70 THEN '노인'
ELSE NULL END ORDER BY age) AS age_rank_in_class
FROM Persons
ORDER BY age_class, age_rank_in_class;
- 결과
GROUP BY와 SELECT 관계가 가끔 이해 안될 때 있었는데, 예제를 직접 실습하고 정리하다보니 이해 안됐던 부분들이 이해되어 속이 시원했다..! 각 장마다 실습하고 정리하느랴 책의 완독이 늦어져 정리하지 말까 고민도 했었지만.. 역시나 읽고 직접 실습하고 정리까지해야 내것으로 만든 기분이 든다..ㅎㅎ 늦더라도 꾸준히 공부해서 많은 걸 얻어가고 싶다.
'BOOK > SQL 레벨업' 카테고리의 다른 글
[SQL 레벨업] 16강 SQL에서는 반복을 어떻게 표현할까? (1) | 2024.01.27 |
---|---|
[SQL 레벨업] 15강 반복계의 공포 (1) | 2024.01.25 |
[SQL 레벨업] 12강 집약 (0) | 2024.01.10 |
[SQL 레벨업] 10강 UNION이 필요한 경우 (1) | 2024.01.04 |
[SQL 레벨업] 9장 집계와 조건분기 (0) | 2023.12.13 |