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 版本中將會移除對它的支援。換句話說,INTO
在 FROM
之後但在 SELECT
結尾之前會產生警告。
不應在巢狀 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.5.5 節,「事件排程器狀態」。
支援定期同步由 SELECT INTO OUTFILE
和 SELECT INTO DUMPFILE
寫入的輸出檔案,可透過設定該版本中引入的 select_into_disk_sync
伺服器系統變數來啟用。輸出緩衝區大小和可選的延遲可以使用 select_into_buffer_size
和 select_into_disk_sync_delay
分別設定。如需更多資訊,請參閱這些系統變數的說明。