Transact-SQL


前言

由于考试在即,本文只写一些与MySQL不太一样的内容,(也可能是一样的但是某佑根本不会的内容)

并且只是很粗略地过一遍,很多细致的地方还得进一步研究!

其他未提到的语法可参考本站的MySQL学习笔记

数据库操作

接下来涉及到的操作中,数据库名尽可能采用SelectCourse,DB等

数据库创建

CREATE DATABASE SelectCourse -- 创建数据库
ON PRIMARY 
(
NAME = 'data',               -- 主数据文件的逻辑名
FILENAME = 'E:\data',	    -- 主数据文件的物理名
SIZE = 10MB,                  -- 初始大小
FILEGROWTH = 10%             -- 增长率
)
LOG ON 
(
	NAME = 'log',             -- 日志文件逻辑名
    FILENAME = 'E:\log',		 -- 日志文件物理名
    SZIE = 1MB,                
    MAXSIZE = 20MB,
    FILEGROWTH = 10% 
)

数据库备份

BACKUP DATABASE SelectCourse
TO 'E:\bk_SelectCourse' 
WITH DIFFERENTIAL, INT

其中DIFFERENTIAL关键字是可以去掉的,其意义是保留设备上已有的内容,去掉的话则是覆盖

好吧,其实整个WITH都是可以省略的,INT参数意义不详(暂时也没找到参考资料)

数据库恢复

既然有备份,那自然有恢复啊

(诶,这个备份模式好像在哪里学过来着,究竟是哪里啊)

RESTORE DATABASE SelectCourse
FROM 'E:\bk_SelectCourse'
WITH FILE = 1, REPLACE

只知道REPLACE大概是强制替换,FILE参数意义不详

同样,WITH整个都可以省略

变量

概述

当发现有变量这种东西的时候,我还是小为震惊了一下——这可太不得了了!

有了变量之后,意味着很多逻辑处理能够在数据库内部完成了!

这种其妙发现带来的兴奋毫不次于发现CSS中可以使用变量时的惊喜!

这种设定对于我来说还算比较新颖,所以这一章稍微详细一点,咱先来看看T-SQL的发展背景。

Transact-SQL,即事务SQL,简称为T-SQL,是微软大爹开发的,是SQL的超集

好了,我们已经详细地了解了T-SQL的背景(MS的黑科技,知道牛逼就行了)

局部变量

这里的变量也有局部和全局之分。

一开始我还挺迷惑的,SQL语句不是选中之后再执行的吗,那这个局部和全局是按我选中的区域来动态划分作用域的吗?

试了一下结果并不是我想的这样。

用户自定义的变量,可以存储数值,字符串等类型,作用范围仅在某个程序内部。

语法如下:

DECLARE @name varchar(10) -- 声明局部变量name,类型是变长数组,长度上限是10
set @name = '沈某人'       -- 赋值
print @name 			 -- 打印

也就是局部变量名称前面需要带有@字符

全局变量

由系统提供的,用于存储一些系统信息,不能由用户定义。

全局变量的作用域并不局限于某个程序,而是任何程序随时可以调用。

@@ERROR  -- 最后一个T-SQL错误的错误号
@@IDENTITY -- 最后一次插入的标记值
@@LANGUAGE -- 当前使用语言的名称
@@MAX_CONNECTIONS -- 可以创建同时连接的最大数目
@@ROWCOUNT -- 受上一个SQL语言影响的行数
@@SERVERNAME -- 本地服务器的名称
@@TRANSCOUT -- 当前连接打开的事务数目
@@VERSION -- SQL SERVER的版本信息

没错,全局变量的标志是前置两个@字符

tip:局部变量名称支持中文

选择分支

几乎所有语言的分支都长一个样

但是这里竟然不太一样!!!

IF语句

IF @院系 = '计科院'
BEGIN
	PRINT '壮哉我计科院!'
END

其中BEGIN和END就是起到类似于{}花括号划定作用域的效果

当然,在其中只有一条语句时,依旧存在语法糖

IF @院系 = '计科院'
	PRINT '壮哉我计科院'

同样地,也有ELSE和ELSE IF语句,此处不再赘述

(应该有ELSE IF吧?没试过,不过我想应该是有的。有空试一试)

CASE语句

什么,竟然不是switch,爷青结!

SELECT Sname, location =
CASE Sdept 
	WHEN '计科院' THEN '明理楼'WHEN '机电院' THEN '明志楼',
	WHEN '化工院' THEN '明德楼',
	WHEN '石工院' THEN '明德楼',
	ELSE '思学楼'
END
FROM Student

循环

所有语言的循环都差不多

啊,什么?没有FOR循环?爷二度青结!

WHILE语句

WHILE (SELCT AVG(Ccredit) FROM Course ) < 5 -- 注意这个括号不是WHILE语句的,只是为了改变SELECT语句和小于比较的运算优先级
BEGIN
	UPDATE Course SET Ccredit = Credit + 1 -- 没有 ++ 这样的一目运算符
    IF (SELECT MAX(Ccredit) FROM Course) > 10 -- 同样地, 这个括号也只是为了改变运算优先级
    	BREAK   -- 是经典的BREAK语句
    ELSE
    	CONTINUE -- 应该不写也一样 
END

上述WHILE中SELECT语句的执行过程并不是一步到位的,而是一个元组一个元组地查询,每次查询都会用AVG函数计算平均值,一旦这个平均值不再满足<5这个条件,WHILE循环结束

存储过程

一开始我还以为是什么理论性的东西(望文生义

结果这东西还挺实在的哈

概念

存储过程(Strored Procedure)是一组为了完成特定功能的SQL语句集合

用户通过制定存储过程的名字,并且给出参数(如果需要参数的话)即可执行它。

看完上述概念想到什么啊?

这不就和C语言中的函数这一概念类似吗?

那么我们暂时吧存储过程看做函数吧(当然也注意区别,因为T-SQL中也有函数这一概念,这个我们后面再提)

那为什么要有这样一个设定呢?当然是为了懒啊!

存储过程的简单操作

创建存储过程

CREATE PROCEDURE proc_name
AS
BEGIN
 -- 里面写SELECT语句等各种T-SQL语句,此处不再赘述
END

使用存储过程

EXECUTE proc_name -- 熟悉的语句,有了Minecraft的感觉了

修改存储过程

ALTER PROCEDURE proc_name
AS
BEGIN
 -- 新的内容
END

删除存储过程

DROP PROCEDURE proc_name

触发器

我还以为触发器是单独的一章,结果和我说是一种特殊的存储过程

也叫 自执行存储过程,在满足特定条件的时候执行,而不用EXECUTE执行

简单使用过程如下:

CREATE TRIGGER tri_name
ON Student -- 这是针对的表
AFTER UPDATE -- 这是触发事件,可以有多个触发事件.此处为在更新之后.
AS  
BEGIN
 SELECT * FROM Student
END

其中AFTER可以替换为FOR或者INSTEAD OF,作用也就是顾名思义

另外UPDATE也可以替换为INSERT或者DELETE,作用依旧是顾名思义

登录、用户、角色管理

登录名、用户、角色的区分

  1. 登录名:数据库访问者需要登录到数据库服务器中,因此需要有一个登录号来通过安全控制的SQL Server验证的过程。
  2. 用户:是指对某个数据库具有访问和操作权限的访问者,这个用户身份需要被授予给登录名。
  3. 角色:特指具有一系列权限的身份,这个角色身份可以赋予给用户,此时这个用户就具有了该角色所有的权限。

登录名管理

CREATE LOGIN login_name WITH PASSWORD = '...'

DROP LOGIN login_name`

用户管理

CREATE USER user_name FOR LOGIN login_name`

DROP USER user_name`

角色管理

CREATE ROLE role_name

CREATE ROLE role_name AUTHORIZATION owner_name

EXEC sp_addrolemember 'role_name', 'user_name'

EXEC sp_droprolemember 'role_name', 'user_name'

DROP ROLE role_name

后记

总的来说T-SQL是相当的厉害啊,对于只有半吊子MySQL学习经验的我来说可谓是惊艳

但是可惜我几门考试接踵而至也腾不出多余的时间来系统地学习这门技术了,不过我想总有一天我还会再学习更多数据库相关知识的。

当然了,如果我发现本篇疏漏的较大的知识点,我也会找个时间添加上的。


文章作者: Serio
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Serio !
  目录