세팅
INSERT INTO subscriptions (user_name, plan_name, start_date, end_date, status, price) VALUES
('김철수', 'Premium', '2023-01-01', '2023-12-31', 'Active', 12000),
('박준혁', 'Standard', '2023-07-01', '2023-12-31', 'Active', 9000),
('최수진', 'Premium', '2023-01-01', '2023-12-31', 'Active', 12000),
('김지훈', 'Premium', '2023-04-01', '2023-12-31', 'Active', 12000),
('장서현', 'Standard', '2023-06-01', '2023-12-31', 'Active', 9000),
('박다연', 'Premium', '2023-01-01', '2023-12-31', 'Active', 12000);
저번 실습 때 Expired 데이터는 delete 처리됨
-- 플랜별 구독자 수 조회
SELECT plan_name, count(*) as cnt
FROM subscriptions
group by plan_name;
-- 구독상태별 총 구독요금 계산
SELECT status,sum(price) as total_price
FROM subscriptions
group by status;
-- 플랜별 평균 구독요금 계산
SELECT plan_name, avg(price)as avg_price
FROM subscriptions
group by plan_name;
-- 구독자가 2명 이상인 플랜의 이름과 구독자 수 조회
SELECT plan_name, count(*)as usercount
FROM subscriptions
group by plan_name
HAVING usercount >= 2;
-- 총 구독 요금이 30000 이상인 구독상태 조회
SELECT status, sum(price)as total_price
FROM subscriptions
group by status
having total_price>=30000;
-- 플랜별로 2023년 6월 1일 이후 시작된 구독자 수를 조회하되, 구독자가 2명 이상인 플랜만 조회, 구독자가 많은 순서로 정렬
SELECT plan_name, count(plan_name)as plan_user
FROM subscriptions
where start_date>='2023-06-01'
group by plan_name
HAVING plan_user>=2
order by plan_user desc;
Select 구문의 count(plan_name) 는 count(*) 으로 적어주기
- count(*) 는 모든 행을 세기 때문에 더 효율적입니다.
- count(plan_name) 는 plan_name 컬럼이 NULL이 아닌 행만 세게 됩니다.
- 구독 테이블에서는 일반적으로 plan_name 이 NULL일 가능성이 낮지만, 데이터의 완전성을 보장하기 위해 count(*) 를 사용하는 것이 더 안전합니다.
★수정한 쿼리
SELECT plan_name, count(*) as plan_user
FROM subscriptions
where start_date>='2023-06-01'
group by plan_name
HAVING plan_user>=2
order by plan_user desc;
-- 상태가 Active인 구독자의 플랜별 총 구독 요금을 계산하되, 총 구독 요금이 20000 이상인 플랜만 조회, 총 구독 요금이 높은 순서대로 정렬
SELECT plan_name, sum(price)as plan_price
FROM subscriptions
where status='Active'
group by plan_name
having plan_price>=20000
order by plan_price desc;