将 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( SELECTCOLUMN_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 文件的主要内容,如果未能解决你的问题,请参考以下文章