- 插入新纪录
- 插入默认值
- 使用null代替默认值
- 从一个表想另外的表中复制行
- 复制表的定义
- 一次向多个表中插入记录
- 阻止对某几列插入
- 在表中编辑记录
- 当相应的行存在时更新
- 用其他表中的值更新
- 合并记录
- 从表中删除所有记录
- 删除指定记录
- 删除单个记录
- 删除违反参照完整性的记录
- 删除重复的记录
- 删除从其它表引用的记录
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);
里面总有一些第一次见到的,也有耳熟能详的,仔细看一次才明白,我们只是浅浅的小溪,不是磅礴的河谷。