15 GROUP BY句とHAVING句
employeesテーブルが次のように定義されているとします.
CREATE TABLE employees (
id TEXT PRIMARY KEY,
name TEXT,
department TEXT,
age INTEGER,
salary INTEGER
);
INSERT INTO employees (id, name, department, age, salary)
VALUES ('1', 'Alice', 'HR', 30, 600),
('2', 'Bob', 'Engineering', 25, 700),
('3', 'Charlie', 'HR', 35, 800),
('4', 'David', 'Engineering', 28, 900);各部門ごとの平均給与を求める場合は,以下のように複数のクエリを使用して計算することができます.
SELECT AVG(salary) AS HR_Average_Salary
FROM employees
WHERE department = 'HR';
SELECT AVG(salary) AS Engineering_Average_Salary
FROM employees
WHERE department = 'Engineering';15.1 GROUP BY句
GROUP BY句は,指定した基準に基づいてデータをグループ化し,集約関数を使用して各グループの統計情報を取得することができます.
15.1.1 構文
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name;15.1.2 使用例
それぞれの部門ごとの平均給与を求めるには,次のようにGROUP BY句を使用します.
SELECT department, AVG(salary) AS Average_Salary
FROM employees
GROUP BY department;このクエリは,employeesテーブルから各部門ごとの平均給与を計算します.結果は次のようになります:
| department | Average_Salary |
| ----------- | -------------- |
| HR | 700 |
| Engineering | 800 |
15.2 HAVING句
HAVING句は,GROUP BY句でグループ化された結果に対して条件を指定するために使用されます.
HAVING句とWHERE句と似ていますが,WHERE句はグループ化前の行に対して条件を適用し,HAVING句はグループ化後の結果に対して条件を適用します.
15.2.1 構文
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name
HAVING aggregate_function(column_name) condition;15.2.2 使用例
例えば,各部門の平均給与が750以上の部門のみを取得するには,次のようにHAVING句を使用します.
SELECT department, AVG(salary) AS Average_Salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 750;このクエリは,各部門の平均給与が750以上の部門のみを返します.結果は次のようになります:
| department | Average_Salary |
| ----------- | -------------- |
| Engineering | 800 |
15.3 練習
Chinookデータベースを使用して,下記のクエリを作成せよ.
tracksテーブルから各アルバムごとのトラック数を求めるクエリを作成せよ.albumsテーブルから各アーティストごとのアルバム数を求めるクエリを作成せよ.tracksテーブルから各ジャンルごとのトラック数を求めるクエリを作成せよ.ただし,トラック数が10以上のジャンルのみを対象とする.customersテーブルから各国ごとの顧客数を求めるクエリを作成せよ.ただし,顧客数が5人以上の国のみを対象とする.