复制表select into from和拷贝表insert into from

1、复制表( 只复制结构, 源表名:a新表名:b)
select * into b from a where 1=2;

将表结构都复制到新表中

在mysql中上述语句报错:Undeclared variable: b
原因:在mysql中不支持select * into b from a这种语法
改进:1、create table b select * from a
2、insert into b select * from a
这种语法是将a表的所有语法复制到b表中,前提是b表已经存在了
从多个表中查询数据
INSERT INTO a(field1,field2)
SELECT * FROM (SELECT f1,f2 FROM b JOIN c) AS tb
tb存在的意义:在mysql中任何一个派生出来的新表都必须有别名

3、mysql在插入数据前判断数据是否存在,若不存在,再插入
语法:

INSERT INTO movie ( id, category ) 
SELECT 1,11
FROM dual
WHERE
    NOT EXISTS ( SELECT * FROM movie WHERE id = 4 );

(1)dual:dual 是一张虚拟表用来构成select语句的语法规则,mysql中,dual表中没有任何数据,只是构成完整的语法规则。oracle保证dual里面只有一条记录。
(2)from dual:上面的代码中,from dual可以删除不写,原代码仍然可以运行成功,
原因:在Mysql和SQL Server中可以直接:
select 1 不需要加from 表名就可以执行
(3)把dual表换成movie表,如果movie表中有3条记录,那么执行此语句后,movie表中会被添加3条记录(1,11),原因,当判断where not exists时,会对movie表的每一条记录执行一次:where not exists(select * from movie where id=4)。
当不写from movie 或换成 from dual时,只会单独执行后面的where子句,对一个movie整体执行依稀where,所以此时只添加一条记录。

关于exists:
1、最常用的if not exists
create table if not exists A
如果表A不存在(返回true)则创建表
2、select 语句中使用exists
select a.id,a.name from user
where exists (select * from class where a.class_id = c.class_id)

你可能感兴趣的:(复制表select into from和拷贝表insert into from)