縦型(UNION)による結果の集計
2つのクエリ結果を縦に結合し、総計行を追加するには UNION を使用します。ただし、上下のクエリでは選択カラム数と型が一致している必要があります。
SELECT
department_name AS dept,
SUM(total_amount) AS amount,
COUNT(*) AS cnt
FROM order_table
GROUP BY department_name
UNION
SELECT
'合計' AS dept,
SUM(total_amount) AS amount,
COUNT(*) AS cnt
FROM order_table;
| dept | amount | cnt |
|---|---|---|
| 小児科 | 0.53 | 69 |
| 婦人科2 | 0.61 | 28 |
| 心臓血管外科 | 0.71 | 64 |
| 一般外科2 | 0.43 | 34 |
| 泌尿器外科2 | 0.23 | 10 |
| 焼傷科 | 0.19 | 23 |
| 科1 | 14.06 | 17 |
| 腎血液内科 | 0.07 | 8 |
| 脳血管センター | 1.50 | 39 |
| 合計 | 18.33 | 292 |
横型(JOIN)による条件付き集計
複数のサブクエリ結果を横に結合することで、全体と条件別集計を1行で出力できます。
SELECT
total.amount AS total_amount,
total.cnt AS total_count,
status5.amount5 AS amount_ordered,
status5.cnt5 AS count_ordered
FROM
(SELECT
SUM(total_amount) AS amount,
COUNT(*) AS cnt
FROM order_table) AS total,
(SELECT
SUM(total_amount) AS amount5,
COUNT(*) AS cnt5
FROM order_table
WHERE status = 5) AS status5;
| total_amount | total_count | amount_ordered | count_ordered |
|---|---|---|---|
| 18.33 | 292 | 2.21 | 22 |
大批量データの高速エクスポート/インポート
MySQL の SELECT ... INTO OUTFILE および LOAD DATA INFILE を使うと、大量データのやり取りを効率的に行えます。注意点として、MySQL のセキュリティ設定 secure-file-priv が有効な場合は、指定可能なディレクトリに制限があるため、my.cnf または my.ini で一時的に無効化する必要があります。
SELECT
user_name,
area_code,
full_address,
tel_number,
mobile_number
FROM user_addresses
INTO OUTFILE 'D:/export_user.csv'
FIELDS TERMINATED BY '\t'
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
設定例(Windows):
[mysqld]
secure-file-priv=
実測データ(約43万行):
- エクスポート:0.523 秒
- TRUNCATE 後、LOAD DATA INFILE によるインポート:2.453 秒
詳細オプション(OUTFILE)
SELECT column_list
INTO OUTFILE 'file_path'
FIELDS
TERMINATED BY ',' -- 項目間の区切り文字
ENCLOSED BY '"' -- 文字列を囲む記号(OPTIONALLY 付き可)
ESCAPED BY '\\' -- エスケープ文字
LINES
STARTING BY '' -- 行の先頭文字列(無視対象)
TERMINATED BY '\n'; -- 行区切り文字
詳細オプション(LOAD DATA)
LOAD DATA [LOCAL] INFILE 'file_path'
REPLACE | IGNORE
INTO TABLE target_table
CHARACTER SET utf8mb4
FIELDS
TERMINATED BY '\t'
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(column_name1, column_name2, @var)
SET created_at = NOW();
参考文献:https://www.cnblogs.com/wyzs/p/6762452.html