MySQL - GROUP BY句:初級者向けガイド
こんにちは、未来のデータベース魔法使いさんたち!今日は、MySQLのGROUP BY句の世界に一緒に飛び込んでみましょう。コードを書いたことがない方也不用担心——あなたの親切なガイドとして、私はステップバイステップで説明します。このチュートリアルの終わりには、プロのようにデータをグループ化できるようになるでしょう!
MySQL GROUP BY句とは?
大きな図書館を整理する imagine してみてください。すべての本を一つの棚に放り込むことはないでしょう?ジャンル、作者、出版年ごとに分组しますよね。これが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句を使用します。
以下のようにします:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING employee_count > 5;
これが以下のような結果を返すかもしれません:
department | employee_count |
---|---|
Sales | 10 |
IT | 8 |
HAVING句は、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;
このクエリは以下のようなことを行います:
- 従業員を部署と職種ごとに分组します。
- 各グループの平均給与と従業員数を計算します。
- 平均給与が60,000ドル以上のグループのみを表示します。
- 結果を平均給与の降順で並べます。
結果は以下のようになります:
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