GROUP BY 가 너무 헷갈린다.
개념이야 이해했지만 어떻게 써야할지, 그 안에 뭐가 들어가야 기가막히게 문제를 풀어낼 수 있을지가 꽤 헷갈린다.
GROUP BY를 사용하면 주로 집계 함수와 함께 사용되며, 데이터를 요약하고 통계를 얻는 데 유용하다고 한다.
GROUP BY 는 특정 컬럼의 값을 기준으로 데이터를 그룹화 할 때 사용하는데,
이를테면 문제에서 ~별로, 요런식으로 문제가 주어질 때 말이지.
GROUP BY에서 집계 함수를 사용하여 그룹 내에서 집계(통계, 계산 등등)를 할 수 있다.
GROUP BY를 사용할 때 주의할 점은
SELECT 구문에 나열되지 않은 컬럼들에 대해서는 집계 함수를 사용해야 한다는 것이다. SUM 이라던가.
예제코드를 많이 써보면서 익혀보기로 하였다.
1. 각 도시별로 총 주문금액 구하기
SELECT city, SUM(order_amount) as total_amount
FROM orders
GROUP BY city;
2. 각 부서별로 직원 수와 평균 급여 구하기
SELECT department, COUNT(employee_id) as num_employees, AVG(salary) as avg_salary
FROM employees
GROUP BY department;
3. 각 날짜별로 판매된 제품 수와 총 매출 구하기
SELECT order_date, COUNT(product_id) as num_products, SUM(revenue) as total_revenue
FROM sales
GROUP BY order_date;
4. 각 과목별로 최고 점수와 최저 점수 구하기
SELECT subject, MAX(score) as highest_score, MIN(score) as lowest_score
FROM exam_results
GROUP BY subject;
5. 각 도시와 성별에 따른 평균 연령 구하기
SELECT city, gender, AVG(age) as avg_age
FROM users
GROUP BY city, gender;
6. 각 고객별로 마지막 주문일과 주문 횟수 확인하기
SELECT customer_id, MAX(order_date) as last_order_date, COUNT(order_id) as order_count
FROM orders
GROUP BY customer_id;
7. 각 카테고리별로 상품 수 확인하기
SELECT category, COUNT(product_id) as num_products
FROM products
GROUP BY category;
8. 각 연도와 분기별로 판매량 총합 구하기
SELECT YEAR(order_date) as order_year, QUARTER(order_date) as order_quarter, SUM(quantity) as total_sales
FROM sales
GROUP BY YEAR(order_date), QUARTER(order_date);
9. 각 저자별로 출판한 책의 총 수와 최근 출판일 확인하기
SELECT author, COUNT(book_id) as num_books, MAX(publish_date) as latest_publish_date
FROM books
GROUP BY author;
10. 각 강의별로 수강생 수와 평균 성적 확인하기
SELECT course_id, COUNT(student_id) as num_students, AVG(grade) as avg_grade
FROM course_enrollments
GROUP BY course_id;
11. 부서별로 가장 높은 급여를 받는 직원 찾기
SELECT department, MAX(salary) as highest_salary
FROM employees
GROUP BY department;
12. 각 사용자별로 마지막으로 작성한 포스트의 작성일 확인하기
SELECT user_id, MAX(post_date) as last_post_date
FROM posts
GROUP BY user_id;
13. 각 국가별로 평균 인구 밀도 구하기
SELECT country, AVG(population / area) as avg_population_density
FROM countries
GROUP BY country;
14. 급여가 특정 금액 이상인 부서만 선택
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 50000;
15. 상품 수가 특정 개수 이상인 카테고리 선택
SELECT category, COUNT(*) as num_products
FROM products
GROUP BY category
HAVING num_products >= 10;
16. 특정 기간 동안 주문이 특정 횟수 이상인 사용자 선택
SELECT user_id, COUNT(*) as num_orders
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY user_id
HAVING num_orders >= 5;
17. 매출이 1000 이상인 부서 찾기
SELECT department, SUM(sales_amount) as total_sales
FROM sales
GROUP BY department
HAVING SUM(sales_amount) >= 1000;
18. 주문 횟수가 3회 이상인 고객 찾기
SELECT customer_id, COUNT(order_id) as order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) >= 3;
19. 각 도시에서 평균 주문 금액이 500 이상인 도시 찾기
SELECT city, AVG(order_amount) as avg_order_amount
FROM orders
GROUP BY city
HAVING AVG(order_amount) >= 500;
20. 부서별 직원 수가 5명 이상인 부서 찾기
SELECT department_id, COUNT(employee_id) as employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(employee_id) >= 5;
21. 주문일 기준으로 한 달에 100건 이상 주문한 고객 찾기
SELECT customer_id, COUNT(order_id) as order_count
FROM orders
GROUP BY customer_id, MONTH(order_date)
HAVING COUNT(order_id) >= 100;
...여전히 헷갈릴것 같긴 하다...
그래도 정리하기 전보다는 나을 것 같다.
'데이터베이스 개인공부' 카테고리의 다른 글
데이터베이스 - 이상현상과 정규화, 함수종속성 (1) | 2024.01.29 |
---|---|
데이터 모델링 - Starbucks 데이터모델링 (2) | 2024.01.28 |
데이터베이스 - 데이터 모델링의 개념 (1) | 2024.01.24 |
MySQL - Stored Procedure(프로시저, 커서, 트리거) (0) | 2024.01.24 |
MySQL - Prepare(변수설정느낌) (0) | 2024.01.23 |