文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙尺寸) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  SELECT ... INTO 陳述式

15.2.13.1 SELECT ... INTO 陳述式

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 var_list 語句中,僅允許使用者定義的變數;請參閱第 15.6.4.2 節「本機變數範圍和解析」。)

  • 選定的值會指派給變數。變數的數量必須與欄位的數量相符。查詢應傳回單一列。如果查詢未傳回任何列,則會發生錯誤碼 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 OUTFILELOAD DATA 的補充。欄位值會寫入並轉換為 CHARACTER SET 子句中指定的字元集。如果沒有此類子句,則會使用 binary 字元集傾印值。實際上,沒有字元集轉換。如果結果集包含多個字元集中的欄位,則輸出資料檔案也是如此,並且可能無法正確重新載入檔案。

語句的 export_options 部分的語法由與 LOAD DATA 語句一起使用的相同 FIELDSLINES 子句組成。如需關於 FIELDSLINES 子句(包括其預設值和允許值)的資訊,請參閱第 15.2.9 節「LOAD DATA 語句」

FIELDS ESCAPED BY 控制如何寫入特殊字元。如果 FIELDS ESCAPED BY 字元不為空,則在必要時會作為前置詞使用,以避免輸出時的歧義,該前置詞會放在以下字元之前

  • FIELDS ESCAPED BY 字元

  • FIELDS [OPTIONALLY] ENCLOSED BY 字元

  • FIELDS TERMINATED BYLINES TERMINATED BY 值的第一个字元

  • ASCII NUL(零值位元組;在跳脫字元之後實際寫入的是 ASCII 0,而不是零值位元組)

FIELDS TERMINATED BYENCLOSED BYESCAPED BYLINES TERMINATED BY 字元必須跳脫,以便您可以可靠地重新讀取檔案。跳脫 ASCII NUL 是為了更容易使用某些分頁器檢視。

結果檔案不需要符合 SQL 語法,因此不需要跳脫其他任何內容。

如果 FIELDS ESCAPED BY 字元為空,則不會跳脫任何字元,並且 NULL 會輸出為 NULL,而不是 \N。指定空白的跳脫字元可能不是一個好主意,尤其是在您的資料中的欄位值包含剛剛給定的清單中的任何字元時。

當您想要將表格的所有欄位傾印到文字檔案時,INTO OUTFILE 也可以與 TABLE 語句一起使用。在這種情況下,可以使用 ORDER BYLIMIT 控制列的排序和數量;這些子句必須在 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 OUTFILEVALUES 語句一起使用,將值直接寫入檔案。此處顯示了一個範例

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 table_alias [LIMIT 1] 一起使用。請參閱第 15.2.19 節「VALUES 語句」

注意

INTO OUTFILEINTO DUMPFILE 建立的任何檔案都歸屬於執行 mysqld 的帳戶下的作業系統使用者。(因為這個原因以及其他原因,您絕對不應root 身分執行 mysqld。)檔案建立的 umask 為 0640;您必須具有足夠的存取權限才能操作檔案內容。

如果 secure_file_priv 系統變數設定為非空白的目錄名稱,則要寫入的檔案必須位於該目錄中。

在由事件排程器執行的事件一部分發生的 SELECT ... INTO 語句的上下文中,診斷訊息(不僅是錯誤,還有警告)會寫入錯誤記錄檔,並且在 Windows 上,會寫入應用程式事件記錄檔。如需其他資訊,請參閱第 27.4.5 節「事件排程器狀態」

支援對由 SELECT INTO OUTFILESELECT INTO DUMPFILE 寫入的輸出檔案進行定期同步,可透過設定該版本中引入的 select_into_disk_sync 伺服器系統變數來啟用。輸出緩衝區大小和可選延遲時間可以分別使用 select_into_buffer_sizeselect_into_disk_sync_delay 來設定。更多資訊,請參閱這些系統變數的說明。