SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr] ...
[into_option]
[FROM table_references
[PARTITION partition_list]]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec)] ...]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[into_option]
[FOR {UPDATE | SHARE}
[OF tbl_name [, tbl_name] ...]
[NOWAIT | SKIP LOCKED]
| LOCK IN SHARE MODE]
[into_option]
into_option: {
INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name] ...
}
-
1、SELECT ... INTO 語句可以將查詢結果存儲在一個變量中或文件中。
- 1)SELECT ... INTO var_list 將查詢結果寫入變量中
- 2)SELECT ... INTO OUTFILE 將查詢結果寫入文件中,而且可以指定行和列的格式
- 3)SELECT ... INTO DUMPFILE 將查詢結果寫入文件中,但所有內容都在一行內。
-
2、INTO 從句可以出現在 SELECT 語句的幾個不同的位置,但只能出現一次。INTO 從句不能用在 內嵌的 SELECT 語句中
# 在 FROM 之前
SELECT * INTO @myvar FROM t1;
# 在 鎖 之前, MySQL 8.0.20 已經 過時,可能會移除
SELECT * FROM t1 INTO @myvar FOR UPDATE;
# 在語句的最后, MySQL 8.0.20 支持
SELECT * FROM t1 FOR UPDATE INTO @myvar;
- 3、var_list
- 1)var_list 是一個或多個變量,每個變量可以是用戶定義的變量,存儲過程、函數的參數,或是存儲程序的本地變量。變量名大小寫不敏感
-
- 查詢到的值會相應地賦給每個變量,變量的個數要和查詢的列相同,而且結果行只能是一行。如果多行或零行則會報錯。
# 可以用 LIMIT 1 限制返回的行數
SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
- 4、可以在 TABLE 語句中使用 INTO var_list,只需滿足條件: 變量 和 表中列的總數一致,結果也只能是一行
# TABLE 語句, 類似 SELECT * FROM employees
TABLE employees ORDER BY lname DESC LIMIT 1
INTO @id, @fname, @lname, @hired, @separated, @job_code, @store_id;
- 5、可以使用 VALUES 語句來產生一行數據,應用到 INTO var_list 中,但要使用表的別名
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;
# 等同於
SET @x=2, @y=4, @z=8;
-
5、 SELECT ... INTO OUTFILE 'file_name' ,會在服務器 上創建一個文件,文件名不能是已存在的。需要用戶有 FILE 權限。
如果客戶端是遠程的話,產生的文件可能不太方便訪問到,因為只是mysql 客戶端的話,不能訪問服務器的文件系統。
這時可以使用 客戶端命令: mysql -e "SELECT ..." > file_name, 這樣產生的文件就會在客戶端上的主機上了。 -
6、SELECT ... INTO OUTFILE 和 LOAD DATA 語句是,互為相反的操作。都有 export_options,包含 FIELDS 從句 和 LINES 從句
# export_options
[{FIELDS | COLUMNS}
[TERMINATED BY 'string'] # 列 結束的字符串
[[OPTIONALLY] ENCLOSED BY 'char'] # 列 被什么字符環繞
[ESCAPED BY 'char'] # 列 的轉義字符處理
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
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 * FROM (VALUES ROW(1,2,3),ROW(4,5,6),ROW(7,8,9)) AS t
INTO OUTFILE '/tmp/select-values.txt';
如果你使用INTO DUMPFILE而不是INTO OUTFILE, MySQL只寫入一行到文件中,沒有任何列或行終止,也沒有執行任何轉義處理。這對於選擇BLOB值並將其存儲在文件中非常有用
https://dev.mysql.com/doc/refman/8.0/en/select-into.html
https://dev.mysql.com/doc/refman/8.0/en/table.html
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_character_set_filesystem
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
