데이터베이스 개인공부

MySQL - Group by 이해하기

여파고 2024. 1. 28. 16:23

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;

 

 

 

...여전히 헷갈릴것 같긴 하다...

그래도 정리하기 전보다는 나을 것 같다.

반응형