SELECT ... INTO
形式的 SELECT
允許將查詢結果儲存在變數中或寫入檔案
SELECT ... INTO
選取欄位值並將其儲存到變數中。var_list
SELECT ... INTO OUTFILE
將選取的列寫入檔案。可以指定欄位和行終止符以產生特定的輸出格式。SELECT ... INTO DUMPFILE
將單一列寫入檔案,不進行任何格式化。
給定的 SELECT
陳述式最多只能包含一個 INTO
子句,儘管如 SELECT
語法描述 (請參閱 第 15.2.13 節「SELECT 陳述式」) 所示,INTO
可以出現在不同的位置
在
FROM
之前。範例SELECT * INTO @myvar FROM t1;
在尾隨的鎖定子句之前。範例
SELECT * FROM t1 INTO @myvar FOR UPDATE;
在
SELECT
結尾處。範例SELECT * FROM t1 FOR UPDATE INTO @myvar;
語句結尾的 INTO
位置是建議的位置。鎖定子句之前的位置已被棄用;預計在未來版本的 MySQL 中會移除對它的支援。換句話說,在 FROM
之後但在 SELECT
結尾之前的 INTO
會產生警告。
不應在巢狀 SELECT
中使用 INTO
子句,因為此類 SELECT
必須將結果傳回外部內容。在 UNION
語句中使用 INTO
也有限制;請參閱第 15.2.18 節「UNION 子句」。
對於 INTO
變體var_list
var_list
指定一個或多個變數的清單,其中每個變數可以是使用者定義的變數、預存程序或函數參數,或是預存程式的本機變數。(在預備的SELECT ... INTO
語句中,僅允許使用者定義的變數;請參閱第 15.6.4.2 節「本機變數範圍和解析」。)var_list
選定的值會指派給變數。變數的數量必須與欄位的數量相符。查詢應傳回單一列。如果查詢未傳回任何列,則會發生錯誤碼 1329 的警告(
No data
),並且變數值保持不變。如果查詢傳回多列,則會發生錯誤 1172(Result consisted of more than one row
)。如果語句可能會擷取多列,您可以使用LIMIT 1
將結果集限制為單一列。SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
INTO
也可以與 var_list
TABLE
語句一起使用,但須遵守以下限制
變數的數量必須與表格中的欄位數量相符。
如果表格包含多個列,則必須使用
LIMIT 1
將結果集限制為單一列。LIMIT 1
必須在INTO
關鍵字之前。
此處顯示了此類語句的範例
TABLE employees ORDER BY lname DESC LIMIT 1
INTO @id, @fname, @lname, @hired, @separated, @job_code, @store_id;
您也可以從產生單一列的 VALUES
語句中選取值,放入一組使用者變數中。在這種情況下,您必須使用表格別名,並且必須將值清單中的每個值指派給一個變數。此處顯示的兩個語句中的每一個都等同於 SET @x=2, @y=4, @z=8
SELECT * FROM (VALUES ROW(2,4,8)) AS t INTO @x,@y,@z;
SELECT * FROM (VALUES ROW(2,4,8)) AS t(a,b,c) INTO @x,@y,@z;
使用者變數名稱不區分大小寫。請參閱第 11.4 節「使用者定義的變數」。
SELECT ... INTO OUTFILE '
形式的 file_name
'SELECT
會將選取的列寫入檔案。檔案是在伺服器主機上建立的,因此您必須具有 FILE
權限才能使用此語法。file_name
不能是現有檔案,這除了其他用途之外,還可以防止修改諸如 /etc/passwd
之類的檔案和資料庫表格。 character_set_filesystem
系統變數控制檔案名稱的解譯。
SELECT ... INTO OUTFILE
語句旨在啟用將表格傾印到伺服器主機上的文字檔案。若要在其他主機上建立結果檔案,SELECT ... INTO OUTFILE
通常不適合,因為除非可以使用伺服器主機檔案系統上的網路對應路徑來存取遠端主機上檔案的位置,否則無法寫入相對於伺服器主機檔案系統的檔案路徑。
或者,如果遠端主機上已安裝 MySQL 用戶端軟體,您可以使用用戶端命令(例如 mysql -e "SELECT ..." >
)在該主機上產生檔案。file_name
SELECT ... INTO OUTFILE
是 LOAD DATA
的補充。欄位值會寫入並轉換為 CHARACTER SET
子句中指定的字元集。如果沒有此類子句,則會使用 binary
字元集傾印值。實際上,沒有字元集轉換。如果結果集包含多個字元集中的欄位,則輸出資料檔案也是如此,並且可能無法正確重新載入檔案。
語句的 export_options
部分的語法由與 LOAD DATA
語句一起使用的相同 FIELDS
和 LINES
子句組成。如需關於 FIELDS
和 LINES
子句(包括其預設值和允許值)的資訊,請參閱第 15.2.9 節「LOAD DATA 語句」。
FIELDS ESCAPED BY
控制如何寫入特殊字元。如果 FIELDS ESCAPED BY
字元不為空,則在必要時會作為前置詞使用,以避免輸出時的歧義,該前置詞會放在以下字元之前
FIELDS ESCAPED BY
字元FIELDS [OPTIONALLY] ENCLOSED BY
字元FIELDS TERMINATED BY
和LINES TERMINATED BY
值的第一个字元ASCII
NUL
(零值位元組;在跳脫字元之後實際寫入的是 ASCII0
,而不是零值位元組)
FIELDS TERMINATED BY
、ENCLOSED BY
、ESCAPED BY
或 LINES TERMINATED BY
字元必須跳脫,以便您可以可靠地重新讀取檔案。跳脫 ASCII NUL
是為了更容易使用某些分頁器檢視。
結果檔案不需要符合 SQL 語法,因此不需要跳脫其他任何內容。
如果 FIELDS ESCAPED BY
字元為空,則不會跳脫任何字元,並且 NULL
會輸出為 NULL
,而不是 \N
。指定空白的跳脫字元可能不是一個好主意,尤其是在您的資料中的欄位值包含剛剛給定的清單中的任何字元時。
當您想要將表格的所有欄位傾印到文字檔案時,INTO OUTFILE
也可以與 TABLE
語句一起使用。在這種情況下,可以使用 ORDER BY
和 LIMIT
控制列的排序和數量;這些子句必須在 INTO OUTFILE
之前。TABLE ... INTO OUTFILE
支援與 SELECT ... INTO OUTFILE
相同的 export_options
,並且受到對檔案系統寫入的相同限制。此處顯示了此類語句的範例
TABLE employees ORDER BY lname LIMIT 1000
INTO OUTFILE '/tmp/employee_data_1.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', ESCAPED BY '\'
LINES TERMINATED BY '\n';
您也可以將 SELECT ... INTO OUTFILE
與 VALUES
語句一起使用,將值直接寫入檔案。此處顯示了一個範例
SELECT * FROM (VALUES ROW(1,2,3),ROW(4,5,6),ROW(7,8,9)) AS t
INTO OUTFILE '/tmp/select-values.txt';
您必須使用表格別名;也支援欄位別名,並且可以選擇性地使用它們來僅寫入所需欄位的值。您也可以使用 SELECT ... INTO OUTFILE
支援的任何或所有匯出選項來格式化輸出到檔案的內容。
這是一個產生許多程式使用的逗號分隔值 (CSV) 格式檔案的範例
SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
如果您使用 INTO DUMPFILE
而不是 INTO OUTFILE
,MySQL 只會將單一列寫入檔案,而不執行任何欄位或行終止,也不執行任何跳脫處理。這對於選取 BLOB
值並將其儲存在檔案中非常有用。
TABLE
也支援 INTO DUMPFILE
。如果表格包含多個列,您還必須使用 LIMIT 1
將輸出限制為單一列。INTO DUMPFILE
也可以與 SELECT * FROM (VALUES ROW()[, ...]) AS
一起使用。請參閱第 15.2.19 節「VALUES 語句」。table_alias
[LIMIT 1]
由 INTO OUTFILE
或 INTO DUMPFILE
建立的任何檔案都歸屬於執行 mysqld 的帳戶下的作業系統使用者。(因為這個原因以及其他原因,您絕對不應以 root
身分執行 mysqld。)檔案建立的 umask 為 0640;您必須具有足夠的存取權限才能操作檔案內容。
如果 secure_file_priv
系統變數設定為非空白的目錄名稱,則要寫入的檔案必須位於該目錄中。
在由事件排程器執行的事件一部分發生的 SELECT ... INTO
語句的上下文中,診斷訊息(不僅是錯誤,還有警告)會寫入錯誤記錄檔,並且在 Windows 上,會寫入應用程式事件記錄檔。如需其他資訊,請參閱第 27.4.5 節「事件排程器狀態」。
支援對由 SELECT INTO OUTFILE
和 SELECT INTO DUMPFILE
寫入的輸出檔案進行定期同步,可透過設定該版本中引入的 select_into_disk_sync
伺服器系統變數來啟用。輸出緩衝區大小和可選延遲時間可以分別使用 select_into_buffer_size
和 select_into_disk_sync_delay
來設定。更多資訊,請參閱這些系統變數的說明。