文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙尺寸) - 40.0Mb
PDF (A4尺寸) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  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 版本中將會移除對它的支援。換句話說,INTOFROM 之後但在 SELECT 結尾之前會產生警告。

不應在巢狀 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.5.5 節,「事件排程器狀態」

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