在本教學中,您將學習如何將MySQL表導出到CSV檔的各種方法/技術。
CSV代表逗號分隔值。 您經常使用CSV檔格式在Microsoft Excel,Open Office,Google Docs等應用程式之間交換數據。
以CSV檔格式從MySQL資料庫中獲取數據將非常有用,因為您可以按照所需的方式分析和格式化數據。
MySQL提供了一種將查詢結果導出到位於資料庫伺服器中的CSV檔的簡單方法。
在導出數據之前,必須確保:
- MySQL伺服器的進程對包含目標CSV檔的目標檔夾具有寫訪問許可權。
- 要導出的目標CSV檔不能存在。
以下查詢從orders
表中查詢選擇已取消的訂單:
SELECT
orderNumber, status, orderDate, requiredDate, comments
FROM
orders
WHERE
status = 'Cancelled';
要將此結果集導出為CSV檔,請按如下方式向上述查詢添加一些子句:
SELECT
orderNumber, status, orderDate, requiredDate, comments
FROM
orders
WHERE
status = 'Cancelled'
INTO OUTFILE 'F:/worksp/mysql/cancelled_orders.csv'
FIELDS ENCLOSED BY '"'
TERMINATED BY ';'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n';
該語句在F:/worksp/mysql/
目錄下創建一個包含結果集,名稱為cancelled_orders.csv
的CSV檔。
CSV檔包含結果集中的行集合。每行由一個回車序列和由LINES TERMINATED BY '\r\n'
子句指定的換行字元終止。檔中的每行包含表的結果集的每一行記錄。
每個值由FIELDS ENCLOSED BY '"'
子句指示的雙引號括起來。 這樣可以防止可能包含逗號(,
)的值被解釋為字段分隔符號。 當用雙引號括住這些值時,該值中的逗號不會被識別為字段分隔符號。
將數據導出到檔案名包含時間戳的CSV檔
我們經常需要將數據導出到CSV檔中,該檔的名稱包含創建檔的時間戳。 為此,您需要使用MySQL準備語句。
以下命令將整個orders
表導出為將時間戳作為檔案名的一部分的CSV檔。
SET @TS = DATE_FORMAT(NOW(),'_%Y%m%d_%H%i%s');
SET @FOLDER = 'F:/worksp/mysql/';
SET @PREFIX = 'orders';
SET @EXT = '.csv';
SET @CMD = CONCAT("SELECT * FROM orders INTO OUTFILE '",@FOLDER,@PREFIX,@TS,@EXT,
"' FIELDS ENCLOSED BY '\"' TERMINATED BY ';' ESCAPED BY '\"'",
" LINES TERMINATED BY '\r\n';");
PREPARE statement FROM @CMD;
EXECUTE statement;
下麵,讓我們來詳細講解上面的命令。
- 首先,構造了一個具有當前時間戳的查詢作為檔案名的一部分。
- 其次,使用
PREPARE
語句FROM
命令準備執行語句。 - 第三,使用
EXECUTE
命令執行語句。
可以通過事件包裝命令,並根據需要定期安排事件的運行。
使用列標題導出數據
如果CSV檔包含第一行作為列標題,那麼該檔更容易理解,這是非常方便的。
要添加列標題,需要使用UNION語句如下:
(SELECT 'Order Number','Order Date','Status')
UNION
(SELECT orderNumber,orderDate, status
FROM orders
INTO OUTFILE 'F:/worksp/mysql/orders_union_title.csv'
FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"'
LINES TERMINATED BY '\r\n');
如查詢所示,需要包括每列的列標題。
處理NULL值
如果結果集中的值包含NULL值,則目標檔將使用“N/A
”來代替數據中的NULL
值。要解決此問題,您需要將NULL
值替換為另一個值,例如不適用(N/A
),方法是使用IFNULL函數,如下:
SELECT
orderNumber, orderDate, IFNULL(shippedDate, 'N/A')
FROM
orders INTO OUTFILE 'F:/worksp/mysql/orders_null2na.csv'
FIELDS ENCLOSED BY '"'
TERMINATED BY ';'
ESCAPED BY '"' LINES
TERMINATED BY '\r\n';
我們用N/A
字串替換了shippingDate
列中的NULL
值。 CSV檔將顯示N/A
而不是NULL
值。