MySQL select语法(二):SELECT ... INTO

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 是一个或多个变量,每个变量可以是用户定义的变量,存储过程、函数的参数,或是存储程序的本地变量。变量名大小写不敏感
      1. 查询到的值会相应地赋给每个变量,变量的个数要和查询的列相同,而且结果行只能是一行。如果多行或零行则会报错。
# 可以用 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

posted @ 2022-02-23 19:56  zhanglw  阅读(4222)  评论(0编辑  收藏  举报