前言
由于考试在即,本文只写一些与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,作用依旧是顾名思义
登录、用户、角色管理
登录名、用户、角色的区分:
- 登录名:数据库访问者需要登录到数据库服务器中,因此需要有一个登录号来通过安全控制的SQL Server验证的过程。
- 用户:是指对某个数据库具有访问和操作权限的访问者,这个用户身份需要被授予给登录名。
- 角色:特指具有一系列权限的身份,这个角色身份可以赋予给用户,此时这个用户就具有了该角色所有的权限。
登录名管理:
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学习经验的我来说可谓是惊艳,
但是可惜我几门考试接踵而至也腾不出多余的时间来系统地学习这门技术了,不过我想总有一天我还会再学习更多数据库相关知识的。
当然了,如果我发现本篇疏漏的较大的知识点,我也会找个时间添加上的。