徹底解説MySQLでのデータベースの集計と並び替え

スポンサーリンク

はじめに

データベースの操作において、データの集計と並び替えは欠かせない要素です。特にMySQLは、その豊富な機能と高い拡張性から、多くの開発者に利用されています。本記事では、MySQLを用いたレコードの並び替えや特定のデータ範囲の抽出、データの集計方法について詳しく解説します。また、フィールドの別名関数の利用方法についても具体的な例を交えて紹介します。最新のMySQL機能を活用し、データ操作を効率化する方法を学びましょう。

レコードの並び替え詳細解説

ORDER BY句の基本

ORDER BY句は、取得したレコードを特定の順序で並び替えるために使用します。基本的な構文は以下のとおりです。

SELECT カラム名 FROM テーブル名 ORDER BY カラム名 ASC|DESC;
  • ASC: 昇順(小さいものから大きいものへ)
  • DESC: 降順(大きいものから小さいものへ)

例:

SELECT * FROM employees ORDER BY department ASC, salary DESC;

このクエリは、departmentを昇順で、同じ部署内ではsalaryを降順で並び替えます。

【表1】複数条件での並び替え結果

employee_iddepartmentsalary
101HR70000
102HR65000
201IT120000
202IT110000

表1: 部署ごとに従業員を並び替えた結果を示しています。

カスタム並び替え

特定の順序で並び替えたい場合、FIELD()関数やCASE WHENを使用します。

例:

SELECT * FROM employees
ORDER BY FIELD(department, 'Sales', 'HR', 'IT'), salary DESC;

このクエリは、departmentSalesHRITの順で並び替え、各部署内でsalaryを降順にします。

【図2】カスタム並び替えの結果

図2: カスタム順序で部署を並び替えた結果を示しています。

データの集計と関数の応用例

GROUP BY句の使い方

GROUP BY句は、特定のカラムでレコードをグループ化し、集計を行う際に使用します。

例:

SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;

各部署ごとの従業員数を取得します。

【図3】部署ごとの従業員数

図3: 各部署の従業員数を示しています。

集約関数の活用

MySQLには、様々な集約関数が用意されています。

  • COUNT(): レコード数を取得
  • SUM(): 合計値を取得
  • AVG(): 平均値を取得
  • MAX(): 最大値を取得
  • MIN(): 最小値を取得

例:

SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department;

従業員数が5人以上の部署のみを表示します。

【図4】HAVING句の使用例

図4: 従業員数が5人以上の部署を抽出した結果を示しています。

特定のデータ範囲の抽出における最新動向

ウィンドウ関数の利用

ウィンドウ関数は、行ごとに集計を行う際に便利です。MySQL 8.0以降でサポートされています。

例:

SELECT 
    employee_id, 
    salary, 
    AVG(salary) OVER (PARTITION BY department) AS department_average
FROM employees;

各従業員の給与と、その従業員が所属する部署の平均給与を同時に取得します。

【コードスニペット1】ウィンドウ関数の使用例

SELECT 
    employee_id, 
    salary, 
    department, 
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM employees;

各部署内での給与順位を取得します。

【図5】ウィンドウ関数の結果

図5: 各部署内での給与順位を示しています。

サブクエリとCTE

サブクエリや共通テーブル式(CTE)を用いることで、特定のデータ範囲を抽出することが可能です。

CTEの例:

WITH high_salary_employees AS (
    SELECT * FROM employees WHERE salary > 100000
)
SELECT * FROM high_salary_employees WHERE department = 'Engineering';

給与が10万以上の従業員の中から、エンジニアリング部門の従業員を取得します。

【コードスニペット2】CTEの使用例

WITH department_totals AS (
    SELECT department, SUM(salary) AS total_salary
    FROM employees
    GROUP BY department
)
SELECT * FROM department_totals WHERE total_salary > 500000;

各部署の給与合計が50万を超える部署を抽出します。

JSONデータの扱い

最新のMySQLでは、JSONデータ型がサポートされており、特定のデータ範囲の抽出が容易になりました。

例:

SELECT 
    data->>'$.name' AS name, 
    data->>'$.age' AS age
FROM json_table;

SELECT employee_id AS id, first_name AS name FROM employees;

【ポイント】

  • 別名はASキーワードで指定します。
  • クエリ内でエイリアスを再利用することはできません。

エイリアス使用時の注意点

  • エイリアス名にスペースを含む場合、バッククォート(“)で囲む必要があります。

例:

SELECT first_name AS `First Name` FROM employees;
  • エイリアスはORDER BY句やGROUP BY句でも使用可能です。

例:

SELECT employee_id AS id, salary FROM employees ORDER BY id;

本Blog内、MySQL関連ドキュメント

本文章以外にも、MySQL関連文書を記載していますので、いろいろと参考に慣れば幸いです。(10/14/2024追記)

MySQLデータベース管理の基本操作ガイド

徹底解説MySQLでのデータベースの集計と並び替え

徹底解説MySQLデータベース操作完全ガイド:検索から重複削除、パフォーマンス最適化、最新機能まで

徹底解説:MySQLのデータ型と制約

MySQLリモート接続を安全に実現する方法—ユーザー作成からファイアウォール設定まで

徹底解説:MySQL: 結合、サブクエリ、インデックス、トランザクション

おわりに

本記事では、MySQLにおけるデータの並び替え、集計、特定のデータ範囲の抽出方法について詳しく解説しました。これらの技術はデータベース操作の基本であり、効率的なデータ管理に不可欠です。特にMySQL 8.0以降で追加されたウィンドウ関数CTEJSONデータ型の活用により、より高度なデータ操作が可能になりました。最新の機能を積極的に取り入れることで、データベース操作の効率化とパフォーマンス向上が期待できます。

参考文献

  1. MySQL公式ドキュメント
    https://dev.mysql.com/doc/
  2. 高橋健一, 『詳解MySQL 8.0 新機能と実践活用法』, 技術評論社, 2019年, ISBN: 978-4774199852
  3. MySQLウィンドウ関数の使い方
    https://www.mysql.com/why-mysql/white-papers/mysql_wp_windows_functions.php
  4. MySQLでのJSONデータ型の活用
    https://dev.mysql.com/doc/refman/8.0/en/json.html
  5. 共通テーブル式(CTE)の実践ガイド
    https://dev.mysql.com/doc/refman/8.0/en/with.html

変更履歴等

SQL文を見やすい表示方式へ変更。2024/10/04

本ブログの関連記事を記載。2024/10/04

タイトルとURLをコピーしました