假設將所有男同學都分到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('一年級一班');
//用完后想要刪除存儲過程的調用第一句刪除存儲過程即可