将 MySQL 表导出为 CSV 文件

Posted

技术标签:

【中文标题】将 MySQL 表导出为 CSV 文件【英文标题】:Exporting a MySQL table into a CSV file 【发布时间】:2014-05-12 01:38:58 【问题描述】:

我有一个 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 个列名怎么办? 有没有办法不用手动输入?

【问题讨论】:

MySQL dump into CSV text files with column names at the top? 的可能重复项 mysqldump 与 --tab 应该是这里的简单方法,没有额外的脚本要求。我详细写了3 ways to convert MySQL to CSV。 【参考方案1】:

此命令几乎可以满足您的需求,它甚至可以与远程服务器一起使用。唯一需要注意的是它会生成一个 TSV 文件(字段由制表符分隔)。

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

但您可以使用 sed 将其转换为 CSV,如 this answer 中的建议:

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

【讨论】:

我可以使用where子句吗? @Lnux 是的,您可以使用 where 子句来缩小搜索范围,第一个引用区域中的所有内容都是一个普通的数据库查询。 mysql -u root -p mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable. csv - 这对我来说很好,谢谢 你能帮我修改它以使用 bash 脚本中的多个表来附加到输出文件吗? 我们可以导入这个导出的 tsv 吗?【参考方案2】:

我不明白你为什么不能这样做

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

【讨论】:

如果我这样做了,我不会得到列名...我有 200 列,那么如何使用列名导出它?【参考方案3】:
DESCRIBE addstock25;

删除第一列和该列的前三个条目(这取决于您的使用情况)。您将获得 addstock25 中的字段列表。

这将只使用在核心中派生的虚拟表带来字段名称...称为信息架构。

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

假设这个查询的名称是 sq_fieldnamelist。

所以,上面的表只有一列,它有“foo”表的字段名。

如果直接写like

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

【讨论】:

我不明白你在解释什么......我想要的是从 MySQL 导出的 csv 文件,第一行有列名。 给你一种复制列名的方法——有点自动 我想你想要这样的东西【参考方案4】:

我认为您正在寻找类似的东西。

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'。

【讨论】:

它发出一条错误消息....我更改了数据库名称....还有其他更改吗? 请把这个放在托盘上,如果它有效,请告诉我。设置@sql = NULL; SELECT GROUP_CONCAT("'", COLUMN_NAME, "'") FROM( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'yourdatabase' AND TABLE_NAME = 'ffd_companies') AS colnames GROUP BY 'COLUMN_NAME ' 进入@sql; SET @sql = concat ("SELECT", @sql, " from dual union all( SELECT * from ffd_companies )" );从@sql 准备stmt;执行语句; DEALLOCATE PREPARE stmt;【参考方案5】:

可以使用“表数据导出向导”并从那里复制选择的 SQL;

【讨论】:

以上是关于将 MySQL 表导出为 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:将多个表导出到 CSV 文件

将 mysql 表导出到 csv 中,其中数据在列中包含换行符

将 MySQL 表导出到 .csv 文件

如何将csv导入mysql和mysql导出csv

python 将MySQL表导出为.csv

使用html代码将mysql表导出到csv