本記事では具体的な例を通して、クエリで集計関数を使用する方法について紹介します。
集計関数
集計関数は、一連のレコードをスキャンして、単一の行を返します。この一連のレコードは、テーブルまたはビュー、あるいはサブクエリの結果です。
グループ化クエリでは、集計関数は通常 GROUP BY 句と共に使用され、1つまたは複数の列の値でグループ分けを行い、各グループごとに1行の結果を返します。
例
サンプルテーブルtoys_orderを作成し、注文データを入力します。
/**/
obclient> CREATE TABLE toys_order (
order_id INTEGER,
toy_id INTEGER,
toy_dealer VARCHAR(20),
toy_price DECIMAL(10, 2),
toy_amount INTEGER
);
Query OK, 0 rows affected
obclient> INSERT INTO toys_order VALUES ( 1001,1, 'A',53.12,100 ),( 1002,2, 'A',24.8,190 ),( 1003,3, 'A',19.9,330)
,( 1004,1, 'B',53.12,50 ),( 1005,2, 'B',24.8,200 ),( 1006,3, 'B',19.9,350 ),( 1007,2, 'A',24.8,100 );
7 rows in set
クエリでの集計関数の使用
count()、sum()、avg()、round()、min()、max() を使用して、おもちゃの注文の売上高を集計します。
obclient> SELECT toy_id
, count(*) order_count
, sum(toy_amount) sum_amount
, round(avg(toy_amount),2) avg_amount
, min(toy_amount) min_amount
,max(toy_amount) max_amount
FROM toys_order GROUP BY toy_id ORDER BY toy_id;
+--------+-------------+------------+------------+------------+------------+
| toy_id | order_count | sum_amount | avg_amount | min_amount | max_amount |
+--------+-------------+------------+------------+------------+------------+
| 1 | 2 | 150 | 75.00 | 50 | 100 |
| 2 | 3 | 490 | 163.33 | 100 | 200 |
| 3 | 2 | 680 | 340.00 | 330 | 350 |
+--------+-------------+------------+------------+------------+------------+
3 rows in set
OceanBaseデータベースのMySQLモードでは、集計関数を GROUP BY 句と共に使用する場合、select_list 内の列に特別な要件はありません。select_list 内の列が GROUP BY 句の列と一致する必要がある場合は、MySQLコマンドラインの sql_mode を ONLY_FULL_GROUP_BY に設定する必要があります。例:
obclient> SHOW VARIABLES LIKE '%sql_mode%';
+---------------+-------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------+
| sql_mode | PIPES_AS_CONCAT,STRICT_TRANS_TABLES,STRICT_ALL_TABLES |
+---------------+-------------------------------------------------------+
1 row in set
obclient> SET SESSION sql_mode='STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY'; Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected
obclient> SELECT toy_id,order_id
, count(*) order_count
, sum(toy_amount) sum_amount
, round(avg(toy_amount),2) avg_amount
, min(toy_amount) min_amount
, max(toy_amount) max_amount
FROM toys_order GROUP BY toy_id ORDER BY toy_id ;
ERROR 1055 (42000): 'test.toys_order.order_id' is not in GROUP BY
OceanBaseデータベースの現在のバージョンでサポートされている集計関数の詳細については、『SQL構文(MySQLモード)』 を参照してください。