Ответы:
Вам придется самостоятельно жестко закодировать эти заголовки. Что-то вроде:
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
FROM YourTable
INTO OUTFILE '/path/outfile'
Решение, предложенное Джо Стеанелли, работает, но создание списка столбцов неудобно, когда задействованы десятки или сотни столбцов. Вот как получить список столбцов таблицы my_table в 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
Теперь вы можете скопировать и вставить полученную строку в качестве первого оператора в методе Джо.
ORDER BY ORDINAL_POSITION
ручки , которые
GROUP_CONCAT(CONCAT('"',COLUMN_NAME,'"') order BY ORDINAL_POSITION)
Для сложного выбора с 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';
Вы можете использовать подготовленный оператор с ответом Лучека и динамически экспортировать таблицу с именем столбца в 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;
Спасибо лучек.
Это позволит вам иметь упорядоченные столбцы и / или ограничение
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)
Второй проход с вашимQuery OK, 101 rows affected (0.00 sec)
Я просто делаю 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
Я столкнулся с аналогичной проблемой при выполнении запроса mysql для больших таблиц в NodeJS. Подход, который я использовал для включения заголовков в свой CSV-файл, выглядит следующим образом.
Используйте запрос OUTFILE для подготовки файла без заголовков
SELECT * INTO OUTFILE [FILE_NAME] FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED
BY '\"' LINES TERMINATED BY '\n' FROM [TABLE_NAME]
Получить заголовки столбцов для таблицы, использованной в пункте 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
Добавьте заголовки столбцов в файл, созданный на шаге 1, с помощью пакета npm prepend-file
Выполнение каждого шага контролировалось с помощью обещаний в NodeJS.
Это альтернативный чит, если вы знакомы с 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 добавит столбец «row.names» в начало CSV, поэтому вы захотите удалить его, если вам действительно нужно полагаться на CSV для воссоздания таблицы.
Итак, если все столбцы my_table
являются символьными данными , мы можем объединить главные ответы (Джо, Мэтт и Злогук) вместе, чтобы автоматически добавить заголовок в один «простой» 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
оно очень большое.
На самом деле вы можете заставить его работать даже с ORDER BY.
Просто нужна хитрость в операторе order by - мы используем оператор case и заменяем значение заголовка некоторым другим значением, которое гарантированно будет отсортировано первым в списке (очевидно, это зависит от типа поля и от того, сортируете ли вы 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
Поскольку функция 'include-headers', похоже, еще не встроена, и для большинства «решений» здесь необходимо вводить имена столбцов вручную и / или даже не принимать во внимание объединения, я бы рекомендовал обойти проблему .
Лучшая альтернатива, которую я нашел до сих пор, - это использование приличного инструмента (я использую HeidiSQL ).
Поместите свой запрос, выберите сетку, щелкните правой кнопкой мыши и экспортируйте в файл. В нем есть все необходимые параметры для чистого экспорта, и он должен удовлетворить большинство потребностей.
По той же идее подход user3037511 работает нормально и может быть легко автоматизирован .
Просто запустите свой запрос с помощью командной строки чтобы получить заголовки. Вы можете получить данные с помощью SELECT INTO OUTFILE ... или выполнив свой запрос без ограничений, на ваш выбор.
Обратите внимание, что перенаправление вывода в файл работает как шарм как в Linux, так и в Windows.
Это заставляет меня подчеркнуть, что в 80% случаев, когда я хочу использовать SELECT FROM INFILE или SELECT INTO OUTFILE, я в конечном итоге использую что-то еще из-за некоторых ограничений (здесь отсутствие параметров заголовков '' на AWS-RDS, отсутствующие права и т. д.)
Следовательно, я не совсем отвечаю на вопрос оператора ... но он должен отвечать его потребностям :)
РЕДАКТИРОВАТЬ: и на самом деле ответить на его вопрос: нет.
По состоянию на 2017-09-07 вы просто не можете включать заголовки, если вы придерживайтесь команды SELECT INTO OUTFILE : |
пример из моего датчика имени таблицы базы данных с столбцами (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
Я писал свой код на 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);
Вот способ динамического получения заголовков из имен столбцов.
/* 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 ('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)
Вы можете изменить эту переменную или изменить запрос, чтобы выводить файл по указанному по умолчанию пути.
Для этого недостаточно только 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"'
В конце есть вызов exec для GZip CSV.
ВЫБЕРИТЕ 'ColName1', 'ColName2', 'ColName3' СОЮЗ ВСЕ ВЫБЕРИТЕ ColName1, ColName2, ColName3 ОТ YourTable INTO OUTFILE 'c: \\ datasheet.csv' ПОЛЯ, ЗАКОНЧЕННЫЕ ',' ДОПОЛНИТЕЛЬНО ЗАКЛЮЧЕНЫ '"' СТРОКИ, ЗАКЛЮЧЕННЫЕ '\ n'
ORDER BY
вSELECT
пункте есть. Строка заголовка может быть где угодно в сгенерированном файле в зависимости от порядка.