使用 SELECT INTO OUTFILE 时包含标题吗?

发布于 2024-11-06 04:55:16 字数 44 浏览 1 评论 0原文

使用 MySQL INTO OUTFILE 时是否可以以某种方式包含标头?

Is it possible to include the headers somehow when using the MySQL INTO OUTFILE?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(25

旧伤还要旧人安 2024-11-13 04:55:16

您必须自己对这些标头进行硬编码。像这样的东西:

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE '/path/outfile'

You'd have to hard code those headers yourself. Something like:

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE '/path/outfile'
温馨耳语 2024-11-13 04:55:16

Joe Steanelli 提供的解决方案可行,但当涉及数十或数百列时,制作列列表很不方便。以下是如何获取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 方法中的第一个语句。

The solution provided by Joe Steanelli works, but making a list of columns is inconvenient when dozens or hundreds of columns are involved. Here's how to get column list of table my_table in my_schema.

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

Now you can copy & paste the resulting row as first statement in Joe's method.

怪我鬧 2024-11-13 04:55:16

对于使用 ORDER BY 进行复杂选择,我使用以下命令:

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

For complex select with ORDER BY I use the following:

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';
一花一树开 2024-11-13 04:55:16

这将允许您订购列和/或限制

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
    FROM YourTable order by ColName1 limit 3) a
    INTO OUTFILE '/path/outfile';

This will alow you to have ordered columns and/or a limit

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
    FROM YourTable order by ColName1 limit 3) a
    INTO OUTFILE '/path/outfile';
美煞众生 2024-11-13 04:55:16

您可以将准备好的语句与 lucek 的答案一起使用,并动态导出包含 CSV 中的列名称的表:

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

You can use prepared statement with lucek's answer and export dynamically table with columns name in CSV :

--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;

Thank lucek.

じее 2024-11-13 04:55:16

我只需进行 2 个查询,第一个是获取带有列名称的查询输出(限制 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

I simply make 2 queries, first to get query output (limit 1) with column names (no hardcode, no problems with Joins, Order by, custom column names, etc), and second to make query itself, and combine files into one CSV file:

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
千秋岁 2024-11-13 04:55:16

我在 NodeJS 中的大表上执行 mysql 查询时遇到了类似的问题。我在 CSV 文件中包含标题的方法如下

  1. 使用 OUTFILE 查询准备不带标题的文件

     SELECT * INTO OUTFILE [FILE_NAME] 字段以“,”结尾(可选) 
        BY '\"' 行以 '\n' 结尾,来自 [TABLE_NAME]
    
  2. 获取第 1 点中使用的表的列标题

     选择 GROUP_CONCAT(CONCAT(\"\",COLUMN_NAME,\"\")) 作为 col_names 
        INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = [TABLE_NAME] AND TABLE_SCHEMA 
        = [DATABASE_NAME] 按 ORDINAL_POSITION 排序
    
  3. 使用 prepend-file npm package

每个步骤的执行都是使用 NodeJS 中的 Promise 来控制的。

I faced similar problem while executing mysql query on large tables in NodeJS. The approach which I followed to include headers in my CSV file is as follows

  1. Use OUTFILE query to prepare file without headers

        SELECT * INTO OUTFILE [FILE_NAME] FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED 
        BY '\"' LINES TERMINATED BY '\n' FROM [TABLE_NAME]
    
  2. Fetch column headers for the table used in point 1

        select GROUP_CONCAT(CONCAT(\"\",COLUMN_NAME,\"\")) as col_names from 
        INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = [TABLE_NAME] AND TABLE_SCHEMA 
        = [DATABASE_NAME] ORDER BY ORDINAL_POSITION
    
  3. Append the column headers to the file created in step 1 using prepend-file npm package

Execution of each step was controlled using promises in NodeJS.

怎会甘心 2024-11-13 04:55:16

如果您熟悉 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 来重新创建表,则需要删除该列。

This is an alternative cheat if you are familiar with Python or R, and your table can fit into memory.

Import the SQL table into Python or R and then export from there as a CSV and you'll get the column names as well as the data.

Here's how I do it using R, requires the RMySQL library:

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

It's a bit of a cheat but I found this was a quick workaround when my number of columns was too long to use the concat method above. Note: R will add a 'row.names' column at the start of the CSV so you'll want to drop that if you do need to rely on the CSV to recreate the table.

小ぇ时光︴ 2024-11-13 04:55:16

我认为如果您使用 UNION 它将起作用:

select 'header 1', 'header 2', ...
union
select col1, col2, ... from ...

我不知道直接使用 INTO OUTFILE 语法指定标头的方法。

I think if you use a UNION it will work:

select 'header 1', 'header 2', ...
union
select col1, col2, ... from ...

I don't know of a way to specify the headers with the INTO OUTFILE syntax directly.

本宫微胖 2024-11-13 04:55:16

由于“include-headers”功能似乎还没有内置,并且这里的大多数“解决方案”需要手动输入列名称,和/或什至不考虑连接,我建议解决问题

  • 到目前为止,我发现的最好的替代方案是使用一个不错的工具(我使用HeidiSQL)。

    提出您的请求,选择网格,只需右键单击并导出到文件。它提供了干净导出所需的所有必要选项,并且应该可以满足大多数需求。

  • 同样的想法,user3037511 的方法运行良好,并且可以轻松实现自动化

    只需使用一些命令行启动您的请求即可获取标头。您可以使用 SELECT INTO OUTFILE... 或通过运行不受限制的查询来获取数据,由您选择。

    请注意,输出重定向到文件在 Linux 和 Windows 上都像一个魅力。

这让我想强调,80% 的情况下,当我想使用 SELECT FROM INFILE 或 SELECT INTO OUTFILE 时,由于某些限制(此处缺少AWS-RDS 上的“标头选项”、缺少的权限等等。)

因此,我没有完全回答操作员的问题...但它应该回答他的 >需求 :)

编辑:并实际回答他的问题:

截至 2017 年 9 月 7 日,如果您坚持使用 SELECT INTO OUTFILE 命令,则无法包含标头
:|

Since the 'include-headers' functionality doesn't seem to be build-in yet, and most "solutions" here need to type the columns names manually, and/or don't even take joins into account, I'd recommand to get around the problem.

  • The best alternative I found so far is using a decent tool (I use HeidiSQL).

    Put your request, select the grid, just right click and export to a file. It got all necessary options for a clean export, ans should handle most needs.

  • In the same idea, user3037511's approach works fine, and can be automated easily.

    Just launch your request with some command line to get your headers. You may get the data with a SELECT INTO OUTFILE... or by running your query without the limit, yours to choose.

    Note that output redirect to a file works like a charm on both Linux AND Windows.

This makes me want to highlight that 80% of the time, when I want to use SELECT FROM INFILE or SELECT INTO OUTFILE, I end-up using something else due to some limitations (here, the absence of a 'headers options', on an AWS-RDS, the missing rights, and so on.)

Hence, I don't exactly answer to the op's question... but it should answer his needs :)

EDIT : and to actually answer his question : no

As of 2017-09-07, you just can't include headers if you stick with the SELECT INTO OUTFILE command
:|

红玫瑰 2024-11-13 04:55:16

最简单的方法是自己对列进行硬编码,以更好地控制输出文件:

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE '/path/outfile'

The easiest way is to hard code the columns yourself to better control the output file:

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE '/path/outfile'
゛时过境迁 2024-11-13 04:55:16

实际上,即使使用 ORDER BY 也可以使其工作。

只需在 order by 语句中需要一些技巧 - 我们使用 case 语句并将标头值替换为保证在列表中排在第一位的其他值(显然这取决于字段的类型以及您是否要对 ASC 或 ASC 进行排序) DESC)

假设您有三个字段:name (varchar)、is_active (bool)、date_something_happens (date),并且您想要对后两个字段进行降序排序:

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

Actually you can make it work even with an ORDER BY.

Just needs some trickery in the order by statement - we use a case statement and replace the header value with some other value that is guaranteed to sort first in the list (obviously this is dependant on the type of field and whether you are sorting ASC or DESC)

Let's say you have three fields, name (varchar), is_active (bool), date_something_happens (date), and you want to sort the second two descending:

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
花开雨落又逢春i 2024-11-13 04:55:16

这是一种从列名动态获取标题标题的方法。

/* 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;

Here is a way to get the header titles from the column names dynamically.

/* 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;
尹雨沫 2024-11-13 04:55:16

我的数据库中的一个例子
表名称传感器列(id、时间、单位)

select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM sensor

an example from my database
table name sensor with colums (id,time,unit)

select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM sensor
蓝戈者 2024-11-13 04:55:16

如果您使用 MySQL Workbench:

  1. 从“SCHEMAS”选项卡中选择所有列 ->右键单击->复制到
    剪贴板->姓名

  2. 将其粘贴到任何文本编辑器中,然后将“`”替换为“'”

  3. 将其复制回来并在您的 UNION 查询中使用它(如接受的
    答案):

    SELECT [在此处粘贴您的文本]
    联合所有
    选择 *
    FROM 表名
    INTO OUTFILE '文件路径'
    

If you are using MySQL Workbench:

  1. Select all the columns from the SCHEMAS tab -> Right Click -> Copy to
    Clipboard -> Name

  2. Paste it in any text editor and, Replace " ` " with " ' "

  3. Copy it back and use it in your UNION query (as mentioned in the accepted
    answer):

    SELECT [Paste your text here]
    UNION ALL
    SELECT *
    FROM table_name
    INTO OUTFILE 'file_path'
    
燕归巢 2024-11-13 04:55:16

受到 Rick James 的数据透视表示例的启发。

SET @CSVTABLE = 'myTableName',
    @CSVBASE = 'databaseName',
    @CSVFILE = '/tmp/filename.csv';

SET @sql = (SELECT CONCAT("SELECT ", GROUP_CONCAT(CONCAT('"', COLUMN_NAME, '"')), " UNION SELECT * FROM ", @CSVBASE, ".", @CSVTABLE) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@CSVTABLE AND TABLE_SCHEMA=@CSVBASE);
prepare stmt from CONCAT(@sql, " INTO OUTFILE '", @CSVFILE, "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\\n';");
execute stmt;

它从 INFORMATION_SCHEMA.COLUMNS 表中获取列列表,并使用 GROUP_CONCAT 准备包含带有列名称的字符串列表的 SELECT 语句。

接下来添加UNIONSELECT * FROM指定的database.table - 这将创建查询文本,该文本将在结果中输出列名和列值。

现在,使用之前创建的查询(存储在 @sql 变量中)准备语句,CSV 输出特定的“事物”将附加到查询中,最后使用 execute stmt 执行语句

Inspired by pivot table example from Rick James.

SET @CSVTABLE = 'myTableName',
    @CSVBASE = 'databaseName',
    @CSVFILE = '/tmp/filename.csv';

SET @sql = (SELECT CONCAT("SELECT ", GROUP_CONCAT(CONCAT('"', COLUMN_NAME, '"')), " UNION SELECT * FROM ", @CSVBASE, ".", @CSVTABLE) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@CSVTABLE AND TABLE_SCHEMA=@CSVBASE);
prepare stmt from CONCAT(@sql, " INTO OUTFILE '", @CSVFILE, "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\\n';");
execute stmt;

It gets list of columns from INFORMATION_SCHEMA.COLUMNS table, and uses GROUP_CONCAT to prepare SELECT statement with list of strings with column names.

Next UNION is added with SELECT * FROM specified database.table - this creates query text that will output both column names and column values in result.

Now the statement is prepared using previously created query (stored in @sql variable), CSV output specific "things" are appended to query and finally statement is executed with execute stmt

独行侠 2024-11-13 04:55:16

我正在用 PHP 编写代码,在使用 concat 和 union 函数时遇到了一些麻烦,而且也没有使用 SQL 变量,无论我如何让它工作,这里是我的代码:

//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);

I was writing my code in PHP, and I had a bit of trouble using concat and union functions, and also did not use SQL variables, any ways I got it to work, here is my code:

//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);
疯了 2024-11-13 04:55:16

因此,如果 my_table 中的所有列都是字符数据类型,我们可以将最热门的答案(由 Joe、matt 和 illguc 提供)组合在一起,以自动添加标题在一个“简单”的 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 非常大,这可能会很慢。

So, if all the columns in my_table are a character data type, we can combine the top answers (by Joe, matt and evilguc) together, to get the header added automatically in one 'simple' SQL query, e.g.

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

where the last couple of lines make the output csv.

Note that this may be slow if my_table is very large.

我最亲爱的 2024-11-13 04:55:16

我想补充 Sangam Belose 提供的答案。这是他的代码:

select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM sensor

但是,如果您没有在变量中设置“secure_file_priv”,则它可能无法工作。为此,请通过以下方式检查该变量上设置的文件夹:

SHOW VARIABLES LIKE "secure_file_priv"

输出应如下所示:

mysql> show variables like "%secure_file_priv%";
+------------------+------------------------------------------------+
| Variable_name    | Value                                          |
+------------------+------------------------------------------------+
| secure_file_priv | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
+------------------+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

您可以更改此变量或更改查询以将文件输出到显示的默认路径。

I would like to add to the answer provided by Sangam Belose. Here's his code:

select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM sensor

However, if you have not set up your "secure_file_priv" within the variables, it may not work. For that, check the folder set on that variable by:

SHOW VARIABLES LIKE "secure_file_priv"

The output should look like this:

mysql> show variables like "%secure_file_priv%";
+------------------+------------------------------------------------+
| Variable_name    | Value                                          |
+------------------+------------------------------------------------+
| secure_file_priv | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
+------------------+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

You can either change this variable or change the query to output the file to the default path showing.

情深缘浅 2024-11-13 04:55:16

仅 MySQL 不足以简单地完成此任务。下面是一个 PHP 脚本,它将把列和数据输出到 CSV。

在顶部附近输入您的数据库名称和表。

<?php

set_time_limit( 24192000 );
ini_set( 'memory_limit', '-1' );
setlocale( LC_CTYPE, 'en_US.UTF-8' );
mb_regex_encoding( 'UTF-8' );

$dbn = 'DB_NAME';
$tbls = array(
'TABLE1',
'TABLE2',
'TABLE3'
);

$db = new PDO( 'mysql:host=localhost;dbname=' . $dbn . ';charset=UTF8', 'root', 'pass' );

foreach( $tbls as $tbl )
{
    echo $tbl . "\n";
    $path = '/var/lib/mysql/' . $tbl . '.csv';

    $colStr = '';
    $cols = $db->query( 'SELECT COLUMN_NAME AS `column` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "' . $tbl . '" AND TABLE_SCHEMA = "' . $dbn . '"' )->fetchAll( PDO::FETCH_COLUMN );
    foreach( $cols as $col )
    {
        if( $colStr ) $colStr .= ', ';
        $colStr .= '"' . $col . '"';
    }

    $db->query(
    'SELECT *
    FROM
    (
        SELECT ' . $colStr . '
        UNION ALL
        SELECT * FROM ' . $tbl . '
    ) AS sub
    INTO OUTFILE "' . $path . '"
    FIELDS TERMINATED BY ","
    ENCLOSED BY "\""
    LINES TERMINATED BY "\n"'
    );

    exec( 'gzip ' . $path );

    print_r( $db->errorInfo() );
}

?>

您需要将其作为您想要输出到的目录。 MySQL需要具有写入目录的能力。

$path = '/var/lib/mysql/' . $tbl . '.csv';

您可以在查询中编辑 CSV 导出选项:

INTO OUTFILE "' . $path . '"
FIELDS TERMINATED BY ","
ENCLOSED BY "\""
LINES TERMINATED BY "\n"'

最后有一个对 GZip CSV 的 exec 调用。

MySQL alone isn't enough to do this simply. Below is a PHP script that will output columns and data to CSV.

Enter your database name and tables near the top.

<?php

set_time_limit( 24192000 );
ini_set( 'memory_limit', '-1' );
setlocale( LC_CTYPE, 'en_US.UTF-8' );
mb_regex_encoding( 'UTF-8' );

$dbn = 'DB_NAME';
$tbls = array(
'TABLE1',
'TABLE2',
'TABLE3'
);

$db = new PDO( 'mysql:host=localhost;dbname=' . $dbn . ';charset=UTF8', 'root', 'pass' );

foreach( $tbls as $tbl )
{
    echo $tbl . "\n";
    $path = '/var/lib/mysql/' . $tbl . '.csv';

    $colStr = '';
    $cols = $db->query( 'SELECT COLUMN_NAME AS `column` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "' . $tbl . '" AND TABLE_SCHEMA = "' . $dbn . '"' )->fetchAll( PDO::FETCH_COLUMN );
    foreach( $cols as $col )
    {
        if( $colStr ) $colStr .= ', ';
        $colStr .= '"' . $col . '"';
    }

    $db->query(
    'SELECT *
    FROM
    (
        SELECT ' . $colStr . '
        UNION ALL
        SELECT * FROM ' . $tbl . '
    ) AS sub
    INTO OUTFILE "' . $path . '"
    FIELDS TERMINATED BY ","
    ENCLOSED BY "\""
    LINES TERMINATED BY "\n"'
    );

    exec( 'gzip ' . $path );

    print_r( $db->errorInfo() );
}

?>

You'll need this to be the directory you'd like to output to. MySQL needs to have the ability to write to the directory.

$path = '/var/lib/mysql/' . $tbl . '.csv';

You can edit the CSV export options in the query:

INTO OUTFILE "' . $path . '"
FIELDS TERMINATED BY ","
ENCLOSED BY "\""
LINES TERMINATED BY "\n"'

At the end there is an exec call to GZip the CSV.

皓月长歌 2024-11-13 04:55:16

我对这些都没有运气,所以在找到解决方案后,我想将其添加到之前的答案中。 Python==3.8.6 MySQL==8.0.19

(请原谅我没有对 foo 进行如此格式化。请有人清理一下。)

请注意以下几点:

首先,返回列名的查询不能使用标点符号。在“schema_name”和“table_name”周围使用“反引号”或省略“引号”将引发“未知列”错误。

WHERE TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table'

其次,列标题名称作为单实体元组返回,所有列名称连接在一个带引号的字符串中。转换为引用列表很容易,但并不直观(至少对我来说)。

headers_list = headers_result[0].split(",")

第三,游标必须被缓冲,否则“懒惰”的东西将无法在您需要时获取您的结果。对于非常大的表,内存可能是一个问题。也许分块可以解决这个问题。

cur = db.cursor(buffered=True)

最后,所有类型的 UNION 尝试都给我带来了错误。通过将整个混乱压缩到字典列表中,使用 csv.DictWriter 写入 csv 变得微不足道。

headers_sql = """   
SELECT 
GROUP_CONCAT(CONCAT(COLUMN_NAME) ORDER BY ORDINAL_POSITION)   
FROM INFORMATION_SCHEMA.COLUMNS   
WHERE TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table';   
"""" 

cur = db.cursor(buffered=True) 
cur.execute(header_sql) 
headers_result = cur.fetchone() 
headers_list = headers_result[0].split(",")

rows_sql = """   SELECT * FROM schema.table;   """" 

data = cur.execute(rows_sql) 
data_rows = cur.fetchall() 
data_as_list_of_dicts = [dict(zip(headers_list, row)) for row in data_rows]

with open(csv_destination_file, 'w', encoding='utf-8') as destination_file_opened: 
    dict_writer = csv.DictWriter(destination_file_opened, fieldnames=headers_list) 
    dict_writer.writeheader()   for dict in dict_list:
        dict_writer.writerow(dict)

I had no luck with any of these, so after finding a solution, I wanted to add it to the prior answers. Python==3.8.6 MySQL==8.0.19

(Forgive my lack of SO formatting foo. Somebody please clean up.)

Note a couple of things:

First, the query to return column names is unforgiving of punctuation. Using ` backticks or leaving out ' quote around the 'schema_name' and 'table_name' will throw an "unknown column" error.

WHERE TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table'

Second, the column header names return as a single-entity tuple with all the column names concatenated in one quoted string. Convert to quoted list was easy, but not intuitive (for me at least).

headers_list = headers_result[0].split(",")

Third, cursor must be buffered or the "lazy" thing will not fetch your results as you need them. For very large tables, memory could be an issue. Perhaps chunking would solve that problem.

cur = db.cursor(buffered=True)

Last, all types of UNION attempts yielded errors for me. By zipping the whole mess into a list of dicts, it became trivial to write to a csv, using csv.DictWriter.

headers_sql = """   
SELECT 
GROUP_CONCAT(CONCAT(COLUMN_NAME) ORDER BY ORDINAL_POSITION)   
FROM INFORMATION_SCHEMA.COLUMNS   
WHERE TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table';   
"""" 

cur = db.cursor(buffered=True) 
cur.execute(header_sql) 
headers_result = cur.fetchone() 
headers_list = headers_result[0].split(",")

rows_sql = """   SELECT * FROM schema.table;   """" 

data = cur.execute(rows_sql) 
data_rows = cur.fetchall() 
data_as_list_of_dicts = [dict(zip(headers_list, row)) for row in data_rows]

with open(csv_destination_file, 'w', encoding='utf-8') as destination_file_opened: 
    dict_writer = csv.DictWriter(destination_file_opened, fieldnames=headers_list) 
    dict_writer.writeheader()   for dict in dict_list:
        dict_writer.writerow(dict)
心凉怎暖 2024-11-13 04:55:16

使用 python 的解决方案,但如果您已经使用其他工具,则无需安装 python 包来读取 sql 文件。
如果您不熟悉 python,您可以在 colab 笔记本中运行 python 代码,所有必需的软件包都已安装。它使马特和乔的解决方案自动化。

首先执行此 SQL 脚本以获取包含所有表名称的 csv:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='your_schema'
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/tables.csv';

然后将tables.csv 移动到合适的目录,并在替换“path_to_tables”和“your_schema”后执行此 python 代码。它将生成一个 sql 脚本来导出所有表标题:

import pandas as pd
import os

tables = pd.read_csv('tables.csv',header = None)[0]
text_file = open("export_headers.sql", "w")
schema = 'your_schema'

sql_output_path = 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/'
for table in tables :
    path = os.path.join(sql_output_path,'{}_header.csv'.format(table))
    string = "(select GROUP_CONCAT(COLUMN_NAME)\nfrom INFORMATION_SCHEMA.COLUMNS\nWHERE TABLE_NAME = '{}'\nAND TABLE_SCHEMA = '{}'\norder BY ORDINAL_POSITION)\nINTO OUTFILE '{}';".format(table,schema,path)
    n = text_file.write(string)
    n = text_file.write('\n\n')
text_file.close()

然后执行此 python 代码,该代码将生成一个 sql 脚本来导出所有表的值:

text_file = open("export_values.sql", "w")
for table in tables :
    path = os.path.join(sql_output_path,'{}.csv'.format(table))
    string = "SELECT * FROM {}.{}\nINTO OUTFILE '{}';".format(schema,table,path)
    n = text_file.write(string)
    n = text_file.write('\n\n')
text_file.close()

执行两个生成的 sql 脚本并将标题 csv 和值 csv 移动到您选择的目录中。

然后执行最后一个 python 代码:

#Respectively the path to the headers csvs, the values csv and the path where you want to put the csvs with headers and values combined
headers_path, values_path, tables_path = '', '', '' 

for table in tables :
    header = pd.read_csv(os.path.join(headers_path,'{}_header.csv'.format(table)))
    df = pd.read_csv(os.path.join(values_path,'{}.csv'.format(table)),names = header.columns,sep = '\t')
    df.to_csv(os.path.join(tables_path,'{}.csv'.format(table)),index = False)

然后您将所有表导出为带有标题的 csv,而无需编写或复制粘贴所有表和列名称。

Solution using python but no need to install a python package to read sql files if you already use another tool.
If you are not familiar with python you can run the python codes in a colab notebook, all the required packages are already installed. It automates Matt and Joe's solutions.

Firstly execute this SQL script to get a csv with all table names :

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='your_schema'
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/tables.csv';

Then move tables.csv to a suitable directory and execute this python code after having replaced 'path_to_tables' and 'your_schema'. It will generate a sql script to export all tables headers:

import pandas as pd
import os

tables = pd.read_csv('tables.csv',header = None)[0]
text_file = open("export_headers.sql", "w")
schema = 'your_schema'

sql_output_path = 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/'
for table in tables :
    path = os.path.join(sql_output_path,'{}_header.csv'.format(table))
    string = "(select GROUP_CONCAT(COLUMN_NAME)\nfrom INFORMATION_SCHEMA.COLUMNS\nWHERE TABLE_NAME = '{}'\nAND TABLE_SCHEMA = '{}'\norder BY ORDINAL_POSITION)\nINTO OUTFILE '{}';".format(table,schema,path)
    n = text_file.write(string)
    n = text_file.write('\n\n')
text_file.close()

Then execute this python code which will generate a sql script to export the values of all tables:

text_file = open("export_values.sql", "w")
for table in tables :
    path = os.path.join(sql_output_path,'{}.csv'.format(table))
    string = "SELECT * FROM {}.{}\nINTO OUTFILE '{}';".format(schema,table,path)
    n = text_file.write(string)
    n = text_file.write('\n\n')
text_file.close()

Execute the two generated sql scripts and move the header csvs and values csvs in directories of your choice.

Then execute this last python code :

#Respectively the path to the headers csvs, the values csv and the path where you want to put the csvs with headers and values combined
headers_path, values_path, tables_path = '', '', '' 

for table in tables :
    header = pd.read_csv(os.path.join(headers_path,'{}_header.csv'.format(table)))
    df = pd.read_csv(os.path.join(values_path,'{}.csv'.format(table)),names = header.columns,sep = '\t')
    df.to_csv(os.path.join(tables_path,'{}.csv'.format(table)),index = False)

Then you got all your table exported in csv with the headers without having to write or copy paste all the tables and columns names.

是你 2024-11-13 04:55:16

之后您始终可以使用 Bash 添加列:

columns=$(mysql -u root -D database_name -e "SELECT * from users LIMIT 1" | head -1 | tr -s '[:blank:]' ',')
// Get the column names from the DB and replace tabs with commas to make them CSV
sed -i "1s/^/$columns\n/" "$database_name.csv"
// Add the columns to a new line at the beginning of the CSV file

对于大型 CSV 文件,这可能需要一段时间,并且需要两倍于文件大小的可用空间,以便 sed 创建其自动备份文件,但它完成工作。

You can always add the columns afterwards using Bash:

columns=$(mysql -u root -D database_name -e "SELECT * from users LIMIT 1" | head -1 | tr -s '[:blank:]' ',')
// Get the column names from the DB and replace tabs with commas to make them CSV
sed -i "1s/^/$columns\n/" "$database_name.csv"
// Add the columns to a new line at the beginning of the CSV file

This might take a while for large CSV files and will require free space double the size of the file in order for sed to create its automatic backup file, but it does the job.

对风讲故事 2024-11-13 04:55:16

您可以按照文档使用格式文本标题 -
https://docs.aws.amazon.com/ AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.SaveIntoS3.html

我使用类似的东西:

SELECT * FROM table
INTO OUTFILE S3 's3://bucket/folder'
设置文本标题格式
以“,”结尾的字段
可选择用“”括起来
以 '\n' 结尾的行
覆盖

尝试并让我知道

you could use FORMAT TEXT HEADER as per document -
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.SaveIntoS3.html

I use something like:

SELECT * FROM table
INTO OUTFILE S3 's3://bucket/folder'
FORMAT TEXT HEADER
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
OVERWRITE ON

try and let me know

旧人九事 2024-11-13 04:55:16
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE 'c:\\datasheet.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE 'c:\\datasheet.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文