MySQL
グループ化する
サーチ…
構文
- SELECT expression1、expression2、... expression_n、
- aggregate_function(expression)
- FROMテーブル
- [WHERE条件]
- GROUP BY expression1、expression2、... expression_n;
パラメーター
パラメータ | 詳細 |
---|---|
式1、式2、...式_n | 集合関数内にカプセル化されていない式で、GROUP BY句に含める必要があります。 |
集合関数 | SUM、COUNT、MIN、MAX、またはAVG関数などの関数。 |
テーブル | あなたがレコードを取得したいテーブル。 FROM句には少なくとも1つのテーブルがリストされている必要があります。 |
WHERE条件 | オプション。レコードを選択するために満たす必要がある条件。 |
備考
MySQL GROUP BY句は、SELECT文で複数のレコード間でデータを収集し、結果を1つ以上の列でグループ化するために使用されます。
その振る舞いは、 ONLY_FULL_GROUP_BY
変数の値によって部分的に制御されます 。これを有効にすると、出力に含まれない列でグループ化されたSELECT
文がエラーを返します。 これは5.7.5以降のデフォルトです 。この変数を設定したり設定したりしないと、他のDBMSに慣れ親しんだユーザーやユーザーにとって問題が発生する可能性があります。
GROUP BY USING SUM関数
SELECT product, SUM(quantity) AS "Total quantity"
FROM order_details
GROUP BY product;
MIN機能を使用してグループ化する
各行がname
、 department
、 salary
を持つ従業員である従業員のテーブルを想定します。
SELECT department, MIN(salary) AS "Lowest salary"
FROM employees
GROUP BY department;
これは、どの部門に最低給与の従業員が含まれているか、その給与は何かを示します。各部門で最低給与の従業員のname
を見つけることは、この例の範囲外の別の問題です。 「groupwise max」を参照してください。
GROUP BY USING COUNT関数
SELECT department, COUNT(*) AS "Man_Power"
FROM employees
GROUP BY department;
HAVINGを使用してGROUP BY
SELECT department, COUNT(*) AS "Man_Power"
FROM employees
GROUP BY department
HAVING COUNT(*) >= 10;
GROUP BY ... HAVING
を使用する集約レコードをフィルタリングすることは、 SELECT ... WHERE
を使用して個々のレコードをフィルタリングすることに似ています。
HAVING
が "エイリアス"を理解しているので、 HAVING
HAVING Man_Power >= 10
と言うこともできます。
Group Concatを使用してグループ化する
Group Concatは、MySQLで使用され、列ごとに複数の結果を持つ式の連結値を取得します。つまり、 Name(1):Score(*)
などの1つの列に対して選択される行が多数ありますName(1):Score(*)
名 | スコア |
---|---|
アダム | A + |
アダム | A- |
アダム | B |
アダム | C + |
ビル | D- |
ジョン | A- |
SELECT Name, GROUP_CONCAT(Score ORDER BY Score desc SEPERATOR ' ') AS Grades
FROM Grade
GROUP BY Name
結果:
+------+------------+
| Name | Grades |
+------+------------+
| Adam | C+ B A- A+ |
| Bill | D- |
| John | A- |
+------+------------+
AGGREGATE機能を持つGROUP BY
テーブルオーダー
+---------+------------+----------+-------+--------+
| orderid | customerid | customer | total | items |
+---------+------------+----------+-------+--------+
| 1 | 1 | Bob | 1300 | 10 |
| 2 | 3 | Fred | 500 | 2 |
| 3 | 5 | Tess | 2500 | 8 |
| 4 | 1 | Bob | 300 | 6 |
| 5 | 2 | Carly | 800 | 3 |
| 6 | 2 | Carly | 1000 | 12 |
| 7 | 3 | Fred | 100 | 1 |
| 8 | 5 | Tess | 11500 | 50 |
| 9 | 4 | Jenny | 200 | 2 |
| 10 | 1 | Bob | 500 | 15 |
+---------+------------+----------+-------+--------+
- カウント
WHERE
句で特定の条件を満たす行数を返します。
例:各顧客の注文数。
SELECT customer, COUNT(*) as orders
FROM orders
GROUP BY customer
ORDER BY customer
結果:
+----------+--------+
| customer | orders |
+----------+--------+
| Bob | 3 |
| Carly | 2 |
| Fred | 2 |
| Jenny | 1 |
| Tess | 2 |
+----------+--------+
- 和
選択した列の合計を返します。
例:合計と各顧客のアイテムの合計。
SELECT customer, SUM(total) as sum_total, SUM(items) as sum_items
FROM orders
GROUP BY customer
ORDER BY customer
結果:
+----------+-----------+-----------+
| customer | sum_total | sum_items |
+----------+-----------+-----------+
| Bob | 2100 | 31 |
| Carly | 1800 | 15 |
| Fred | 600 | 3 |
| Jenny | 200 | 2 |
| Tess | 14000 | 58 |
+----------+-----------+-----------+
- AVG
数値の列の平均値を返します。
例:各顧客の平均注文額
SELECT customer, AVG(total) as avg_total
FROM orders
GROUP BY customer
ORDER BY customer
結果:
+----------+-----------+
| customer | avg_total |
+----------+-----------+
| Bob | 700 |
| Carly | 900 |
| Fred | 300 |
| Jenny | 200 |
| Tess | 7000 |
+----------+-----------+
- MAX
特定の列または式の最大値を返します。
例:各顧客の最高注文合計。
SELECT customer, MAX(total) as max_total
FROM orders
GROUP BY customer
ORDER BY customer
結果:
+----------+-----------+
| customer | max_total |
+----------+-----------+
| Bob | 1300 |
| Carly | 1000 |
| Fred | 500 |
| Jenny | 200 |
| Tess | 11500 |
+----------+-----------+
- MIN
特定の列または式の最小値を返します。
例:各顧客の最安値合計。
SELECT customer, MIN(total) as min_total
FROM orders
GROUP BY customer
ORDER BY customer
結果:
+----------+-----------+
| customer | min_total |
+----------+-----------+
| Bob | 300 |
| Carly | 800 |
| Fred | 100 |
| Jenny | 200 |
| Tess | 2500 |
+----------+-----------+