Câu trả lời:
Bạn sẽ phải tự mình viết mã những tiêu đề đó. Cái gì đó như:
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
FROM YourTable
INTO OUTFILE '/path/outfile'
Giải pháp được cung cấp bởi Joe Steanelli có hiệu quả, nhưng việc tạo danh sách các cột là bất tiện khi hàng chục hoặc hàng trăm cột có liên quan. Đây là cách lấy danh sách cột của bảng my_table trong 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
Bây giờ bạn có thể sao chép và dán hàng kết quả làm câu lệnh đầu tiên trong phương thức của Joe.
ORDER BY ORDINAL_POSITION
xử lý điều đó
GROUP_CONCAT(CONCAT('"',COLUMN_NAME,'"') order BY ORDINAL_POSITION)
Đối với lựa chọn phức tạp với ORDER BY, tôi sử dụng như sau:
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';
Bạn có thể sử dụng câu lệnh đã soạn sẵn với câu trả lời của lucek và xuất bảng động với tên cột trong 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;
Cảm ơn lucek.
Điều này sẽ cho bạn biết các cột có thứ tự và / hoặc một giới hạn
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
FROM YourTable order by ColName1 limit 3) a
INTO OUTFILE '/path/outfile';
Query OK, 100 rows affected (14.72 sec)
Thứ hai vượt qua với bạnQuery OK, 101 rows affected (0.00 sec)
Tôi chỉ cần thực hiện 2 truy vấn, đầu tiên để nhận kết quả truy vấn (giới hạn 1) với tên cột (không có mã cứng, không có vấn đề với Nối, Thứ tự theo, tên cột tùy chỉnh, v.v.) và thứ hai để tự tạo truy vấn và kết hợp các tệp thành một CSV tập tin:
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
Tôi gặp phải vấn đề tương tự khi thực hiện truy vấn mysql trên các bảng lớn trong NodeJS. Cách tiếp cận mà tôi đã làm theo để đưa tiêu đề vào tệp CSV của mình như sau
Sử dụng truy vấn OUTFILE để chuẩn bị tệp không có tiêu đề
SELECT * INTO OUTFILE [FILE_NAME] FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED
BY '\"' LINES TERMINATED BY '\n' FROM [TABLE_NAME]
Tìm nạp tiêu đề cột cho bảng được sử dụng trong điểm 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
Nối các tiêu đề cột vào tệp được tạo ở bước 1 bằng cách thêm gói npm trước tệp
Việc thực thi từng bước được kiểm soát bằng các lời hứa trong NodeJS.
Đây là một cheat thay thế nếu bạn đã quen thuộc với Python hoặc R và bảng của bạn có thể vừa với bộ nhớ.
Nhập bảng SQL vào Python hoặc R và sau đó xuất từ đó dưới dạng CSV và bạn sẽ nhận được tên cột cũng như dữ liệu.
Đây là cách tôi thực hiện bằng cách sử dụng R, yêu cầu thư viện 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')
Đó là một chút gian lận nhưng tôi thấy đây là một giải pháp nhanh chóng khi số lượng cột của tôi quá dài để sử dụng phương pháp concat ở trên. Lưu ý: R sẽ thêm cột 'row.names' ở đầu CSV, vì vậy bạn sẽ muốn bỏ cột đó nếu bạn cần dựa vào CSV để tạo lại bảng.
Vì vậy, nếu tất cả các cột trong my_table
là kiểu dữ liệu ký tự , chúng ta có thể kết hợp các câu trả lời hàng đầu (của Joe, matt và evilguc) với nhau, để tự động thêm tiêu đề trong một truy vấn SQL 'đơn giản', ví dụ:
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';
trong đó vài dòng cuối cùng tạo ra csv.
Lưu ý rằng điều này có thể chậm nếu my_table
rất lớn.
Trên thực tế, bạn có thể làm cho nó hoạt động ngay cả với ORDER BY.
Chỉ cần một số thủ thuật theo thứ tự theo câu lệnh - chúng tôi sử dụng câu lệnh trường hợp và thay thế giá trị tiêu đề bằng một số giá trị khác được đảm bảo sắp xếp đầu tiên trong danh sách (rõ ràng điều này phụ thuộc vào loại trường và bạn đang sắp xếp ASC hay DESC)
Giả sử bạn có ba trường, name (varchar), is_active (bool), date_something_happens (date) và bạn muốn sắp xếp hai trường thứ hai giảm dần:
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
Vì chức năng 'bao gồm tiêu đề' dường như chưa được tích hợp sẵn và hầu hết các "giải pháp" ở đây cần phải nhập tên cột theo cách thủ công và / hoặc thậm chí không tính đến các liên kết, tôi khuyên bạn nên giải quyết vấn đề .
Giải pháp thay thế tốt nhất mà tôi tìm thấy cho đến nay là sử dụng một công cụ tốt (tôi sử dụng HeidiSQL ).
Đặt yêu cầu của bạn, chọn lưới, chỉ cần nhấp chuột phải và xuất thành tệp. Nó có tất cả các tùy chọn cần thiết để xuất khẩu sạch sẽ, đáp ứng được hầu hết các nhu cầu.
Cùng ý tưởng, cách tiếp cận của user3037511 hoạt động tốt và có thể được tự động hóa dễ dàng .
Chỉ cần khởi chạy yêu cầu của bạn bằng một số dòng lệnh để lấy tiêu đề của bạn. Bạn có thể lấy dữ liệu bằng CHỌN VÀO ĐẦU RA ... hoặc bằng cách chạy truy vấn không giới hạn, quyền chọn của bạn.
Lưu ý rằng chuyển hướng đầu ra đến một tệp hoạt động giống như một sự quyến rũ trên cả Linux VÀ Windows.
Điều này khiến tôi muốn làm nổi bật rằng 80% thời gian, khi tôi muốn sử dụng CHỌN TỪ INFILE hoặc CHỌN VÀO OUTFILE, tôi lại sử dụng một thứ khác do một số hạn chế (ở đây, sự vắng mặt của 'tùy chọn tiêu đề', trên AWS-RDS, các quyền còn thiếu, v.v.)
Do đó, tôi không trả lời chính xác cho câu hỏi của op ... nhưng nó sẽ đáp ứng nhu cầu của anh ấy :)
EDIT: và để thực sự trả lời câu hỏi của anh ấy: không
Kể từ 2017-09-07, bạn chỉ không thể bao gồm tiêu đề nếu bạn dính với lệnh SELECT INTO OUTFILE : |
một ví dụ từ cảm biến tên bảng cơ sở dữ liệu của tôi với các cột (id, thời gian, đơn vị)
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
Tôi đang viết mã của mình bằng PHP và gặp một chút khó khăn khi sử dụng các hàm concat và union, đồng thời cũng không sử dụng các biến SQL, bất kỳ cách nào tôi có thể làm cho nó hoạt động, đây là mã của tôi:
//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);
Đây là một cách để lấy động tiêu đề tiêu đề từ tên cột.
/* 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;
Tôi muốn thêm vào câu trả lời do Sangam Belose cung cấp. Đây là mã của anh ấy:
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
Tuy nhiên, nếu bạn chưa thiết lập "secure_file_priv"
các biến bên trong, nó có thể không hoạt động. Đối với điều đó, hãy kiểm tra thư mục được đặt trên biến đó bằng cách:
SHOW VARIABLES LIKE "secure_file_priv"
Đầu ra sẽ như thế này:
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)
Bạn có thể thay đổi biến này hoặc thay đổi truy vấn để xuất tệp ra đường dẫn mặc định hiển thị.
MySQL một mình không đủ để làm điều này một cách đơn giản. Dưới đây là một tập lệnh PHP sẽ xuất các cột và dữ liệu sang CSV.
Nhập tên cơ sở dữ liệu của bạn và các bảng ở gần đầu.
<?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() );
}
?>
Bạn sẽ cần đây là thư mục mà bạn muốn xuất ra. MySQL cần có khả năng ghi vào thư mục.
$path = '/var/lib/mysql/' . $tbl . '.csv';
Bạn có thể chỉnh sửa các tùy chọn xuất CSV trong truy vấn:
INTO OUTFILE "' . $path . '"
FIELDS TERMINATED BY ","
ENCLOSED BY "\""
LINES TERMINATED BY "\n"'
Ở cuối, có một lệnh gọi thực thi tới GZip CSV.
CHỌN 'ColName1', 'ColName2', 'ColName3' ĐOÀN KẾT TẤT CẢ CHỌN ColName1, ColName2, ColName3 TỪ YourTable INTO OUTFILE 'c: \\ datasheet.csv' CÁC LĨNH VỰC ĐƯỢC CHẤM DỨT BỞI ',' TÙY CHỌN ĐƯỢC CHO PHÉP BỞI '"' CÁC DÒNG ĐƯỢC CHẤM DỨT BỞI '\ n'
ORDER BY
trongSELECT
mệnh đề. Dòng tiêu đề có thể nằm ở bất kỳ đâu trong tệp được tạo tùy thuộc vào thứ tự.