MySQL?如何將查詢結(jié)果導(dǎo)出到文件(select?…?into?Statement)
我們經(jīng)常會遇到需要將SQL查詢結(jié)果導(dǎo)出到文件,以便后續(xù)的傳輸或數(shù)據(jù)分析的場景。為了滿足這個需求,MySQL的select語句提供了into子句可以將的查詢結(jié)果直接導(dǎo)出到文本文件。本文就MySQL中select…into的用法進行演示。
一、select…into語句簡介
select…into語句不僅僅能夠?qū)⒉樵兘Y(jié)果導(dǎo)出到csv文件,實際上它有3種用法:
- select … into @var_list from …. 將查詢結(jié)果寫入到一組變量
- select … into outfile from …. 將數(shù)據(jù)寫入操作系統(tǒng)文件,可以自定義數(shù)據(jù)格式(分隔符、包裹符、轉(zhuǎn)義符、換行符等)。
- select … into dumpfile from …. 將單一行寫入文件,沒有任何格式化
1.1 基本語法
根據(jù)官方文檔,into子句可以出現(xiàn)在以下3個位置。雖然3個位置都符合語法,但select語句中至多只能有1個into語句(位置三選一):
- 查詢字段之后,from子句前
- 鎖定子句前(未來版本即將廢棄)
- 語句的最后
這里推薦將into子句放在位置3,即語句的末尾,這樣相對普通的select語句更為接近,更容易理解,后面的示例也將采用這種寫法。
二、用法示例
下面演示into子句三種用法。
2.1 將查詢結(jié)果保存到變量
into子句的一個常用場景就是將查詢結(jié)果暫時保存到變量中,以便后續(xù)查詢或使用,唯二要注意的點是變量的數(shù)量要和返回列數(shù)量匹配,并且最多只能返回一行數(shù)據(jù)。
以示例數(shù)據(jù)庫employees中的employees表為例,查詢3個結(jié)果,分別保存到3個變量中:
select emp_no,first_name,hire_date from employees limit 1 into @emp_no, @first_name, @hire_date; select @emp_no, @first_name, @hire_date;
這里用limit 1子句限制返回的結(jié)果只有1行,否則會報錯。
2.2 將查詢結(jié)果保存到文本文件
into outfile子句可以將查詢結(jié)果導(dǎo)出到文本文件,雖然并不一定要是CSV格式,但大多數(shù)情況下我們都會選擇這種格式。
要將MySQL中的數(shù)據(jù)寫入到操作系統(tǒng)的文件中, 首先需要具有FILE權(quán)限。而且為了安全需要配置參數(shù)secure_file_priv,這個參數(shù)是限制MySQL可以寫入文件的目錄:
show variables like 'secure_file_priv';
我們在普通的select語句最后添加into outfile ‘/path/file_name’;即可將查詢結(jié)果寫入文件,這里的path就是參數(shù)secure_file_priv定義的目錄(文件不能已存在):
select *from employees where emp_no<=10010 into outfile '/opt/mysql8.0.35/mysql-files/employees.txt';
下面是導(dǎo)出文件內(nèi)容,其實into outfile文件還隱式在后面附件了2個子句:
fields terminated by '\t' enclosed by '' escaped by '\\' lines terminated by '\n' starting by ''
- fields 表示字段屬性,terminated by ‘\t’ 以制表符分割字段,enclosed by ‘’ 不包裹字段,escaped by ‘\\’ 反斜線表示轉(zhuǎn)義符(這里2個反斜線,第一個是轉(zhuǎn)義符,第二個是反斜線)
- lines 表示行屬性,terminated by ‘\n’ \n代表換行符,starting by ‘’ 行的起點字符是空。
如果要導(dǎo)出CSV格式的文件,并且以雙引號"包裹字段,那么只需要增加一個fields terminated by ‘,’ enclosed by '"'子句即可,其他的保持默認(rèn):
select *from employees where emp_no<=10010 into outfile '/opt/mysql8.0.35/mysql-files/employees.csv' fields terminated by ',' encolsed by '"';
可以看到這次導(dǎo)出結(jié)果就是以逗號分割,以雙引號包裹字段的數(shù)據(jù):
2.3 將查詢結(jié)果保存到dumpfile
into dumpfile 子句可以將一行數(shù)據(jù)導(dǎo)出到文件,但是它不會做任何的分割,格式的定義,轉(zhuǎn)義等操作。相對應(yīng)用場景較少,這個操作通常用于將大型的BLOB字段保存到文件中,了解即可:
select *from employees limit 1 into dumpfile '/opt/mysql8.0.35/mysql-files/employees.dump';
注意select語句只能返回一行結(jié)果,否則會報錯。
導(dǎo)出的結(jié)果如下,可以看到數(shù)據(jù)沒有任何分隔,都連在了一起,連換行都沒有(提示符和數(shù)據(jù)顯示在同一行):
到此這篇關(guān)于MySQL 將查詢結(jié)果導(dǎo)出到文件(select … into Statement)的文章就介紹到這了,更多相關(guān)mysql查詢結(jié)果導(dǎo)出到文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL8.0創(chuàng)建用戶和權(quán)限控制示例詳解
這篇文章主要為大家介紹了MySQL8.0創(chuàng)建用戶和權(quán)限控制實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07