zoukankan      html  css  js  c++  java
  • mysql 把查询结果插入到表里

    假设将所有男同学都分到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('一年级一班');
    
    //用完后想要删除存储过程的调用第一句删除存储过程即可
    
  • 相关阅读:
    C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误
    ESP32 学习笔记
    ESP32 学习笔记
    C# 实现窗口无边框,可拖动效果
    C# 获取IP地址
    C# 实现程序开机自启动
    C# 设置程序最小化到任务栏右下角,鼠标左键单击还原,右键提示关闭程序
    C# 生成机器码
    C# 隐藏窗口标题栏、隐藏任务栏图标
    C# 测量程序运行时间
  • 原文地址:https://www.cnblogs.com/Lv-orange/p/15243075.html
Copyright © 2011-2022 走看看