当前位置:u赢电竞手机版 > uwin电竞app官网下载 > 《SQL Server 2008从入门到精通》--20180716uwin电竞ap

《SQL Server 2008从入门到精通》--20180716uwin电竞ap

文章作者:uwin电竞app官网下载 上传时间:2019-08-14

1.锁

当多个用户同时对同一个数据进行修改时会产生并发问题,使用事务就可以解决这个问题。但是为了防止其他用户修改另一个还没完成的事务中的数据,就需要在事务中用到锁。
SQL Server 2008提供了多种锁模式:排他锁,共享锁,更新锁,意向锁,键范围锁,架构锁和大容量更新锁。
查询sys.dm_tran_locks视图可以快速了解SQL Server 2008内的加锁情况。

SELECT * FROM sys.dm_tran_locks;

注:关于锁的知识书中没细讲,将在以后的博客中补充。

目录

2.游标

游标是类似于C语言指针一样的结构,是一种数据访问机制,允许用户访问单独的数据行。游标主要由游标结果集和游标位置组成。游标结果集是定义游标的SELECT语句返回行的集合,游标位置是指向这个结果集中某一行的指针。
示例1:用游标检索出student表中每行记录
Student表记录如图所示
uwin电竞app官网下载 1
执行下列语句

USE test
DECLARE stu_cursor CURSOR FOR
SELECT * FROM student--声明student表的游标stu
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor--移动该记录指针
WHILE @@FETCH_STATUS=0--@@FETCH_STATUS用于保存FETCH操作的结束信息,=0表示有记录检索成功
BEGIN
FETCH NEXT FROM stu_cursor--游标指针移动到下一条记录
END
CLOSE stu_cursor--关闭游标
DEALLOCATE stu_cursor--释放游标资源

结果如图所示
uwin电竞app官网下载 2

  • 1.使用Transact-SQL语言编程
    • 1.1.数据定义语言DDL
    • 1.2.数据操纵语言DML
    • 1.3.数据控制语言DCL
    • 1.4.Transact-SQL语言基础
  • 2.运算符
    • 2.1.算数运算符
    • 2.2.赋值运算符
    • 2.3.位运算符
    • 2.4.比较运算符
    • 2.5.逻辑运算符
    • 2.6.连接运算符
    • 2.7.一元运算符
    • 2.8.运算符的优先级
  • 3.控制语句
    • 3.1.BEGIN END语句块
    • 3.2.IF ELSE语句块
    • 3.3.CASE分支语句
    • 3.4.WHILE语句
    • 3.5.WAITFOR延迟语句
    • 3.6.RETURN无条件退出语句
    • 3.7.GOTO跳转语句
    • 3.8.TRY CATCH错误处理语句
  • 4.常用函数
    • 4.1.数据类型转换函数

2.1.游标定义的参数LOCAL和GLOBAL

游标定义参数LOCAL表示该游标只能作用于本次批处理或函数或存储过程。游标定义参数GLOBAL表示该游标可以作用于全局。
执行下列语句

DECLARE stu_cursor CURSOR LOCAL
FOR SELECT * FROM student
GO
OPEN stu_cursor
GO

执行结果如下
uwin电竞app官网下载 3
语句中,声明了一个student表的游标stu_cursor,在打开游标时提示游标不存在。因为该游标参数是LOCAL,只能作用于当前批处理语句中,而打开游标语句和声明语句不在一个批处理中。如果去掉第一个GO,使两个语句在同一个批处理中,就能顺利执行不会报错。
执行下列语句

DECLARE stu_cursor1 CURSOR GLOBAL
FOR SELECT * FROM student
GO
OPEN stu_cursor1
GO

执行结果:命令已成功完成
和LOCAL参数对比,GOLBAL参数设置游标作用于全局,因此OPEN和DECLARE语句不在同一个批处理中依然可以成功执行。

1.使用Transact-SQL语言编程

尽管SQL Server 2008提供了图形化界面,但只有一种Transact-SQL语言能够直接与数据库引擎进行交互。根据执行功能特点可以将Transact-SQL语言分成3大类:数据定义语言DDL,数据操纵语言DML,数据控制语言DCL。

2.2.游标分为游标变量和游标类型

如下列语句

--语句1
DECLARE stu_cursor CURSOR
FOR SELECT * FROM student--声明student表的游标名称为stu_cursor并赋值
GO

--语句2
DECLARE @stu_cursor CURSOR--声明游标类型的变量@stu_cursor
SET @stu_cursor=CURSOR FOR--给该变量赋值
SELECT * FROM student

在语句1中直接声明了一个游标并赋值,而语句2中声明了游标类型的变量@stu_cursor,然后给该变量赋值。这两者是不同的。

1.1.数据定义语言DDL

是最基础的Transact-SQL语言类型,用来创建数据库和创建,修改,删除数据库中的各种对象,为其他语言的操作提供对象。例如数据库,表,触发器,存储过程,视图,函数,索引,类型及用户等都是数据库中的对象。常见的DDL语句包括

CREATE TABLE--创建表
DROP TABLE--删除表
ALTER TABLE--修改表

2.3.游标参数FORWARD_ONLY和SCROLL

FORWARD_ONLY参数设置游标只能从结果集的开始向结束方向读取,使用FETCH语句时只能用NEXT,而SCROLL参数设置游标可以从结果集的任意方向,任意位置移动。如下列语句

--语句1,默认FORWARD_ONLY
DECLARE stu_cursor CURSOR LOCAL
FOR SELECT * FROM student
OPEN stu_cursor
FETCH NEXT FROM stu_cursor
GO
--语句2,FORWARD_ONLY参数,FETCH时只能从开始往结束方向
DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
FOR SELECT * FROM student
OPEN stu_cursor 
FETCH NEXT FROM stu_cursor
GO
--语句3,SCROLL参数,FETCH时可以从任意位置往任意方向
DECLARE stu_cursor CURSOR SCROLL LOCAL
FOR SELECT * FROM student
OPEN stu_cursor
FETCH LAST FROM stu_cursor
GO

1.2.数据操纵语言DML

是用于操纵表和视图中的数据的语句,例如查询数据(SELECT),插入数据(INSERT),更新数据(UPDATE)和删除数据(DELETE)等。

2.4.游标的简单应用

示例2:将student表中stu_enter_score大于600分的学生都减去100分
Student表中的数据如图所示
uwin电竞app官网下载 4
执行下列语句

--游标的简单应用
DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
FOR SELECT stu_no,stu_enter_score FROM student
OPEN stu_cursor
DECLARE @score INT
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
WHILE @@FETCH_STATUS=0 
BEGIN
IF @score>=600
BEGIN
UPDATE student
SET stu_enter_score=@score-100 WHERE stu_no=@stu_no 
END
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
END
CLOSE stu_cursor
DEALLOCATE stu_cursor
GO

结果如图所示
uwin电竞app官网下载 5

1.3.数据控制语言DCL

涉及到权限管理的语言称为数据控制语言,主要用于执行有关安全管理的操作。如授予权限(GRANT),收回权限(REVOKE),拒绝授予主体权限,并防止主体通过组或角色成员继承权限(DENY

3.存储过程

存储过程是一组用于完成特定功能的语句集,经过编译后存储在数据库中。在SQL Server 2008中,既可以用T-SQL编写存储过程,也可以用CLR编写存储过程。

1.4.Transact-SQL语言基础

3.1.用户定义的存储过程

该种存储过程是指封装了可重用代码的模块或者历程,有2种类型:T-SQL存储过程和CLR存储过程。
T-SQL存储过程是指保存的T-SQL语句集合
CLR存储过程是指对Microsoft .NET Framework公共语言运行时(CLR)方法的引用

1.4.1.常量与变量

常量不多说。在SQL Server 2008中,存在两种变量。一种是系统定义和维护的全局变量,一种是用户定义用来保存中间结果的局部变量。

3.2.扩展存储过程

扩展存储过程是指可以动态加载和运行的DLL,允许使用编程语言(如C语言)创建自己的外部例程。扩展存储过程直接在SQL Server 2008的实例的地址空间中运行,可以使用SQL Server扩展存储过程API完成编程。

1.4.1.1.系统全局变量

系统全局变量分为两大类,一类是与当然SQL Server连接或与当前处理有关的全局变量,如@@Rowcount表示最近一个语句影响的行数。@@error表示保存最近执行操作的错误状态。一类是与整个SQL Server系统有关的全局变量,如@@Version表示当前SQL Server的版本信息。

SELECT @@VERSION AS 当前版本;--查看当前SQL Server的版本信息

结果如图所示
uwin电竞app官网下载 6

3.3.系统存储过程

系统存储过程是指存储在源数据库中,以sp开头的存储过程,出现在每个系统定义数据库和用户定义数据库的sys架构中。

1.4.1.2.局部变量

局部变量能够拥有特定数据类型,有一定的作用域,一般用于充当计数器计算或控制循环执行次数,或者用于保存数据值。局部变量前只有1个@符,用DECLARE语句声明局部变量。

USE test
DECLARE @StudentId varchar(20)
SET @StudentId=(
SELECT Student.stu_no
FROM Student
WHERE stu_enter_score='603')
SELECT @StudentId AS 入学分数为603的学生学号
GO

结果如图所示
uwin电竞app官网下载 7

3.3.1.创建存储过程规则

在设计和创建存储过程时,应该满足一定的约束和规则。

  • CREATE PROCEDURE定义自身可以包括任意数量和类型的SQL语句,但下表中的语句除外。不能在存储过程的任何位置使用这些语句。
  • 可以引用在统一存储过程中创建的对象,只要引用时已创建了该对象
  • 可以在存储过程内引用临时表
  • 如果在存储过程中创建了本地临时表,该临时表仅为该存储过程而存在,退出该存储过程后,该临时表会消失
  • 如果执行的存储过程调用了另一个存储过程,被调用的存储过程可以访问第一个存储过程的所有对象,包括临时表
  • 如果执行对远程SQL Server 2008实例进行更改的远程存储过程,这些更改将不能被回滚。远程存储过程不参与事务处理
  • 存储过程中的参数的最大数量为2100
  • 存储过程中的局部变量的最大数量仅受可用内存的限制
  • 根据可用内存的不同,存储过程最大可达128MB
语句 语句 语句
CREATE AGGREGATE CREATE RULE CREATE DEFAULT
CREATE SCHEMA CREATE(ALTER) FUNCTION CREATE(ALTER) TRIGGER
CREATE(ALTER) PROCEDURE CREATE(ALTER) VIEW SET PARSEONLY
SET SHOWPLAN_ALL SET SHOWPLAN_TEXT SET SHOWPLAN_XML
USE database_name

2.运算符

3.3.2.限定存储过程内的名称

在存储过程内,如果用于语句的对象没有限定架构,则架构将默认为该存储过程的架构。如果创建该存储过程的用户没有限定INSERT,SELECT,UPDATE或DELETE语句中引用的表名或试图名,则默认情况下通过该存储过程进行的访问将受到该过程创建者权限的限制。如果有其他用户要使用存储过程,则所有用于数据定义语言(DDL)的语句(如CREATE,ALTER,EXECUTE,DROP,DBCC或动态SQL语句)的对象名应该用该对象架构的名称来限定。

2.1.算数运算符

在SQL Server 2008中,算数运算包括加( )减(-)乘(*)除(/)取模(%)。举一个简单的例子。
示例1:在Student表中添加一列,列名为stu_age,根据Student表的stu_birthday列计算stu_age列并插入数据。(演示插入整列数据的方法)
Student表数据如图所示
uwin电竞app官网下载 8
执行下面的语句

ALTER TABLE Student
ADD stu_age int;--在Student表中添加stu_age列
CREATE TABLE #agetemp(stu_no varchar(8),age int);--新建一个临时表
INSERT INTO #agetemp(stu_no,age)--在临时表中插入学号和计算出来的年龄
SELECT Student.stu_no,YEAR(GETDATE())-YEAR(stu_birthday)--利用函数和运算符计算年龄
FROM Student;
UPDATE Student
SET Student.stu_age=#agetemp.age--将临时表中的age列数据整个复制到Student表的stu_age列
FROM #agetemp
WHERE Student.stu_no=#agetemp.stu_no--条件是两个表的stu_no列值相等
GO
SELECT * FROM Student

结果如图所示
uwin电竞app官网下载 9

3.3.3.加密存储过程的定义

如果要创建存储过程并确保其他用户无法查看该存储过程的定义,则可以使用WITH ENCRYPTION,这样,过程定义将以不可读的形式存储。

2.2.赋值运算符

即等号(=),将表达式的值赋予另一个变量。举一个简单的例子。
示例2:计算Student表中学生的平均入学成绩并打印。
Student表的数据如图所示,stu_enter_score列存放了学生的入学成绩
uwin电竞app官网下载 10
执行下面的语句

DECLARE @average int--声明@average变量
SET @average=(--将计算出的平均值赋值给@average
SELECT AVG(stu_enter_score)
FROM Student)
PRINT @average--打印@average的值

结果如图所示
uwin电竞app官网下载 11

3.3.4.SET语句选项

当创建或者更改T-SQL存储过程后,数据库引擎将保存SET QUOTED_IDENTIFIER和SET ANSI_NULLS的设置,执行存储过程时将使用这些原始设置而忽略任何客户端会话的ET QUOTED_IDENTIFIER和SET ANSI_NULLS设置。其他SET选项在创建或更改存储过程后不保存。

2.3.位运算符

位运算符包括与运算(&),或运算(|)和异或运算(^),可以对两个表达式进行位操作,这两个表达式可以是整型数据或二进制数据。Transact-SQL首先把整型数据转换为二进制数据,然后按位运算。举个简单的例子。
示例3:声明2个int型变量@num1,@num2,对这两个赋值且做与或异或运算。
执行下面的语句

DECLARE @num1 int,@num2 int
SET @num1=5 
SET @num2=6
SELECT @num1&@num2 AS 与,
@num1|@num2 AS 或,
@num1^@num2 AS 异或

结果如图所示
uwin电竞app官网下载 12
扩展示例4:写一个十进制转换为二进制的函数

CREATE FUNCTION Bin_con_dec(@dec int)--定义十进制转换为二进制函数
RETURNS varchar(20)
AS
BEGIN
DECLARE @quo int,@remainder varchar(20),@quo1 int
SET @quo=@dec
SET @remainder=''
WHILE @quo<>0
BEGIN
SET @quo1=@quo/2
SET @remainder=CAST(@quo%2 AS varchar(20)) @remainder
SET @quo=@quo1
END
RETURN @remainder
END

执行上面的函数后,运行下列语句验证函数正确性

PRINT dbo.Bin_con_dec(42)

结果为101010,函数定义正确。

3.4.使用存储过程

2.4.比较运算符

也称关系运算符,用于比较两个值的关系,常见的有等于(=),大于(>),小于(<),大于等于(>=),小于等于(<=),不等于(<>或!=)
示例5:从Student表中查询入学成绩在平均分以上的学生信息
Student表的数据如图所示
uwin电竞app官网下载 13
执行下列语句

DECLARE @ave int
SET @ave=(SELECT AVG(stu_enter_score) FROM Student)
SELECT *FROM Student
WHERE stu_enter_score>=@ave;

结果如下图所示
uwin电竞app官网下载 14

注:不能直接把代码写成下面的形式

SELECT * FROM Student
WHERE stu_enter_score>=AVG(stu_enter_score)

消息147,级别15,状态1,第2 行
聚合不应出现在WHERE 子句中,除非该聚合位于HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。

因为AVG是聚合函数。

本文由u赢电竞手机版发布于uwin电竞app官网下载,转载请注明出处:《SQL Server 2008从入门到精通》--20180716uwin电竞ap

关键词: