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
語句必須為所有的計算列指定別名 - 視圖不是物理表,是虛擬表
- 不建議通過視圖更新視圖所依附的原始表的數據或結果
事務
事務主要保證數據的合理性和并發處理能力
可以避免數據處于一種不合理的中間狀態,例如轉賬
利用事務可以實現多個用戶對共享資源的同時訪問,使得呈現給用戶的數據是合理的
事務和線程的關系:
事務也是通過鎖來解決很多問題
事務運行的三種模式:
- 自動提交事務
- 顯式事務
- 隱性事務
事務的四大特性:
- 原子性
- 一致性
- 隔離性
- 持久性