MySQL - GROUP BY 절: 초보자 가이드
안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 MySQL의 GROUP BY 절의 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 작성해본 적이 없다면 걱정하지 마세요 - 저는 당신의 친절한 안내자가 되겠습니다. 단계별로 함께 공부하겠습니다. 이 튜토리얼이 끝나면, 당신은 프로처럼 데이터를 그룹화할 수 있을 것입니다!
MySQL GROUP BY 절이란?
거대한 도서관을 조직하는 상상해보세요. 모든 책을 한 쉬플에 쌓아두지는 않을 겁니다,right? 장르, 저자, 또는 출판 연도별로 그룹화할 것입니다. 그것이 GROUP BY 절이 우리 데이터에 대해 하는 일입니다 - 데이터를 의미 있게 조직하고 요약하는 데 도움을 줍니다.
GROUP BY 절은 SQL 쿼리에서 지정된 열의 동일한 값을 가진 행을 그룹화하는 데 사용됩니다. 종종 COUNT(), MAX(), MIN(), SUM(), AVG()와 같은 집계 함수와 함께 사용되어 각 그룹의 행에 대한 계산을 수행합니다.
실제로 어떻게 작동하는지 몇 가지 예제를 통해 살펴보겠습니다!
단일 열에 대한 MySQL GROUP BY
우선 간단한 예제로 시작해보겠습니다. employees
라는 테이블이 있다고 가정해봅시다. 이 테이블에는 employee_id
, name
, department
, salary
열이 있습니다. 각 부서에 몇 명의 직원이 있는지 알고 싶습니다.
이렇게 하면 됩니다:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
이 쿼리는 다음과 같은 결과를 줍니다:
department | employee_count |
---|---|
Sales | 10 |
Marketing | 5 |
IT | 8 |
여기서 무엇이 일어나고 있는지 분해해보겠습니다:
-
department
열을 선택하고 COUNT(*) 함수를 사용하여 행을 계산합니다. - 계산된 수를 친절한 이름으로 지정합니다.
AS employee_count
. - GROUP BY 절은 결과를
department
별로 그룹화합니다.
결과는 각 부서에 몇 명의 직원이 있는지 보여줍니다. 멋지죠?
여러 열에 대한 MySQL GROUP BY
이제 한 단계 더 나아가보겠습니다. 두 개 이상의 열로 그룹화하고 싶다면 어떻게 하나요? 문제 없습니다! employees
테이블에 job_title
열이 더 있고, 각 부서별로 어떤 직업 타이틀을 가진 직원이 몇 명 있는지 알고 싶습니다.
이렇게 하면 됩니다:
SELECT department, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title;
이는 다음과 같은 결과를 줄 수 있습니다:
department | job_title | employee_count |
---|---|---|
Sales | Sales Rep | 8 |
Sales | Sales Manager | 2 |
Marketing | Content Writer | 3 |
Marketing | SEO Specialist | 2 |
IT | Developer | 6 |
IT | IT Manager | 2 |
이제 우리는 각 부서에 몇 명의 직원이 있는지뿐만 아니라, 각 부서별로 다양한 직업 타이틀로 분포되어 있는지도 볼 수 있습니다. 마치 도서관을 장르와 저자로 조직하는 것처럼!
MySQL GROUP BY와 ORDER BY 절
자주 우리는 그룹화된 결과를 특정 순서로 정렬하고 싶습니다. 여기서 ORDER BY 절이 유용하게 사용됩니다. 이전 결과를 부서별로 그리고 각 부서 내에서 직원 수의 내림차순으로 정렬해보겠습니다:
SELECT department, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title
ORDER BY department, employee_count DESC;
이는 다음과 같은 결과를 줄 수 있습니다:
department | job_title | employee_count |
---|---|---|
IT | Developer | 6 |
IT | IT Manager | 2 |
Marketing | Content Writer | 3 |
Marketing | SEO Specialist | 2 |
Sales | Sales Rep | 8 |
Sales | Sales Manager | 2 |
이제 결과는 부서별로 정렬되었고, 각 부서 내에서 직원 수가 내림차순으로 정렬되었습니다.
MySQL GROUP BY와 HAVING 절
때로는 그룹화된 결과를 필터링하고 싶습니다. WHERE 절을 사용할 수 있지만, 그것은 그룹화되기 전에 행을 필터링합니다. 그룹 자체를 필터링하고 싶다면 HAVING 절을 사용합니다.
예를 들어, 직원 수가 5명 이상인 부서만 보고 싶다면:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING employee_count > 5;
이는 다음과 같은 결과를 줄 수 있습니다:
department | employee_count |
---|---|
Sales | 10 |
IT | 8 |
HAVING 절은 Marketing 부서를 필터링하여 5명의 직원만 있는 부서를 제외합니다.
클라이언트 프로그램을 사용한 GROUP BY 절
이제 MySQL 클라이언트 프로그램을 사용하여 모든 것을 실践해보겠습니다. 이 예제에서는 MySQL 명령줄 클라이언트를 사용하지만, 원리는 다른 MySQL 클라이언트에서도 동일합니다.
먼저 employees
테이블을 생성하고 데이터를 삽입해보겠습니다:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
job_title VARCHAR(50),
salary DECIMAL(10, 2)
);
INSERT INTO employees VALUES
(1, 'John Doe', 'Sales', 'Sales Rep', 50000),
(2, 'Jane Smith', 'Marketing', 'Content Writer', 55000),
(3, 'Bob Johnson', 'IT', 'Developer', 65000),
(4, 'Alice Brown', 'Sales', 'Sales Manager', 70000),
(5, 'Charlie Davis', 'IT', 'IT Manager', 75000);
이제 우리가 배운 모든 것을 결합한 쿼리를 실행해보겠습니다:
SELECT department, job_title, AVG(salary) AS avg_salary, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title
HAVING avg_salary > 60000
ORDER BY avg_salary DESC;
이 쿼리는 다음과 같은 결과를 줄 수 있습니다:
department | job_title | avg_salary | employee_count |
---|---|---|---|
IT | IT Manager | 75000.00 | 1 |
Sales | Sales Manager | 70000.00 | 1 |
IT | Developer | 65000.00 | 1 |
이제 우리는 GROUP BY에서 기본적인 것부터 다른 절과 결합한 강력한 데이터 분석까지 여정을 마쳤습니다. 연습이 완벽을 이루는 열쇠입니다. 자신만의 쿼리를 작성해보고, 다양한 조합을 실험해보세요. 곧 데이터를 경험丰富的 데이터베이스 관리자처럼 그룹화할 수 있을 것입니다!
행복하게 쿼리 작성하시고, 데이터가 항상 잘 정리되기를 바랍니다!
Credits: Image by storyset