MySQL での縦型・横型データ集計と大批量データのインポート・エクスポート方法

縦型(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.5369
婦人科20.6128
心臓血管外科0.7164
一般外科20.4334
泌尿器外科20.2310
焼傷科0.1923
科114.0617
腎血液内科0.078
脳血管センター1.5039
合計18.33292

横型(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.332922.2122

大批量データの高速エクスポート/インポート

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

タグ: MySQL union UNION ALL LOAD DATA INFILE SELECT INTO OUTFILE

6月26日 21:59 投稿