identity
主键自动增长,用户不需要为identity修饰的主键赋值
create table student
(std_id int primary key identity(10,5),--(10,5)可以省略,默认为(1,1)std_name nvarchar(200) not null
)
select * from student
insert into student values ('张三') --不需要为主键赋值
insert into student values ('李四')
insert into student values ('王麻子')
delete from student where std_name='李四'
insert into student values ('李四')
即删除以后不会前移,而是继续增长
但是主键是否连续增长不是十分重要
如果使用identity
以后就不能手动设置主键,如果一定要设置可以进行如下操作
SET identity_insert Test.dbo.student on --注意下划线insert into student(std_id, std_name) values (15, '王五') --不可以省略(std_id, std_name)set identity_insert Test.dbo.student off
视图
视图是select
语句
逻辑上相当于一个临时表、虚拟表
但是库里面并不存在真正的表
格式:
create view vi_name
as select 语句
视图定义的前后不能加begin
和end
如果不使用视图
--求出平均工资最高的部门名称和部门的平均工资select dept.dname as "部门名称", tmp.avg_sal as "最高平均工资"from deptjoin (select top 1 avg(sal) as avg_sal, deptnofrom empgroup by deptnoorder by AVG(sal) desc) "tmp"on dept.deptno = tmp.deptno--Oracle不支持top,如果不使用rownum,使用下面复杂写法
select dept.dname as "部门名称", tmp.avg_sal as "最高平均工资"from (select AVG(sal) as avg_sal, deptno from emp group by deptno) as "tmp"join depton dept.deptno=tmp.deptnowhere (select MAX(t.avg_sal)from (select AVG(sal) as avg_sal, deptno from emp group by deptno) as "t")= tmp.avg_sal;
如果使用视图
create view vi_emp1 as select AVG(sal) as avg_sal, deptno from emp group by deptnoselect dept.dname as "部门名称", vi_emp1.avg_sal as "最高平均工资"from vi_emp1join depton dept.deptno=vi_emp1.deptnowhere (select MAX(tmp.avg_sal) from vi_emp1 as "tmp")= vi_emp1.avg_sal;
视图的优点:
- 视图可以简化查询,方便地创建一个临时表,避免代码冗余.
- 可以增加视图的保密性
使用视图一般用于查询,很少用于增删改查。有时会出错。
视图的缺点:
- 增加了数据库维护的成本(可能不会自动更新)
- 视图只是简化了代码,并没有加快查询的速度。
注意事项:
- 创建视图的
select
语句必须为所有的计算列指定别名 - 视图不是物理表,是虚拟表
- 不建议通过视图更新视图所依附的原始表的数据或结果
事务
事务主要保证数据的合理性和并发处理能力
可以避免数据处于一种不合理的中间状态,例如转账
利用事务可以实现多个用户对共享资源的同时访问,使得呈现给用户的数据是合理的
事务和线程的关系:
事务也是通过锁来解决很多问题
事务运行的三种模式:
- 自动提交事务
- 显式事务
- 隐性事务
事务的四大特性:
- 原子性
- 一致性
- 隔离性
- 持久性