My requirement is to store the entire results of the query
SELECT * FROM document
WHERE documentid IN (SELECT * FROM TaskResult WHERE taskResult = 2429)
to an Excel file.
My requirement is to store the entire results of the query
SELECT * FROM document
WHERE documentid IN (SELECT * FROM TaskResult WHERE taskResult = 2429)
to an Excel file.
The typical way to achieve this is to export to CSV and then load the CSV into Excel.
For a server-side Excel-friendly CSV file from a SELECT
query, run this:
SELECT ... FROM someTable WHERE etc
INTO OUTFILE 'someTableExport.csv' CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY ''
LINES TERMINATED BY '\r\n';
For a server-side Excel-friendly CSV file use mysqldump
like so:
mysqldump -h serverHostName -u mysqlUserName -p --tab="someTableExport.csv" --fields-optionally-enclosed-by=0x22 --fields-escaped-by='' --fields-terminated-by=0x2C --lines-terminated-by=0x0D0A --databases databaseName --tables table1 table2 table3
For a client-side Excel-friendly CSV file using mysqlsh
(MySQL Shell) like so:
mysqlsh --user="mysqlUserName" --host="serverHostName" --port=3306 --schema="databaseName"
# Once connected, run this:
util.exportTable("tableName", "file:///C:/Users/You/Desktop/test.csv", { dialect: "csv", fieldsEscapedBy: ""})
Remember that Excel has its own underdocumented ideas about how CSV files should be formatted and these stand in-contrast to MySQL's own ideas about CSV files; though Excel is largely compliant with RFC 4180 you still need to prod and poke MySQL and its associated tooling to generate CSV files that Excel won't misinterpret:
Excel | MySQL (default) | MySQL (when configured) | |
---|---|---|---|
SQL NULL |
Zero-length value | Literal \N |
Literal NULL |
Text values that don't contain commas, quotes, or line-breaks | Not enclosed | Not enclosed | Enclosed in " |
Text values that contain commas, quotes, or line-breaks | Enclosed in " |
Not enclosed | Enclosed in " |
Non-text values | Not enclosed | Not enclosed | Not enclosed |
Line-breaks and tabs in text values | Literal | Escaped as [\r]\n |
Literal |
Double-quotes in text values | Doubled-up "" |
Escaped as \" |
Doubled-up "" |
Field separator | , |
\t (Tab) |
, |
Record separator | \r\n |
\n |
\r\n |
Commas inside non-quoted text values | (Results in broken table data) | Not escaped | Will always be quoted if the value contains a comma |
UTF-8 support |
|
Use utf8mb4 .Do not specify the older broken utf8 or utf8mb3 encodings. |
Use utf8mb4 |
As per the table above, MySQL can generate Excel-friendly CSV files, excepting that SQL NULL
s will always be interpreted by Excel as literal text, though it's trivial to use PowerQuery or even just Find-and-Replace in Excel to replace them with empty cells.
=
then you'll need to manually fudge those as even when quoted Excel will interpret the text following =
as a formula instead of literal text.sep=
too.Surprisingly, it wasn't until Excel was 31 years old (Excel 2016) when Excel added built-in support for UTF-8 encoding in files without needing a BOM, but it still defaults to importing and exporting CSV files using your system-default non-Unicode encoding (e.g. Windows-1252
).
65001
for correct UTF-8 handling as Excel still defaults to non-Unicode-based codepages for some reason.
Note that opening a CSV file in Excel won't display the Text Import Wizard. (As of Excel 2021) you need to copy-and-paste CSV text into Excel and use the popup menu to use the legacy (frozen-in-1994) wizard, or use Data > From Text/CSV on the ribbon to use the newer (but less flexible, imo) PowerQuery-based CSV import wizard:
Option | SELECT INTO OUTFILE |
mysqldump --tab |
mysqldump > file.csv |
mysqlsh |
MySQL Workbench |
---|---|---|---|---|---|
Server-side CSV | True | True | True | True | Broken |
Remote (client-side) CSV | False | False | False | True | Broken |
MySQL Server version support | All versions | All versions | All versions | Only 5.7 and later | All versions |
INTO OUTFILE
:INTO OUTFILE
clause of a SELECT
query.
mysqldump
(see below).OUTFILE
clause has a number of optional subclauses that must be specified for some-level of compatibility with Excel's own CSV reader:
FIELDS...
TERMINATED BY
(default: '\t'
, for Excel use ','
)[OPTIONALLY] ENCLOSED BY
(default: ''
, should be '"'
with the OPTIONALLY
keyword)ESCAPED BY
(default: '\\'
, for Excel use ''
)LINES...
TERMINATED BY
(default: '\n'
, for Excel use '\r\n'
)STARTING BY
(default: ''
, for Excel you can omit this or use the MySQL default).ENCLOSED BY
(without the preceding OPTIONALLY
keyword) as that will enquote all values, regardless of type (i.e. it will enquote int
values which will cause Excel (by default) to interpret them as text (strings) instead of numbers).NULL
s as empty-fields, and so Excel will interpet them as unquoted strings of text (i.e. as "NULL"
), so you'll want to do a Find-and-Replace in Excel after importing the file.INTO OUTFILE <fileName>
filename (e.g. 'someTableExport.csv'
above) is not an absolute path then it will be saved into your database's datadir
directory. Run SHOW VARIABLES LIKE 'datadir';
to get the path. Note that you might not necessarily have read/write permission for new files under that directory.So your query (SELECT * FROM document WHERE documentid...
) would look something like this:
SELECT
*
FROM
document
WHERE
documentid IN ( SELECT documentid FROM TaskResult WHERE taskResult = 2429 )
INTO
OUTFILE 'someTableExport.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', ESCAPED BY ''
LINES TERMINATED BY '\r\n';
mysqldump
:--tab
command-line option, as per mysqldump
's documentation.mysqldump
's --tab=
option won't work for remote MySQL servers: this is because --tab="fileName.csv"
can only represent a path on the server.
stdout
redirection to generate a local file (i.e. mysqldump --etc > output.csv
) you cannot use the --fields-terminated-by
and other format options with stdout
, making it useless for Excel-compatible output. So if you're remote and cannot ssh
-in then you will need to use MySQL Shell (mysqlsh
) instead (see below).mysqldump
does not support SELECT
queries for dumping data: it does support simple WHERE
-style filters with the --where=<expr>
option but this doesn't support things like filtering using an INNER JOIN
(though as a workaround you could SELECT
into a new table, then run mysqldump
on that new table. Note that you cannot use TEMPORARY TABLE
with mysqldump
as Temporary Tables are connection-scoped).In the OP's case, due to limitations inherent in how the --where=
command-line option works, they'll want to export both tables (document
and TaskResult
) and apply their filter logic in Excel PowerQuery or similar. Perform the export like so:
mysqldump -h serverHostName -u mysqlUserName -p --tab="someTableExport.csv" --fields-optionally-enclosed-by=0x22 --fields-escaped-by='' --fields-terminated-by=0x2C --lines-terminated-by=0x0D0A --databases databaseName --tables document TaskResult
The above command-line should work without modification in Windows' cmd.exe
, macOS's zsh
, and bash
on Linux - provided mysqldump
is in your PATH
.
The use of hex-encoded chars means sidestepping the hassle of figurig out how to pass double-quotes and line-breaks as literals in your shell and terminal (0x22
is "
, 0x2C
is ,
, and 0x0D0A
is \r\n
).
Avoid using the --password=<value>
(aka -p<value>
) option on
the mysqldump
command-line, as it will mean your password will be saved in plaintext to your terminal or console history file, which is an obvious massive security risk.
mysqldump
will prompt you for the password immediately when the program runs so it won't be saved to your history file.mysqldump
in a non-interactive context (e.g. from within a web-application, daemon, or other process) then there's (normally) no history file to worry about, but you should still consider alternative approaches before resorting to handling passwords in an insecure way.If you don't specify an absolute path but use a short (unqualified) filename like INTO OUTFILE 'output.csv'
or INTO OUTFILE './output.csv'
theb it will store the output file to the directory specified by SHOW VARIABLES LIKE 'datadir';
.
Unfortunately, you can't (unless you don't have any double-quotes anywhere in your data): As of late 2022 MySQL Workbench has an open bug regarding its own CSV export feature: output files never escape double-quote characters in text, so pretty much all CSV-handling software out there will report a malformed CSV file or import data to the wrong columns - so this makes it completely unsuitable for use with Excel.
mysqlsh
):mysqldump
run locally on the MySQL Server itself (but you can use an ssh
session, of course).
mysqlx://user@host/schema
) is not supported by MySQL 5.7, but mysqlsh
supports non-X connections with old-style command-line parameters.\connect
command to connect.
For MySQL 5.7 use \connect mysql://username@hostname
For MySQL 8.0+ there are a variety of ways to connect, including the "MySQL X" protocol as well as "Classic" connections. Consult the docs for more info.
If your username contains literal @
characters then you need to percent-encode them (e.g. if you're using Azure MySQL then your full username will be like username%40servername@servername.mysql.database.azure.com
).
Immediately after you submit the \connect
command you will be prompted for your password interactively.
mysqlsh
with arguments, then you can run mysqlsh --user="userName" --host="hostName" --port=3306 --schema="dbName"
directly without using the \connect
command.util.exportTable(tableName, outputUri, options)
command with the following arguments:
tableName
: your table name.
WHERE
filter or export the results of a SELECT
query, (though as with mysqldump
you could always save your query results to a new TABLE
, then export that table, then DROP TABLE
when you're done with it. Remember that TEMPORARY TABLE
won't work here as tables created in one session aren't visible from any other session - and mysqlsh
will have its own session.outputUri
: To save the file locally use a file:///
URI.
file:///C:/Users/Me/Desktop/export.csv
.options
: To ensure compatibility with Excel specify { dialect: "csv", fieldsEscapedBy: ""}
.
dialect: "csv"
option sets Excel-compatible defaults for all-but-one of the OUTFILE
parameters, so you must also specify fieldsEscapedBy: ""
, otherwise SQL NULL
will be be rendered as \N
(literally) while double-quotes and line-breaks inside text values will be backslash-escaped, which Excel doesn't support.Good Example can be when incase of writing it after the end of your query if you have joins or where close :
select 'idPago','fecha','lead','idAlumno','idTipoPago','idGpo'
union all
(select id_control_pagos, fecha, lead, id_alumno, id_concepto_pago, id_Gpo,id_Taller,
id_docente, Pagoimporte, NoFactura, FacturaImporte, Mensualidad_No, FormaPago,
Observaciones from control_pagos
into outfile 'c:\\data.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n');
Use the below query:
SELECT * FROM document INTO OUTFILE 'c:/order-1.csv' FIELDS TERMINATED BY ','
ENCLOSED BY '"' LINES TERMINATED BY '\n';
In my case, I need to dump the sql result into a file on the client side. This is the most typical use case to off load data from the database. In many situations, you don't have access to the server or don't want to write your result to the server.
mysql -h hostname -u username -ppwd -e "mysql simple sql statement that last for less than a line" DATABASE_NAME > outputfile_on_the.client
The problem comes when you have a complicated query that last for several lines; you cannot use the command line to dump the result to a file easily. In such cases, you can put your complicated query into a file, such as longquery_file.sql, then execute the command.
mysql -h hn -u un -ppwd < longquery_file.sql DBNAME > output.txt
This worked for me. The only difficulty with me is the tab character; sometimes I use for group_cancat(foo SEPARATOR 0x09) will be written as '\t' in the output file. The 0x09 character is ASCII TAB. But this problem is not particular to the way we dump sql results to file. It may be related to my pager. Let me know when you find an answer to this problem. I will update this post.
The quick and dirty way I use to export mysql output to a file is
$ mysql <database_name> --tee=<file_path>
and then use the exported output (which you can find in <file_path>
) wherever I want.
Note that this is the only way you have in order to avoid databases running using the secure-file-priv
option, which prevents the usage of INTO OUTFILE
suggested in the previous answers:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
SHOW DATABASES
and SHOW TABLES
The INTO OUTFILE
thing won't work for SHOW TABLES
and SHOW DATABASES
query.
In that case you could do:
SHOW DATABASES
mysql -u <user> -p <password> -e 'SHOW DATABASES' > <path_to_file>
SHOW TABLES
mysql -u <user> -p <password> -e 'SHOW TABLES FROM <db_name>' > <path_to_file>
Tip: The
-e
flag stands forexecute
References:
In my case, INTO OUTFILE
didn't work as the MySQL user was different than the logged-in user. Also, I couldn't use inline variant as the my query was quite big.
I ended up using this and it was so much easier. This probably won't support CSV or either output, but if you need output as it is, this will work.
mysql> tee /tmp/my.out;
Source: https://alvinalexander.com/mysql/how-save-output-mysql-query-file/
I only have client-side access, but were unable to run util.exportTable
, so I used:
mysql --default-character-set=utf8mb4 -uUSERNAME -pSECRET -P3306 -hHOSTNAME -Ddatabase_name -e "SELECT * FROM table_name;" | sed 's/\t/","/g;s/^/"/;s/$/"/;' | sed 's/""""/""/g;' > output.csv
This is an old question, but it's still one of the first results on Google. The fastest way to do this is to link MySQL directly to Excel using ODBC queries or MySQL For Excel. The latter was mentioned in a comment to the OP, but I felt it really deserved its own answer because exporting to CSV is not the most efficient way to achieve this.
ODBC Queries - This is a little bit more complicated to setup, but it's a lot more flexible. For example, the MySQL For Excel add-in doesn't allow you to use WHERE
clauses in the query expressions. The flexibility of this method also allows you to use the data in more complex ways.
MySQL For Excel - Use this add-in if you don't need to do anything complex with the query or if you need to get something accomplished quickly and easily. You can make views in your database to workaround some of the query limitations.