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