在使用SELECT INTO OUTFILE时包含标题?
在使用MySQL INTO OUTFILE
时,是否可以包含标题?
你必须自己硬编码这些头。 就像是:
SELECT 'ColName1', 'ColName2', 'ColName3' UNION ALL SELECT ColName1, ColName2, ColName3 FROM YourTable INTO OUTFILE '/path/outfile'
由Joe Steanelli提供的解决scheme是有效的,但是当涉及数十或数百个列时,列列表不方便。 以下是如何在my_schema中获取表my_table的列表 。
-- override GROUP_CONCAT limit of 1024 characters to avoid a truncated result set session group_concat_max_len = 1000000; select GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'")) from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'my_table' AND TABLE_SCHEMA = 'my_schema' order BY ORDINAL_POSITION
现在,您可以将结果行复制粘贴到Joe的方法中作为第一条语句。
对于使用ORDER BY的复杂select,我使用以下内容:
SELECT * FROM ( SELECT 'Column name #1', 'Column name #2', 'Column name ##' UNION ALL ( // complex SELECT statement with WHERE, ORDER BY, GROUP BY etc. ) ) resulting_set INTO OUTFILE '/path/to/file';
您可以使用准备好的语句与lucek的答案和CSV列名称dynamic表导出:
--If your table has too many columns SET GLOBAL group_concat_max_len = 100000000; --Prepared statement SET @SQL = ( select CONCAT('SELECT * INTO OUTFILE \'YOUR_PATH\' FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' ESCAPED BY \'\' LINES TERMINATED BY \'\\n\' FROM (SELECT ', GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'")),' UNION select * from YOUR_TABLE) as tmp') from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE' AND TABLE_SCHEMA = 'YOUR_SCHEMA' order BY ORDINAL_POSITION ); --Execute it PREPARE stmt FROM @SQL; EXECUTE stmt;
感谢lucek。
这将让你有订单的列和/或限制
SELECT 'ColName1', 'ColName2', 'ColName3' UNION ALL SELECT * from (SELECT ColName1, ColName2, ColName3 FROM YourTable order by ColName1 limit 3) a INTO OUTFILE '/path/outfile';
我只是做2个查询,首先得到与列名称(没有硬编码,没有问题,连接,sorting,自定义列名等)的查询输出(限制1),第二个查询本身,并将文件合并成一个CSV文件:
CSVHEAD=`/usr/bin/mysql $CONNECTION_STRING -e "$QUERY limit 1;"|head -n1|xargs|sed -e "s/ /'\;'/g"` echo "\'$CSVHEAD\'" > $TMP/head.txt /usr/bin/mysql $CONNECTION_STRING -e "$QUERY into outfile '${TMP}/data.txt' fields terminated by ';' optionally enclosed by '\"' escaped by '' lines terminated by '\r\n';" cat $TMP/head.txt $TMP/data.txt > $TMP/data.csv
如果你熟悉Python或者R,而且你的表可以放入内存,这是一个替代的作弊。
将SQL表导入Python或R,然后从那里导出为CSV,您将获得列名以及数据。
下面是我如何使用R,需要RMySQL库:
db <- dbConnect(MySQL(), user='user', password='password', dbname='myschema', host='localhost') query <- dbSendQuery(db, "select * from mytable") dataset <- fetch(query, n=-1) write.csv(dataset, 'mytable_backup.csv')
这是一个骗子,但我发现这是一个快速的解决方法,当我的列数太长,不能使用上面的concat方法。 注意:R会在CSV的开始处添加一个“row.names”列,所以如果您需要依靠CSV来重新创build表格,则需要删除该列。
因此, 如果my_table
中的所有列都是一个字符数据types ,我们可以将最常见的答案(通过Joe,matt和evilguc)结合在一起,以便在一个简单的SQL查询中自动添加标题,例如
select * from ( (select column_name from information_schema.columns where table_name = 'my_table' and table_schema = 'my_schema' order by ordinal_position) union all (select * // potentially complex SELECT statement with WHERE, ORDER BY, GROUP BY etc. from my_table)) as tbl into outfile '/path/outfile' fields terminated by ',' optionally enclosed by '"' escaped by '\\' lines terminated by '\n';
最后几行在哪里输出csv。
请注意,如果my_table
非常大,这可能会很慢。
我想如果你使用联盟,它会工作:
select 'header 1', 'header 2', ... union select col1, col2, ... from ...
我不知道用INTO OUTFILE语法直接指定头文件的方法。
其实你甚至可以使用ORDER BY工作。
只需要按顺序声明一些技巧 – 我们使用一个case语句,并用一些其他值保证首先在列表中sorting(显然这取决于字段的types,是否sortingASC或DESC)
假设您有三个字段,名称(varchar),is_active(bool),date_something_happens(date),并且您想对第二个降序进行sorting:
select 'name' , 'is_active' as is_active , date_something_happens as 'date_something_happens' union all select name, is_active, date_something_happens from my_table order by (case is_active when 'is_active' then 0 else is_active end) desc , (case date when 'date' then '9999-12-30' else date end) desc
我正在使用PHP编写我的代码,并且使用concat和union函数时遇到了一些问题,并且也没有使用SQLvariables,我使用它的任何方式,下面是我的代码:
//first I connected to the information_scheme DB $headercon=mysqli_connect("localhost", "USERNAME", "PASSWORD", "information_schema"); //took the healders out in a string (I could not get the concat function to work, so I wrote a loop for it) $headers = ''; $sql = "SELECT column_name AS columns FROM `COLUMNS` WHERE table_schema = 'YOUR_DB_NAME' AND table_name = 'YOUR_TABLE_NAME'"; $result = $headercon->query($sql); while($row = $result->fetch_row()) { $headers = $headers . "'" . $row[0] . "', "; } $headers = substr("$headers", 0, -2); // connect to the DB of interest $con=mysqli_connect("localhost", "USERNAME", "PASSWORD", "YOUR_DB_NAME"); // export the results to csv $sql4 = "SELECT $headers UNION SELECT * FROM YOUR_TABLE_NAME WHERE ... INTO OUTFILE '/output.csv' FIELDS TERMINATED BY ','"; $result4 = $con->query($sql4);
由于'include-headers'function似乎还没有内置,而且大多数“解决scheme”都需要手动input列名,或者甚至不考虑连接,所以我build议解决这个问题 。
-
我发现迄今为止最好的select是使用一个体面的工具(我使用HeidiSQL )。
把你的要求,select网格,只需右键单击并导出到一个文件。 它有一个干净的出口所有必要的选项,答应处理大多数需求。 -
在同样的想法,user3037511的方法工作正常,并且可以很容易地自动化 。
只需用一些命令行启动你的请求来获取你的头文件。 您可以通过SELECT INTO OUTFILE获取数据…或通过运行没有限制的查询,您可以select。请注意,输出redirect到一个文件在Linux和Windows上都像一个魅力。
这使得我想强调80%的时间,当我想使用SELECT FROM INFILE或SELECT INTO OUTFILE时,由于一些限制(这里没有'headers options',一个AWS-RDS,缺less的权利,等等。)
因此,我不完全回答op的问题 …但它应该回答他的需要 🙂
编辑:并实际回答他的问题: 不
截至2017年9月7日,如果您坚持使用SELECT INTO OUTFILE命令,则不能包含标题 :|
这是一种从列名dynamic获取标题标题的方法。
/* Change table_name and database_name */ SET @table_name = 'table_name'; SET @table_schema = 'database_name'; SET @default_group_concat_max_len = (SELECT @@group_concat_max_len); /* Sets Group Concat Max Limit larger for tables with a lot of columns */ SET SESSION group_concat_max_len = 1000000; SET @col_names = ( SELECT GROUP_CONCAT(QUOTE(`column_name`)) AS columns FROM information_schema.columns WHERE table_schema = @table_schema AND table_name = @table_name); SET @cols = CONCAT('(SELECT ', @col_names, ')'); SET @query = CONCAT('(SELECT * FROM ', @table_schema, '.', @table_name, ' INTO OUTFILE \'/tmp/your_csv_file.csv\' FIELDS ENCLOSED BY \'\\\'\' TERMINATED BY \'\t\' ESCAPED BY \'\' LINES TERMINATED BY \'\n\')'); /* Concatenates column names to query */ SET @sql = CONCAT(@cols, ' UNION ALL ', @query); /* Resets Group Contact Max Limit back to original value */ SET SESSION group_concat_max_len = @default_group_concat_max_len; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SELECT'ColName1','ColName2','ColName3' 联盟所有 selectColName1,ColName2,ColName3 FROM YourTable INTO OUTFILE'c:\\ datasheet.csv'FIELDS TERMINATED BY','OPTIONALLY ENCLOSED BY''''LINES TERMINATED BY'\ n'