将MySQL表导出为CSV文件

35

我有一个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个列名怎么办? 有没有一种方法可以避免手动输入?


1
可能是MySQL转储到带有顶部列名的CSV文本文件中?的重复问题。 - Syed Aslam
使用mysqldump和--tab选项应该是最简单的方法,无需额外的脚本要求。我详细介绍了3种将MySQL转换为CSV的方法 - mysql_user
5个回答

73
这个命令几乎可以给你想要的东西,而且它甚至可以在远程服务器上运行。唯一需要注意的是,它生成的文件是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

我可以使用where子句吗? - Lnux
@Lnux 是的,你可以使用 where 子句来缩小搜索范围。在 select 语句中第一个引号内的所有内容都是普通的数据库查询。 - Caperneoignis
1
mysql -u root -p mydb -e "select * from mytable" -B | sed "s/'/'/;s/\t/","/g;s/^/"/;s/$/"/;s/\n//g" > mytable.csv - 这对我很有效,谢谢。 - Thara Perera
你能帮我修改这个bash脚本,使用多个表格追加到输出文件中吗? - Tony-Caffe
我们可以导入这个导出的 TSV 文件吗? - Lakshmikant Deshpande

5
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 (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


1
我不太明白你在解释什么...... 我想要的是从MySQL导出带有列名在第一行的csv文件。 - user3304713
提供一种复制列名的方式 - 一点自动化 - tgkprog
我认为你想要这样的东西。 - user2102266

4
我不明白你为什么不能做。
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

5
如果我这样做,就得不到列名了...我有200列,那么该如何导出带有列名的数据? - user3304713

1
我认为您正在寻找类似于这样的东西。
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'。

它正在发出一个错误信息...我改变了数据库名称...还需要做其他更改吗? - user3304713
请尝试运行以下代码,并告诉我是否有效。SET @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' INTO @sql;SET @sql = concat ("SELECT", @sql, " from dual union all( SELECT * from ffd_companies)" ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; - Oscar Rovira

0
可以使用“表格数据导出向导”,从中复制所选SQL;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接