1.批
GO标志一个批的结束,SQL server将批中的语句作为一个整体编译为一个执行计划。
批是一个整体,不能再批中引用其他批中的变量。也不能将注释在一个批中开始,在另一个批中结束。
如果批中出现编译错误,那么将不能生成执行计划,批中任何一个语句都不会执行。
批运行时期的错误,如果是多数,则终止当前语句和批中的后继语句的执行,少数运行时期错误(如违反约束),只会影响当前造成错误的语句,后面的语句仍可执行。(?这是什么概念)
批的限制:
- CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER和CREATE VIEW语句不能位于同一个批中。
- 不能在一个批中修改一个表的结构,然后在同一个批中引用刚刚修改的新列。
- 如果批中的第一条语句是EXCUTE,则EXCUTE关键字可以省略。否则,不能省略。
insert into student values('wwww','nan','1813',3030,null) --像这样插入错误的,identity也增加了1。并且跳过了错误的句子,执行了下面的句子 insert into student values('wang','男','1812',0,null) select * from student GO insert into student values('wwww','nan','1813',3030) --像这样插入错误的,参数个数不相匹配,后面的句子也没有执行,identity没有加1 insert into student values('wang','男','1812',0,null) select * from student GO
2.NULL值
SQL不允许数据不包含值,NULL值表示未知,不是什么都没有。
包含NULL的值总是被排除在一个结果集之外。
NULL值是等值的。
3.视图的概念
视图常常被称为虚拟的表,外形是一个表,但是数据集并没有物理存储在数据库中,而是根据需要从底层表中提取。
它允许用户看到或者(有时)更新特定部分的数据。数据库存储了视图的定义,但是视图所显示的数据只在视图被执行时才被创建。
视图可以构建于其他视图之上。
通常视图以用户熟悉的格式提供数据,并限制对用户不应当看到或者更新的数据访问。
可以对视图进行更新,但是必须执行检查以保证更新不危及安全。
构建视图:
create view membernameemail as select lastname,firstname,email,dateofjoining from memberdetails;
(1)视图的分类
- 表联合视图:将相关的表联合在一起,以从相关表中提取出特定字段,并显示为由多个表组成的一个视图。这些查询需要一定的时间,但是一旦做正确了之后就不需要再反复做这些了。
- 基础视图:构建了一个基础视图之后,可以利用他构建各种查询。
- 行视图:用于从一个较大数据集中的所有记录行中选择一个子集的视图。
- 字段视图:选择所有的记录,但是只选择其中的某些字段。
- 过滤的窗口视图:显示所选择记录行的某些列。
- 汇总视图:对记录行的所有集合执行各种操作,并为每个集合返回单个记录行 ,该记录行表示对集合的某个操作,这些视图不可更新。
(2)视图的更新
通常能通过大多数视图来更新一个表,如果视图中包含经过计算的字段,则是不能够进行更新的。汇总视图不能够更新。
更新的其他限制问题。
CHECK OPTION关键字:
create view memberbirthdays as select memberid,firstname,lastname,dateofbirth,street,city,state,zipcode,email,dateofjoining from memberdetails where state='goldern state' with check option
添加了check option关键字之后,当用户对视图还行update/insert/delete操作时,DBMS会检查每个操作,以确保她满足WHERE子句的条件。任何不满足WHERE子句的条件的操作将不会被执行。
这样保证了安全性,比如将成员根据洲来划分,不同的人管理不同的洲中成员的记录。如果他往其他州中插入了数据,那么其他的洲的管理员将会看到他没有添加的记录,而这个添加记录的人还以为自己的语句没有被执行。
(3)视图的删除
drop view memberbirthday cascade; drop view memberbirthday restrict;
cascade关键字会删除当前视图以及其他所有依赖该视图的其他视图。
restrict关键字会阻止删除被其他视图依赖的当前视图。
4.事务
(1)概念:被绑定在一起作为一个逻辑工作单元的SQL语句。原子性(其中一个语句失败时,事务回滚),一致性,隔离性,持久性(事务日志)。
ANSI事务模型:COMMIT/ROLLBACK。
Transact-SQL模型:BEGIN TRANSACTION、COMMIT TRANSACTION、SAVE TRANSACTION、ROLLBACK TRANSACTION。
(2)事务日志:一种记录,保存了操作之前数据的内容和操作之后数据的内容。通常保存在与主数据库不同的物理驱动器中。
(3)锁:使得某些数据或数据结构的其他有效用户在某段时间内无法利用这些数据或数据结构。
- 锁的粒度(锁的结构的级别或者大小):数据库粒度,表粒度,页粒度,行粒度,列粒度。
页的概念:DBMS允许将表数据划分为多个快,这些块的大小适合硬盘中的一个山区,这些块被称为页。
- 锁的级别:共享锁(不允许修改)、专有锁(不允许查看)、死锁(不同用户锁定不同表中的不同记录导致相互等待解锁)。
打破死锁的方式:周期地搜索死锁,其方式是检查活跃事务所拥有的所有锁。检查到死锁后,随机地抽取一个事务,并回滚他。该事务为这个死锁的“丢失者”,会接收到一个出错消息。
设置锁的参数:锁的大小,锁的数目,提升级别(将同一级别粒度的多个所合并为具有更高粒度的一个锁的能力,DBMS的自动过程,但是也能够被管理员控制)。
(4)隔离级别
SERIALIZABLE(默认):严格串行。
REPEATABLE READ:不允许对现有记录更新,但允许插入。
READ COMMITTED:保证事务不能看到其他事务未确认的更新。
READ UNCOMMITTED:其他事务所执行的任何更新都会影响当前事务。
SET TRANSACTION:设置隔离级别。