select into&insert into select

insert into select语句在触发器中的运用

这是一个触发器的,达到的效果就是,当tywdeptcourse表添加数据时,根据表中部门ID,给该部门的所有员工选课课程表(tywstaffcourse)中添加该门课程。
代码如下:

DELIMITER $$
CREATE TRIGGER trigger_tywdeptcourse_insert AFTER INSERT  
ON tywdeptcourse FOR EACH ROW
BEGIN
    INSERT INTO tywstaffcourse(STUFFID,COURSEID) SELECT ID,new.COURSEID FROM tsystaff WHERE DEPTID = new.DEPTID;
END $$

在这里插入图片描述
TYWPOSTCOURSE 当该表添加一条数据时,根据表中岗位ID,
给该所有具有该岗位员工的选课课程表(TYWSTAFFCOURSE)中添加该门课程。

DELIMITER $$
CREATE TRIGGER trigger_tywpostcourse_insert AFTER INSERT 
ON tywpostcourse FOR EACH ROW
BEGIN
   INSERT INTO tywstaffcourse(STUFFID,COURSEID) SELECT ID,new.COURSEID FROM tsystaff WHERE POSTID = new.POSTID;
END $$

在这里插入图片描述
当员工岗位发生变化时,将员工新的岗位的课程,由岗位课程关系(TYWPOSTCOURSE)中取出该岗位的课程,将员工选课课程表(TYWSTAFFCOURSE)没有此门课程的数据插入。

DELIMITER $$
CREATE TRIGGER trigger_tsystaff_update AFTER UPDATE ON tsystaff FOR EACH ROW
BEGIN
    DECLARE cnt INT;
    SET cnt =(SELECT COUNT(COURSEID) FROM tywpostcourse WHERE POSTID = new.POSTID AND COURSEID NOT IN (SELECT COURSEID FROM tywstaffcourse WHERE STUFFID = new.STUFFID));
    IF cnt > 0 THEN
  		INSERT INTO tywstaffcourse(STUFFID,COURSEID) SELECT new.STUFFID,COURSEID 
  		FROM (SELECT COURSEID FROM tywpostcourse WHERE POSTID = new.POSTID AND 
  		COURSEID NOT IN (SELECT COURSEID FROM tywstaffcourse WHERE STUFFID = new.STUFFID));
 	END IF;
END $$

在这里插入图片描述

以下内容感谢菜鸟教程:https://www.runoob.com/sql/sql-insert-into-select.html

SELECT INTO

从一个表复制数据,然后把数据插入到另一个新表中。

创建 users表的的备份复件:
	SELECT *
	INTO users_copy
	FROM users;
只复制一些列插入到新表中:(复制表2的name、age列到表1)
	SELECT name, age
	INTO table1
	FROM table2;
只复制所有列到新表中:(根据条件复制)
	SELECT *
	INTO table1
	FROM table2
	WHERE id='001';
复制多个表中的数据插入到新表中:
	SELECT table1.name, table2.age, table2.gender
	INTO table3
	FROM table1
	LEFT JOIN table2
	ON table1.t1_id=table2.t2_id;
提示:SELECT INTO 语句可用于通过另一种模式创建一个新的空表。
只需要添加促使查询没有数据返回的 WHERE 子句即可:
		SELECT *
		INTO newtable
		FROM table1
		WHERE 1=0;

INSERT INTO SELECT

从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
在这里插入图片描述

复制 "apps" 中的数据插入到 "Websites" 中:
		INSERT INTO Websites (name, country)
		SELECT app_name, country FROM apps;
	
	只复 QQ 的 APP 到 "Websites" 中:
		INSERT INTO Websites (name, country)
		SELECT app_name, country FROM apps
		WHERE id=1;

区别

select into from 和 insert into select 都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。

  1. 复制表结构及其数据:
    create table table_name_new as select * from table_name_old
  2. 只复制表结构:
    create table table_name_new as select * from table_name_old where 1=2;
    或者:
    create table table_name_new like table_name_old
  3. 只复制表数据:
    如果两个表结构一样:
    insert into table_name_new select * from table_name_old
    如果两个表结构不一样:
    insert into table_name_new(column1,column2…) select column1,column2… from table_name_old

稍微整理一下 select into from 和 insert into select 的理解层面的区别

  • select into from :将查询出来的数据整理到一张新表中保存,表结构与查询结构一致。

  • select *(查询出来的结果) into newtable(新的表名)form where (后续条件)
    即,查询出来结果—>复制一张同结构的空表—>将数据拷贝进去。

  • insert into select :为已经存在的表批量添加新数据。

  • insert into (准备好的表) select *(或者取用自己想要的结构)frome 表名 where 各种条件
    即,指定一张想要插入数据的表格—>对数据进行加工筛选—>填入一张准备好的表格。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值