1. 程式人生 > >MySQL執行Select語句將結果匯出到檔案的方法

MySQL執行Select語句將結果匯出到檔案的方法

 

 

如果是對MySQL整個表資料匯出,可以參照文章:http://www.crazyant.net/1355.html

然而也會遇到的場景是,需要執行一個SQL語句,然後將SQL語句的結果輸出到檔案;

方法一:使用MySQL的select * into outfile ‘/tmp/rs.txt’ from tb_name句型

這是個不可行的方法;

舉個例子,執行以下的SQL語句:

   
1 mysql -h10.10.10.10 -ucrazyant -p123456 -P3306 -e "use test; select * into outfile '/tmp/rs.txt' from tb_test;"

這個SQL總會報出下面的錯誤:

   
1 ERROR1045(28000)atline1:Accessdeniedforuser'crazyant'@'10.10.10.10'(usingpassword:YES)

原因是這個語句並不是在MySQL客戶端,而是在MySQL的伺服器上執行的,通常用於伺服器管理員在伺服器機器上進行資料備份使用,由於MySQL客戶端賬號並沒有訪問伺服器機器本身的許可權,所以這個SQL執行不會成功。

方法2:直接將SQL執行的結果重定向到檔案即可

執行下面的命令,能夠將SQL語句執行的結果輸出到檔案:

   
1 mysql -h10.10.10.10 -ucrazyant -p123456 -P3306 -Ne "use test; select * from tb_test;" > /tmp/rs.txt

其中-Ne是執行這個SQL語句的選項,-N代表輸出SQL語句執行結果中不帶第一行的欄位名稱,-e表示要執行SQL語句;

執行下面的命令,則可以執行SQL檔案,並把結果輸出到檔案:

新建一個檔案,名稱為runsql.sql,內容為:

   
1 usetest;select *fromdb_test;

然後這樣執行命令:

   
1 mysql-h10.10.10.10-ucrazyant-p123456-P3306-N<runsql.sql/tmp/rs.txt

其中-N命令仍然表示不輸出表頭欄位說明(第一行),小於號表示輸入重定向,runsql.sql的檔案內容會被髮送給mysql的命令,大於號則表示輸出重定向,會將命令執行的結果輸出到檔案;


匯出csv檔案,逗號分隔符:

   
1 mysql-h10.10.10.10-ucrazyant-p123456-P3306-N<runsql.sql | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > /tmp/rs.txt

總結:

  • select into outfile只能在MySQL伺服器上執行,客戶端上無法執行;
  • mysql -Ne “sql” > rs.txt可以將SQL語句執行後輸出為檔案
  • mysql -N < runsql.sql > rs.txt可以執行sql檔案中的內容,然後將結果輸出到檔案;
  • mysql -N的選項,表示輸出時不帶表頭