假设将所有男同学都分到id为1的班级
从class(班级表)中查出id为1的班级名,从student(学生表)中查到所有男的学生id和名字,插入到学生班级表中
方式1:
insert into tbl_stu_class
(
SELECT tbl_class.cl_id, tbl_student.st_id
FROM tbl_class
JOIN tbl_student
WHERE tbl_class.cl_name = '一年级一班'
AND tbl_student.sex = '男'
)
注意:此种方式只适合查询出的数据集结构和要插入的表结构一样的情况!
即:tbl_stu_class 表结构为:
cl_name | st_id | st_name |
---|---|---|
…… | …… | …… |
事实上方式一已经够用了,你只需要把查询出来的数据集结构弄的和要插入的表结构一样即可。
方式二存储过程作为了解,至于存储过程的详情我也不太了解,想要了解的小伙伴可自行百度。
方式二: 使用存储过程
此方式适合任何情况
# 创建存储过程前先检查是否存在,存在就删除
DROP PROCEDURE IF EXISTS insert_stu_class;
# 存储过程
DELIMITER //
CREATE PROCEDURE insert_stu_class(IN param VARCHAR(50))
BEGIN
# 该变量用于标识是否还有数据需要遍历
DECLARE flag INT DEFAULT 0;
# 创建一个变量用来存储遍历过程中的值
DECLARE stu_id INT;
DECLARE cl_id INT DEFAULT (SELECT cl_id FROM tbl_class WHERE cl_name = param);
# 查询出需要遍历的数据集合
DECLARE idList CURSOR FOR (SELECT stu_id FROM tbl_student WHERE sex = '男');
# 查询是否有下一个值,没有将标识设为1,相当于hasNext
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;
# 打开游标
OPEN idList;
# 取值设置到临时变量中
FETCH idList INTO stu_id;
# 遍历未结束就一直执行
WHILE flag != 1 DO
# 插入数据到tbl_group_role中
INSERT INTO tbl_stu_class VALUE (cl_id, stu_id);
#游标向后移一位
FETCH idList INTO stu_id;
END WHILE;
CLOSE idList;
END;
//
CALL insert_stu_class('一年级一班');
//用完后想要删除存储过程的调用第一句删除存储过程即可