Part 1:T-SQL语言
特点:高度非过程化,综合统一,可移植性,以同一种语法结构提供两种使用方式,简单易学
变量:申明变量用DECLARE语句,初始化变量用SET语句。
eg:
DECLARE @m int //申明变量名为m的整型变量;
DECLARE @N char(10) //申明变量名为N的字符型变量;
SET @m=2 //变量赋值为2;
SET @N=‘boger’//变量赋值为‘boger’;
注:
在MySQL中,可以不申明变量,直接赋值,如SET @H=3;整型变量初值为3;
全局变量名前必须加两个“@”符号,注意,局部变量不要与全局变量同名;
逻辑运算符
ALL(所有),AND(与),ANY(任意一个)EXISTS(存在)IN(在范围内)LIKE(匹配)
SOME(任意一个) OR(或者)NOT(非),BETWEEN(两者之间)
函数:
标量函数,聚合函数,排名函数,行集函数;(详见SQL Server2012应用教程第二版116-119页)
常用的系统函数功能:
@@ERROR 返回上一个T-SQL语句的错误号,如没有错误,返回为0;
@@ROWCOUNT 返回上一语句影响的行数;
@@IDENTITY返回最后插入的标识值的系统函数;
eg:(建库操作不必再陈述)
create table tes(
age int identity(1,1) primary key,
xx int
)
insert into tes(xx) values(22)//插入一行;
insert into tes(xx) values(23)//插入一行;
insert into tes(xx) values(24)//插入一行;
select @@rowcount,@@identity
select * from tes
一共插入三行,@@rowcount返回为3;
T-SQL语句流程控制语句:
和c/c++,java一样,T-SQL 语句也有流程控制语句,分支语句,循环语句
eg(1):从sc表中选取不同分数段进行不同的加分;(case-when then语句)
select Sno,Cno,Score,
评价=case
when Score between 90 and 100 then update sc set Score+2
when Score between 80 and 90 then update sc set Score+1.5
when Score between 70 and 80 then update sc set Score+1
when Score between 60 and 70 then update sc set Score+0.5
end
from sc
select * from sc
eg(2):(while if-else语句,break continue语句)
declare @i int
set @i=2
while @i<20
begin
set @i=@i+1
if @i=10
break
else
continue
end
select @i
go
eg(3):(try-catch语句)(捕捉错误,异常处理语句)
begin try
print 5/0
end try
begin catch
select
ERROR_NUMBER() AS N’ERRORNUMBER’,
ERROR_MESSAGE() AS N’ERRORMESSAGE’,
ERROR_SEVERITY() AS N’ERRORSEVERITY’,
ERROR_STATE() AS N’ERRORSTATE’,
ERROR_LINE() AS N’ERRORLINE’
end catch
go
输出:
ERRORMESSAGE遇到以零作除数错误;
T-SQL核心语句:
create alter drop数据定义
select 数据查询
insert update declare数据操纵
grant remove数据控制
Part 2:存储过程
存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
好处:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高
存储过程的类型:系统存储过程,用户自定义存储过程,临时存储过程,远程存储过程,拓展存储过程
系统存储过程:存储在master数据库并以sp为前缀
在SQL Server Mangagement Studio中查看系统存储过程步骤:
选择自己创建的数据库–选择可编程性–存储过程,在其子选项可以看到;
T-SQL语句来创建存储过程:
eg:(假定我们创建了一个数据库名为person,创建了三个表,students学生表,courses课程表,sc选课表)
use person
go
create procedure add
as
update sc
set score=score+4
where sname=‘boger’
go
创建存储过程语句 CRETAE PROCEDURE +存储过程名;
调用存储过程语句 EXECUTE +存储过程名;
修改存储过程语句 ALTER PROCEDURE +存储过程名;
删除存储过程语句 DROP PROCEDURE+存储过程名;
当然存储过程的创建,修改,删除也可以在资源管理器进行操作,找到对应的存储过程进行操作;
eg:
创建有参数的存储过程并调用;
create procedure updatescore
@sno char(5),@cno char(5)
as
begin
update sc set Score=case
when Score between 90 and 100 then Score+1
when Score between 80 and 90 then Score+2
when Score between 70 and 80 then Score+3
else 100
end
where Sno=@sno Cno=@cno
end
go
exec updatescore ‘00006’//调用存储过程;
select * from sc where Sno=‘00006’
Part 3:视图
视图:从一个或者多个表或者其他视图中导出的表,是虚表,并不真实存在
优点:
(1)为用户集中数据,简化用户的数据查询和处理
(2)简化操作,屏蔽数据的复杂性
(3)便于数据共享
(4)合并分割数据,有利于数据输出到应用程序中
创建视图;
create view student_sc
as
select students.Sno,students.Sname,students.Saddress,course.Cno,course.Title,sc.Score from students left join sc on students.Sno=sc.Sno left join course on sc.Cno=course.Cno
select * from student_sc
/修改视图;
alter view + 名字/
/删除视图;
drop view +名字/
Part 4:事务
事务:逻辑工作单元,一个数据库操作序列,一个不可分割的工作单位,恢复和并发控制的基本单位,提高数据库并发性的效率
案例:在银行活动中,“由账户A转移资金额X到账户B”可以分解为两个动作:
从账户A中减掉金额X,在账户B中加入金额X
这两个动作应当构成一个不可分割的整体,要么完成其中的所有动作,要么不执行其中任何动作,二者必居其一,一旦一个环节失败,就需要回滚(恢复为初始态)
事务的特性(ACID原则):
原子性(Atomicity):执行一个完整的工作,要么执行全部数据的操作,要么全不执行
一致性(Consistency):当事务完成时,所有的数据状态一致
隔离性(Isolation):并行事务的修改必须与其他并行事务的修改相互独立
持久性(Durability ):事务完成后,将永久存于系统中,事务的操作会写入数据库
事务的类型:
按照系统的设置:(1)系统事务 (2)用户定义事务
(1)系统提供的语句:alter drop create 等
(2)用户定义事务:BEGIN TRANSACTION定义用户的事务,结束时要有明确的结束语句(COMMIT)提交语句和(ROLLBACK)取消语句
根据运行模式分类:
(1)自动提交事务:每条单独的语句都是一个事务
(2)显式事务:BEGIN TRANSACTION 开始,以COMMIT或者ROLLBACK结束
(3)隐式事务:前一个事务完成时新事务隐式启动,但每个事务以COMMIT或者ROLLBACK完成
(4)批处理级事务:应用多个活动结果集,在多个活动结果集启动的T-SQL显式或隐式事务变为批处理事务
批处理(批):整个过程做,或者什么都不做,将整个操作组织成一个简单的事务处理
eg:
案列:
USE DATABASE
BEGIN TRANSACTION
UPDATE sc SET Score=90 where Cno=”SQL Server” INSERT INTO Courses(Cno,TiTLE,CRDIT) VALUES(“003”,”数据库原理”,4)
UPDATE STUDENTS SET SNAME=”CMV” where Sno=”201713140203”
COMMIT TRANSACTION
多个SQL操作定义为批处理;
事务隔离级
隔离级:定义用户彼此间的隔离与交互的程度
隔离级较高:确保数据库的正确性,但可能降低并发性,降低系统执行效率
隔离级较低:增加并发,提高系统执行效率,但降低数据的正确性
SQL Server2012提供的隔离级:未提交读,提交读,可重复读,快照,序列化
事务处理语句:
开始事务:BEGIN TRANSACTION
提交事务:COMMIT TRANSACTION
回滚(撤销)事务:ROLLBACK TRANSACTION
存储点语句:SAVE TRANSACTION
eg:
CREATE TABLE STUDENTS(
NAME CHAR(10),
MONEY INT
)
INSERT INTO STUDENTS(NAME,MONEY) VALUES(‘BOGER’,1000)
INSERT INTO STUDENTS(NAME,MONEY) VALUES(‘BOGE’,500)
SELECT * FROM STUDENTS
BEGIN TRANSACTION//开启一个事务;(MySQL中为start transaction)
DECLARE @ACCOUNT INT
SET @ACCOUNT=0
UPDATE STUDENTS SET MONEY=500 WHERE NAME=‘BOGER’
SET @ACCOUNT=@@ERROR+@ACCOUNT
UPDATE STUDENTS SET MONEY=1000 WHERE NAME=‘BOGE’
SET @ACCOUNT=@@ERROR+@ACCOUNT
IF @ACCOUNT=0
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
SELECT * FROM STUDENTS
每进行一次操作之前,开启一个事务;
创建一个带参数的存储过程的事务:
create table students(
custname char(10),
currentMoney int
)
eg:
create procedure alter_money
@custname1 char(10),
@custname2 char(10),
@currentmoney int
as
begin
begin transaction
declare @sum int
set @sum=0
update students set currentMoney=currentMoney-@currentmoney where custname=@custname1
set @sum=@sum+@@error
update students set currentMoney=currentMoney+@currentmoney where custname=@custname2
set @sum=@sum+@@error
if(@sum=0)
commit transaction
else
rollback transaction
end
part5:触发器:(for after before)
触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。
创建触发器的语句为:
create trigger trigger_name
on {table_name | view_name}
{for | After | Instead of }
[ insert, update,delete ]
as
sq1l_statement
SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表
eg:从学生表中删除学生信息,对应的选课表中的学生信息也将删除。删除学生信息表的时候,将创建一个临时表deleted表,此时删除学生选课表的全部信息,就可用语句
delete * from sc where sc.student_id=deleted.student_id;//student_id是主键。
同样的道理,我们向学生表插入数据,即插入学生信息,对应的人数增加,此时插入的数据存放于临时表inserted表中。
下面举一个列子(delete触发器)
eg:将学生插入校友表,并删除学生表中的学生信息:
create trigger delete_student on student for delete
as
begin
insert into 校友表select student_id,student_name,student_sex,student_department,
student_score from deleted //插入校友表;
delete * from student where student.student_id=deleted.student_id//删除学生表的学生信息;
end
今天就到这里吧,下期再见