SELECT ... INTO
语句在 MySQL 中用于将查询结果直接插入到另一个表中,或者将查询结果存储到变量中。以下是几种常见的使用示例:
1. 将查询结果插入到另一个表中
假设你有两个表 source_table
和 target_table
,你想将 source_table
中的部分数据插入到 target_table
中。
示例表结构
-- 源表 source_table
CREATE TABLE source_table (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT
);
-- 目标表 target_table
CREATE TABLE target_table (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT
);
插入数据
-- 插入部分数据到目标表
INSERT INTO target_table (id, name, age)
SELECT id, name, age
FROM source_table
WHERE age > 30;
2. 将查询结果存储到变量中
假设你有一个表 users
,你想将某个用户的姓名和年龄存储到变量中。
示例表结构
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT
);
存储查询结果到变量
SET @user_name = '';
SET @user_age = 0;
SELECT name, age
INTO @user_name, @user_age
FROM users
WHERE id = 1;
-- 查看变量值
SELECT @user_name, @user_age;
3. 将查询结果导出到文件中
SELECT ... INTO OUTFILE
语句可以将查询结果导出到文件中。这通常用于备份数据或与其他系统进行数据交换。
示例表结构
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_name VARCHAR(100),
order_date DATE,
total_amount DECIMAL(10, 2)
);
导出查询结果到文件
SELECT order_id, customer_name, order_date, total_amount
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM orders;
报错:
1290
- The MySQL server is running with the --secure-file-priv option
so it cannot execute this statement
解决办法:
windows下的话,设置该变量的值即可。linux下可以禁用该参数,或指定该变量的值。
4. 从文件导入数据到表中
LOAD DATA INFILE
语句可以将文件中的数据导入到表中。这是 SELECT ... INTO OUTFILE
的逆操作。
示例表结构
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_name VARCHAR(100),
order_date DATE,
total_amount DECIMAL(10, 2)
);
导入数据到表
LOAD DATA INFILE '/tmp/orders.csv'
INTO TABLE orders
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES; -- 如果文件有标题行,可以忽略第一行