MySQL的SQL語句 - 數據操做語句(12)- SELECT 語句(2)

SELECT ... INTO 語句html

SELECT 的 SELECT ... INTO 形式將查詢結果存儲在變量中或寫入文件:mysql

SELECT ... INTO var_list 選擇列值並將它們存儲到變量中。sql

SELECT ... INTO OUTFILE 將所選行寫入文件。能夠指定列和行終止符以生成特定的輸出格式。數據庫

SELECT ... INTO DUMPFILE 在沒有任何格式的狀況下將單行寫入文件。服務器

給定的 SELECT 語句最多能夠包含一個 INTO 子句,但如 SELECT 語法描述所示,INTO 能夠出如今不一樣的位置:網絡

● 在 FROM 以前。例如:ide

1. SELECT * INTO @myvar FROM t1;

● 在後面的鎖定子句以前。例子:函數

1. SELECT * FROM t1 INTO @myvar FOR UPDATE;

● 在 SELECT 語句的最後。例如:網站

1. SELECT * FROM t1 FOR UPDATE INTO @myvar;

從 MySQL 8.0.20 開始支持在語句末尾使用 INTO,而且是首選位置。從 MySQL 8.0.20 開始,不推薦使用鎖定子句以前使用 INTO,而且在未來的 MySQL 版本中將刪除對它的支持。換句話說,INTO 用於 FROM 以後而不是在 SELECT 語句的末尾將生成一個警告。操作系統

INTO 子句不該在嵌套的 SELECT 中使用,由於這樣的 SELECT 必須將其結果返回到外部上下文。在 UNION 語句中使用 INTO 也有一些限制。

對於INTO var_list 變量:

● var_list 列出一個或多個變量的列表,每一個變量能夠是用戶定義的變量、存儲過程或函數參數,或存儲程序局部變量。(在預編譯 SELECT ... INTO var_list 語句中,只容許使用用戶定義的變量。)

● 選定的值將分配給變量。變量數必須與列數匹配。查詢應該返回一行。若是查詢沒有返回任何行,則會出現錯誤代碼1329的警告(沒有數據),變量值保持不變。若是查詢返回多行,則出現錯誤1172(結果由多行組成)。若是語句可能檢索到多行,則可使用 LIMIT 1 將結果集限制爲一行。

1. SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;

INTO var_list 也能夠與 TABLE 語句一塊兒使用,但受如下約束限制:

● 變量數必須與表中的列數匹配。

● 若是表包含多行,則必須使用 LIMIT 1 將結果集限制爲單行。LIMIT 1 必須在 INTO 關鍵字以前。

下面是這樣一個語句的示例:

1. TABLE employees ORDER BY lname DESC LIMIT 1
2.     INTO @id, @fname, @lname, @hired, @separated, @job_code, @store_id;

VALUES 語句生成的單行記錄存儲到一組用戶變量中,也能夠從這些變量中選擇值。在這種狀況下,必須使用表別名,必須將值列表中的每一個值分配給變量。這裏顯示的兩個語句都至關於 SET @x=2, @y=4, @z=8:

1. SELECT * FROM (VALUES ROW(2,4,8)) AS t INTO @x,@y,@z;
2. 
3. SELECT * FROM (VALUES ROW(2,4,8)) AS t(a,b,c) INTO @x,@y,@z;

用戶變量名不區分大小寫。

SELECT 語句的 SELECT ... INTO OUTFILE 'file_name' 形式將所選行寫入文件。文件是在服務器主機上建立的,所以必須具備 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 子句中指定的字符集。若是不存在這樣的子句,則使用二進制字符集轉儲值。實際上,沒有字符集轉換。若是結果集包含多個字符集的列,則輸出數據文件也將包含這些列,而且可能沒法正確從新加載該文件。

語句的 export_options 部分的語法一樣也包含與 LOAD DATA 語句一塊兒使用的 FIELDS 和 LINES 子句。

FIELDS ESCAPED BY 控制如何寫入特殊字符。若是 FIELDS ESCAPED BY 字符不爲空,則在必要時輸出如下字符時做爲前綴,以免歧義:

● FIELDS ESCAPED BY 字符

● FIELDS [OPTIONALLY] ENCLOSED BY 字符

● FIELDS TERMINATED BY 和 LINES TERMINATED BY 值的第一個字符

● ASCII NUL(零值字節;轉義符後面實際寫入的是ASCII 0,而不是零值字節)

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 選項,它在寫入文件系統時受到相同的限制。下面是這樣一個語句的示例:

1. TABLE employees ORDER BY lname LIMIT 1000
2.     INTO OUTFILE '/tmp/employee_data_1.txt'
3.     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', ESCAPED BY '\'
4.     LINES TERMINATED BY '\n';

還可使用 SELECT ... INTO OUTFILE 和 VALUES 語句將值直接寫入文件。示例以下:

1. SELECT * FROM (VALUES ROW(1,2,3),ROW(4,5,6),ROW(7,8,9)) AS t
2.     INTO OUTFILE '/tmp/select-values.txt';

必須使用表別名;也支持列別名,而且能夠選擇僅寫入所需列值。還可使用 SELECT ... INTO OUTFILE 支持的任何輸出選項來格式化輸出到文件的內容。

下面是一個示例,該示例以逗號分隔值(CSV)格式生成文件,該格式由許多程序使用:

1. SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
2.   FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
3.   LINES TERMINATED BY '\n'
4.   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] 語句一塊兒使用。

注意

INTO OUTFILE 或 INTO DUMPFILE 建立的任何文件都屬於 mysqld 運行賬戶下的操做系統用戶。(因爲這個和其餘緣由,不該該以 root 用戶身份運行 mysqld。)從 MySQL 8.0.17 開始,用於文件建立的 umask 是 0640;必須有足夠的訪問權限來操做文件內容。在 MySQL 8.0.17 以前,umask 是 0666,服務器主機上的全部用戶均可以寫入該文件。

若是 secure_file_priv 系統變量設置爲非空目錄名,則要寫入的文件必須位於該目錄中。

在事件調度器執行的事件中,做爲其中一部分的 SELECT ... INTO 語句上下文中,診斷消息(不只包括錯誤,還包括警告)將寫入錯誤日誌,在 Windows 上寫入應用程序事件日誌。

從 MySQL 8.0.22 開始,經過設置 select_into_disk_sync 服務器系統變量,支持按期同步由 SELECT INTO OUTFILE 和 SELECT INTO DUMPFILE 寫入的輸出文件。經過設置 select_into_buffer_size 和 select_into_disk_sync_delay,能夠設置輸出緩衝區大小和延遲。

官方網站:
https://dev.mysql.com/doc/refman/8.0/en/select-into.html

相關文章
相關標籤/搜索