web-dev-qa-db-ja.com

MySQLテーブルをcsvファイルにエクスポートする

MySQLテーブルがあり、csvファイルとして取り出す必要があります。使用したクエリは

SELECT "ID","NAME","SALARY","SAL1","SAL2","SAL3","SAL4","SAL5","SAL6","SAL7","SAL8","SAL9","SAL10","SAL11","SAL12","SAL13","SAL14","SAL15","SAL16","SAL17","SAL18","SAL19","SAL20","SAL21","SAL22","SAL23","SAL24","SAL25","SAL26"
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

このクエリは機能しますが、列名が200個ある場合はどうなりますか?手動で入力せずにそれを行う方法はありますか?

24
user3304713

このコマンドはほとんどあなたが望むものを提供し、リモートサーバーでも動作します。唯一の注意点は、TSVファイルを生成することです(フィールドはタブで区切られます)。

mysql mydb -e "select * from mytable" -B > mytable.tsv 

ただし、 this answer で提案されているように、sedを使用してCSVに変換できます。

mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv
53
Rems
DESCRIBE addstock25;

最初の列とその列の最初の3つのエントリを削除します(使用方法によって異なります)。 addstock25のフィールドのリストを取得します。

これにより、情報スキーマと呼ばれるコアで派生した仮想テーブルを使用したフィールド名のみが表示されます。

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='foo';

このクエリの名前がsq_fieldnamelistになるとしましょう

したがって、上記のテーブルには1つの列があり、「foo」テーブルのフィールド名があります。

このように直接書く場合

    SELECT (sq_fieldnamelist)
    UNION ALL
    SELECT *
    FROM addstock25
    INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n

Mysqlはエラーを出します。 「サブクエリは複数の行を返します」

Sq_fieldnamelistを編集して、コンマで区切られたすべてのエントリを連続して連結する必要があります。

Select GROUP_CONCAT(COLUMN_NAME)
FROM
(SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='ffd_companies'
LIMIT 3,100
) AS fafa
GROUP BY 'COLUMN_NAME' // this group by is just to make group concat work

これがsq_fieldnamelist2だとしましょう

このようにsq_fieldnamelistを編集した場合。すべてのフィールド名がコンマで区切られた1つの値のみを返します。したがって、必要なフィールドを取得するために、このサブクエリをselectステートメントに追加できます。

SELECT (sq_fieldnamelist2)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

目的に合わせて、sq_fieldnamelist2のLIMIT 3,100を編集する必要があります。

あなたのテーブルがfil1、fil2 ... filN、sal1、sal2、sal3 ....、salIのようであると言って、LIMIT N,x>I+N。すべてを使用する場合は、LIMIT 0,x>N+I

4
user2102266

どうしてできないのかわからない

SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

2
pacifist

単純なUIベースのコードのスクリプトを統合しました。ここでクエリを入力し、列名を含むすべての行を含むcsvファイルを取得できます。

このスクリプトは、WindowsシステムとLinuxシステムの両方で機能します。

https://github.com/Bihari12/databasetocsv

これにより、コードが存在する同じフォルダー内のcsvファイルに結果が保存されます。

1

このようなものを探していると思います。

    SET @sql = NULL;
        SELECT GROUP_CONCAT("'",COLUMN_NAME,"'")
          FROM
        (SELECT `COLUMN_NAME`
        FROM `INFORMATION_SCHEMA`.`COLUMNS` 
        WHERE `TABLE_SCHEMA` = 'yourdatabasename'
        and `TABLE_NAME`='ffd_companies'
        ) AS colnames
        GROUP BY 'COLUMN_NAME' 
        into @sql;

        SET @sql = concat ("SELECT", @sql, " from dual
        UNION ALL
        SELECT *
        FROM addstock25
        INTO OUTFILE 'E:\\JOSE DATA\\addstock7.csv'
        FIELDS TERMINATED BY ','
        ENCLOSED BY '", '"',"'
        )"
        );

        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

これがお役に立てば幸いです。

注:WHERE句TABLE_SCHEMA = 'yourdatabasename'を追加します

1
Oscar Rovira