SQLでデータを可視化する:GROUP BYとORDER BYを駆使したテクニック
SQLにおけるGROUP BYとORDER BYの違い
GROUP BYは、データを特定の列に基づいてグループ化するために使用されます。各グループに対して、集計関数 (SUM、AVG、COUNTなど) を適用して、グループ全体の統計情報を計算することができます。
一方、ORDER BYは、SELECT句で取得した結果を特定の列に基づいてソートするために使用されます。昇順または降順でソートすることができます。
例:
社員テーブル (employees) を例に考えてみましょう。このテーブルには、社員ID、名前、部署、給与などの列が含まれています。
GROUP BYを使用して、部署ごとの平均給与を計算するには、次のようなクエリを使用します。
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
このクエリは、各部署の平均給与を含む結果セットを返します。
SELECT *
FROM employees
ORDER BY salary DESC;
このクエリは、給与の高い順にソートされた社員のリストを返します。
- GROUP BYは、データをグループ化し、グループ全体の統計情報を計算するために使用されます。
- ORDER BYは、SELECT句で取得した結果をソートするために使用されます。
補足:
- GROUP BY句とORDER BY句を一緒に使用することができます。
- GROUP BY句を使用する場合は、集計関数を使用する必要があります。
社員テーブル (employees) を例に、部署ごとの平均給与を計算し、給与の高い順にソートするクエリを記述します。
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
ORDER BY average_salary DESC;
このクエリは以下の結果を返します。
部署 | 平均給与 |
---|---|
営業部 | 120,000 |
開発部 | 130,000 |
経理部 | 110,000 |
顧客テーブル (customers) を例に、各都市の注文数をカウントし、注文数の多い順に都市をソートするクエリを記述します。
SELECT city, COUNT(*) AS order_count
FROM orders
GROUP BY city
ORDER BY order_count DESC;
都市 | 注文数 |
---|---|
東京 | 100 |
大阪 | 80 |
名古屋 | 50 |
製品テーブル (products) を例に、各カテゴリーの製品数をカウントし、カテゴリー名で昇順にソートするクエリを記述します。
SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category
ORDER BY category ASC;
カテゴリー | 製品数 |
---|---|
家電 | 20 |
家具 | 30 |
衣類 | 50 |
これらの例は、GROUP BYとORDER BY句を組み合わせる方法を示しています。状況に応じて、さまざまな集計関数やソート条件を使用することができます。
GROUP BYとORDER BYのその他の使用方法
複数の列でグループ化
GROUP BY句を使用して、複数の列でグループ化することができます。各グループに対して、集計関数を適用することができます。
SELECT department, job_title, AVG(salary) AS average_salary
FROM employees
GROUP BY department, job_title;
このクエリは、部署と職種ごとに平均給与を計算します。
HAVING句を使用して、GROUP BY句の結果をフィルタリングすることができます。
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 100000;
このクエリは、平均給与が100,000円以上の部署のみを表示します。
サブクエリ
GROUP BY句とサブクエリを組み合わせることができます。
SELECT department,
(SELECT COUNT(*) FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE employees.department = department)) AS order_count
FROM employees;
このクエリは、各部署の注文数を計算します。
ウィンドウ関数
GROUP BY句とウィンドウ関数 (ROW_NUMBERなど) を組み合わせることができます。
SELECT department,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS ranking,
salary
FROM employees;
このクエリは、各部署の給与の高い順に社員をランキングします。
ORDER BY句を使用して、さまざまな方法で結果をソートすることができます。
複数の列でソート
SELECT *
FROM employees
ORDER BY department, salary DESC;
NULL値の処理
SELECT *
FROM employees
ORDER BY salary NULLS LAST;
このクエリは、給与がNULLの社員を末尾にソートします。
カスタム比較
CREATE FUNCTION compare_names(name1 VARCHAR(255), name2 VARCHAR(255))
RETURNS INT
BEGIN
IF name1 < name2 THEN
RETURN -1;
ELSEIF name1 > name2 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
SELECT *
FROM employees
ORDER BY name COLLATE compare_names;
このクエリは、カスタム比較関数を使用して、社員名をソートします。
sql mysql database