簡體   English   中英

將 MySQL 表導出為 CSV 文件

[英]Exporting a MySQL table into a CSV file

我有一個 MySQL 表,必須將其作為 CSV 文件取出。 我使用的查詢是

SELECT "ID","NAME","SALARY","SAL1","SAL2","SAL3","SAL4","SAL5","SAL6","SAL7","SAL8","SAL9","SAL10","SAL11","SAL12","SAL13","SAL14","SAL15","SAL16","SAL17","SAL18","SAL19","SAL20","SAL21","SAL22","SAL23","SAL24","SAL25","SAL26"
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

此查詢有效,但如果我有 200 個列名怎么辦? 有沒有辦法在不手動輸入的情況下做到這一點?

這個命令幾乎可以給你你想要的東西,它甚至可以與遠程服務器一起使用。 唯一需要注意的是它會生成一個 TSV 文件(字段由制表符分隔)。

mysql mydb -e "select * from mytable" -B > mytable.tsv 

但是您可以使用 sed 將其轉換為 CSV, 如此答案中所建議的:

mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv
DESCRIBE addstock25;

去除第一列和該列的前三個條目(這取決於您的使用情況)。 您將獲得 addstock25 中的字段列表。

這將只帶來使用核心派生的虛擬表的字段名稱......稱為信息模式。

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='foo';

假設此查詢的名稱是 sq_fieldnamelist。

因此,上表只有一列,並且具有“foo”表的字段名稱。

如果直接寫像

SELECT (sq_fieldnamelist)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

MySQL 會報錯。 “子查詢返回多行”

我們必須編輯 sq_fieldnamelist 以將所有條目背靠背連接起來,用逗號分隔。

Select GROUP_CONCAT(COLUMN_NAME)
FROM
(SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='ffd_companies'
LIMIT 3,100
) AS fafa
GROUP BY 'COLUMN_NAME' // This group by is just to make group concatenation work

假設這是 sq_fieldnamelist2。

如果我們像這樣編輯 sq_fieldnamelist,它將只返回一個值,即所有字段名稱以逗號分隔。 所以現在我們可以把這個子查詢放在你的 select 語句中來獲取所需的字段。

SELECT (sq_fieldnamelist2)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

您需要根據自己的目的在 sq_fieldnamelist2 中編輯 LIMIT 3,100。

假設您的表類似於 fil1、fil2...filN、sal1、sal2、sal3....、salI。 要查看唯一的薪水字段,您應該使用LIMIT N, x > I+N 如果您想查看所有內容,請使用LIMIT 0, x > N+I

我不明白你為什么不能做

SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

我想你正在尋找這樣的東西。

SET @sql = NULL;
SELECT GROUP_CONCAT("'",COLUMN_NAME,"'")
 FROM
(SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'yourdatabasename'
and `TABLE_NAME`='ffd_companies'
) AS colnames
GROUP BY 'COLUMN_NAME'
into @sql;

SET @sql = concat ("SELECT", @sql, " from dual
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE 'E:\\JOSE DATA\\addstock7.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '", '"',"'
)"
);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

請注意,我添加了WHERE子句TABLE_SCHEMA = 'yourdatabasename'。

我已經為簡單的基於UI的代碼集成了腳本。 在這里,您可以輸入查詢,只需獲取包含所有行(包括列名稱)的csv文件。

此腳本適用於Windows和Linux系統。

https://github.com/Bihari12/databasetocsv

這會將結果保存在代碼所在的同一文件夾中的csv文件中。

可以使用“表數據導出向導”,從那里可以復制選擇的 SQL;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM