9月24日培训日记内容介绍
9月24日培训日记内容介绍
今天由袁龙友老师继续讲数据库,我没有去听课,下面是张挺记录的培训日记。
存储过程
存储过程就是一些代码的组合,类似Java中的方法,开发人员对复杂点的SQL语句一般都使用存储过程。
创建存储过程的形式:
Create proc Mytest(@Var1 varchar(10))
As
Begin
……
End
调用存储过程:exec MyTest(‘yuan’),也可以省略exec
一个海关报关系统的实际案例
该案例很有实用价值,通过一步步的解决问题,学到了不少析和设计数据库的相关知识,具体细节,需要结合实际的数据库来学习,在此不一一列出。
写一个存储过程,给某列按照HT YYYYMMDD 0001这样的形式自动编号
给一个选择集加列的方式
(1) case……when适用于有几个固定值的列的情况。
(2) left join 列的值不固定
(3) 通过用户自定义的函数
虽然左联接的效率比使用自定义函数的效率要高,但是在实际项目中性能的差别并不大,所以一般在实际项目中,为了方便,多数情况使用函数。
数据库系统中的dbo.student这个库,其中dbo类似于Java中的package的概念,在sql server中,它叫做schema,注意这里的schema和xml中的schema的区别。这里的schema实际上的一个名称空间。
我们使用sa或者administrator的时候,由于这两个用户都是管理员帐户,对dbo拥有权限,因此我们不用专门指定dbo这个名称空间。
视图
视图可理解为一个select语句的结果集
创建视图的语句:
Create View View2 as select * from Student
查询视图的语句:
Select from View2
基(本)表:视图所依赖的表
视图的实质:对基表的过滤。
如果视图中包含基表的主键,则该视图可以用update更新,否则视图不能更新。
视图与存储过程的区别:存储过程中可以包含多个SQL语句,而视图中只有一个
视图的用处:
(1) 将复杂的select语句用简单的方式呈现给用户。
(2) 一张表在一直存在的,如何让拥有不同权限的人查看到不同的数据?可以分别给他们呈现不同的视图。
(3) 隐藏基表的结构
依仗水平分区的多记录表,将数据存放在不同的位置,创建几个结构一样的基本,再用视图联接这些表。
依仗水平分区的多记录表,将数据存放在不同的位置,创建几个结构一样的基本,再用视图联接这些表。
事务:
事务解决的问题?
事务执行的原理:判断@@error<>0,如果不等于,则事务回滚
Begin Tran
……
If @@error<>0
Rollback Tran
……
Commit Tran
锁定(Lock)
锁是用来解决因为并发带来的多种问题的方案。
一个数据库不会对整张表加锁,SQL的早期是对一个页(8KB)进行加锁,目前主流的数据库都可以做到对行进行加锁。
锁定级别:表级,页级,行级锁定。
隔离级别的概念,有四种隔离级别。
锁的类别:独占锁(排它锁)、共享锁、更新锁,其中更新锁是用来防止死锁的。
锁超时:将锁释放
减少死锁的方法:
1.尽可能按照同一个进行操作
2.不要将事务做得太长,应该分级回退(嵌套事务)
编程实现中的锁定:保留以前的记录,不更新别人已经更新的记录。
悲观锁和乐观锁的概念,它们的区别在于where后面的条件。
Timestamp标识某行的内容是否做过修改,使用该类型可以不必使用很多的where条件。
触发器:
由Java编程的事件引出,实际上就是一段程序,引出某个动作。insert、update、delete时,触发一段代码。
创建触发器的语句:
Create Trigger TriInsertLockTest on LockTest for insert as……
触发器的一个实际用处:论坛每发一个新帖,数据库插入记录,此时更改本版块的最新发帖时间。
SQL中内部怎样实现insert、update、delete语句?如果要insert一条记录,首先将用到的页加载到内存,再写入buffer和日志,,最后再更新到磁盘。将数据写入磁盘后,内存中的数据不再是脏数据,可以理解为将数据写入临时表或表级变量,约束是在写磁盘之前加入的。触发器是在写到临时表(inserted)后触发,在insert的事务内,可以从这张表中取数据。
触发器是用来对业务进行逻辑检查的。它和check的区别是什么?check只能引用本表中的数据进行检查,而触发器可以引用外部的数据。
我们可以rollback系统的事务,而触发器是在一个系统事务中的,因此可以使用rollback Tran来进行回滚。
除了inserted表,还有一个deleted表,想想为什么没有updated表?