SQL Cookbook 系列 -插入、更新和删除

  1. 插入新纪录
  2. 插入默认值
  3. 使用null代替默认值
  4. 从一个表想另外的表中复制行
  5. 复制表的定义
  6. 一次向多个表中插入记录
  7. 阻止对某几列插入
  8. 在表中编辑记录
  9. 当相应的行存在时更新
  10. 用其他表中的值更新
  11. 合并记录
  12. 从表中删除所有记录
  13. 删除指定记录
  14. 删除单个记录
  15. 删除违反参照完整性的记录
  16. 删除重复的记录
  17. 删除从其它表引用的记录

1.插入新的记录
insert into dept (deptno,dname,loc) values (50,'developer','shanghai');
当然还有另外一种:
insert into deptno values (50,'developer','shanghai');
Note:推荐使用第一种;第二种要严格按照表字段的顺序提供插入值,不允许有漏掉的

2.插入默认值
insert into dept (id) values (default)
Note:当然在建表的时候必须设置id的默认值,不然会有问题

3.使用null代替默认值
insert into dept (id,deptno) values (10,null);
Note:指定null值要强制指定,如果有的列默认值不是null,这样可以避免这样的问题

4.从一个表向另外一个表复制行
insert into dept (deptno,dname,loc)
select deptno,dname,loc from dept where loc='shanghai';
Note:这是对一个表进行扩充数据的好方法,当然要做到字段的值类型对应

5.复制表定义
db2: create table dept_2 like dept;
oracle,mysql,postgreSQL : create table dept_2 as select * from dept where 1=0;
sqlserver: select * into dep_2 from dept where 1=0;
Note:这个应该是专业DBA必须明白的,当然这个还是要知道有这个玩意的。除了db2,
where条件为false生成空表,true则是表复制,包括表定义和表数据。

6.一次向多个表插入记录
可以是相同的记录,也可以是不同记录,但是记录有统一的来源
oracle 使用insert allhe insert first进行操作,语法结构类似:
insert all when loc in ('shanghai','beijing') then into dept_east (deptno,dname,loc)
when loc='wuhan' then into dept_middle (deptno,dname,loc)
select deptno,dname,loc from dept;
insert first when loc in ('shanghai','beijing') then into dept_east (deptno,dname,loc)
when loc='wuhan' then into dept_middle (deptno,dname,loc)
select deptno,dname,loc from dept;
db2将所有的表内联之后作为插入目标,当谨慎使用,操作完成后查看操作结果
insert into (
select * from dept_west union all
select * from dept_east union all
select * from dept_mid
) select * from dept
其他的数据库只能通过分别向不同表单独插入了
Note:这个操作需要在操作完成后检查执行结果,宜谨慎对待

7.阻止对某几列插入
第一种是通过基于表的视图来进行限制的,将视图的插入权限赋予指定用户即可
create view emp_view as select ename,empno,job from emp;
第二种是使用内联视图
insert into (select empno,ename,job from emp) values (1,'Kitte','developer');
Note:这两种操作要看实际情况,如果没有权限建立视图就只能使用第二种了

8.更新在表中记录
update emp set sal=sal*1.1 where deptno=10
Note:每次更新之前先要运行select保证更新的记录是确定要更新的,
执行更新操作之后,要检验更新的记录结果是不是已经生效并且结果正确

9.当相应行存在时更新
select emp set sal=sal*1.1 where empno in (select empno from emp_bouns);
Note:与上一个类似,需要做检查

10.用其他表中的值更新
db2 mysql oracle postgreSQL sqlserver:
update emp e set (e.sal,e.comm) =
(selelct ns.sal, ns.sal/2 from new_sal ns where ns.deptno=e.deptno)
where exists ( select null from new_sal ns where ns.deptno=e.deptno)
Note: 背景颜色的语句表示有几行内连接的记录就有多少个null返回
oracle内联视图方案:
update ( select e.sal as emp_sal,e.comm as emp_comm,ns.sal as ns_sal,ns.sal/2 as ns_comm
from emp e,new_sal ns where e.deptno=ns.deptno)
set emp_sal=ns_sal,emp_comm=ns_comm
postgreSQL内联视图方案:
update emp set sal=ns.sal,comm=ns.sal/2 from new sal ns
where ns.deptno=emp.deptno
sql server内联方案:
update e set e.sal=ns.sal,e.comm=ns.sal/2 from
emp e,new_sal ns where ns.deptno=e.deptno;

11.合并记录
oracle是目前唯一可以解决此问题的数据库管理系统
merge into emp_commission ec using (select * from emp) emp on (ec.empno=emp.empno)
when matched then update set ec.comm=1000
delete where (sal<2000)
when not matched then insert (ec.empno) values (emp.empno)
Note:当有记录的时候更新,更新后删除ec.sal<2000的记录;当不存记录的时候,插入新记录

12.从表中删除所有记录
delete from emp

13.删除指定记录
delete from emp where deptno=10

14.删除单个记录
delete from emp where id=1

15.删除违反参照完整性
从表中删除引用其他表中不存记录的记录
delete from emp where not exists (select * from dept where dept.deptno=emp.deptno);

16.删除重复记录
解决方案:
delete from dupes where id not in (select min(id) from dupes group by name);

17.删除从其他表引用的记录
从一个表中删除被另一个表引用的记录,解决方案:
delete from emp where deptno in
(select deptno from dept_accidents group by deptno having count(*)>=3);

里面总有一些第一次见到的,也有耳熟能详的,仔细看一次才明白,我们只是浅浅的小溪,不是磅礴的河谷。

猜你喜欢

转载自blog.csdn.net/seacean2000/article/details/80897978