《SQL Server 2008自入门到精晓》–20180710

目录

1.应用Transact-SQL语言编程

就算SQL Server
2008供了图形化界面,但单发相同种植Transact-SQL语言会一向跟数据库引擎举行互相。依据实施效劳特色可以拿Transact-SQL语言分成3要命类:数据定义语言DDL,数据操纵语言DML,数据控制语言DCL。

1.1.数量定义语言DDL

举凡无限基础之Transact-SQL语言类,用来成立数据库暨开创,修改,删除数据库中的各个对象,为此外语言的操作提供靶。例如数据库,表,触发器,存储过程,视图,函数,索引,类型及用户等仍然数据库中之靶子。常见的DDL语句包括

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

1.2.数操纵语言DML

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

1.3.数控制语言DCL

涉及到权力管理之言语称为数据控制语言,紧要用以实践有关安全治本之操作。如与权限(GRANT),收回权限(REVOKE),拒绝给主体权限,并预防主体通过组要角色成员持续权限(DENY

1.4.Transact-SQL言语功底

1.4.1.常量与变量

常量不多说。在SQL Server
2008受,存在个别栽变量。一栽是系统定义和保安的全局变量,一种是用户定义用来保存中间结果的片变量。

1.4.1.1.系全局变量

系统全局变量分为两非凡类,一类是与自然SQL
Server连接或同当下处理有关的全局变量,如@@Rowcount代表如今一个言辞影响的行数。@@error表示保留如今履行操作的一无是处状态。一类似是暨任何SQL
Server系统有关的全局变量,如@@Version代表即SQL Server的版本音信。

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

结果如图所示
图片 1

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

结果如图所示
图片 2

2.运算符

2.1.算数运算符

在SQL Server
2008饱受,算数运算包括加(+)减(-)乘(*)除(/)取模(%)。举一个大概的例子。
示例1:在Student表中上加同排列,列名为stu_age,根据Student表的stu_birthday列计算stu_age列并插入数据。(演示插入整列数据的道)
Student表数据如图所示
图片 3
实践下的口舌

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

结果如图所示
图片 4

2.2.赋值运算符

虽然当号(=),将表明式的价与另一个变量。举一个简练的例证。
示例2:总结Student表中学生的平分入学战绩并打印。
Student表的数量如图所示,stu_enter_score列存放了生的入学战表
图片 5
行下的说话

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

结果如图所示
图片 6

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 异或

结果如图所示
图片 7
扩大示例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,函数定义是。

2.4.于运算符

呢称关系运算符,用于比单薄个价的涉嫌,常见的有等于(=),大于(>),小于(<),大于等于(>=),小于等于(<=),不齐(<>或!=)
示例5:从Student表中查询入学成绩在平均分以上之学习者音讯
Student表的多少如图所示
图片 8
履行下列语句

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

结果借使下图所示
图片 9

流淌:不可知直接拿代码写成下边的花样

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

消息147,级别15,状态1,第2 行
集不应出现在WHERE 子句被,除非该集在HAVING
子句或接纳列表所包含的子查询中,并且只要本着这进展联谊的排是外部引用。

盖AVG是聚合函数。

2.5.逻辑运算符

逻辑运算符的意向是指向规格举行测试。ALL,AND,ANY,BETWEEN,EXISTS,IN,LIKE,NOT,ALL,SOME。上边用SOME来比喻。SOME的来意是只要以同等组比受到,有些也true这即使吧true。
示例6:查询Student表中是否存在入学成绩超过平均分的学员,如若存在,输出true,不存输出false。
Student表的stu_enter_score列(入学成绩)数据如图所示
图片 10
尽下的说话

USE test
IF (SELECT AVG(stu_enter_score) FROM Student)<=SOME(SELECT stu_enter_score FROM Student)
PRINT 'true'
ELSE
PRINT 'false'
GO

结果如图所示
图片 11

2.6.连接运算符

加号(+)是字符串连接运算符,可以用她将字符串串连起来,在示例4的十进制转二上前制函数吃,就就此上了加号。
示例7:将Student表的stu_name列和stu_enter_score列放在同列突显,列名为score
Student表的多寡如图所示
图片 12
推行下列语句

SELECT stu_name+CAST(stu_enter_score AS VARCHAR(3)) AS score FROM Student

履行结果如图所示
图片 13

注:stu_enter_score列数据类型为int,加号只对字符串类型数据中,由此而由此CAST函数将stu_enter_score的数据类型转换为varchar(3),这样才能够促成字符串拼接。

2.7.一律头版运算符

一律元运算符只对一个表明式执行操作,该表明式可以是数字数据类型中的外一样栽多少类。SQL
Server 2008提供的均等长运算符包含正(+),负(-),位反(~)。
示例8:阐明一个int数据类型变量@num并赋值,对拖欠变量做正负位反操作。
执行下列语句

DECLARE @num INT
SET @num=45
SELECT +@num AS 正,-@num AS 负,~@num AS 位反
GO

结果如图所示
图片 14

流动:位反操作符用于得一个往往之补数,只好用来整数。

2.8.运算符的先期级

优先级 运算符
1 ~(位反)
2 *(乘),/(除),%(取模)
3 +(正),-(负),+(加),+(连接),-(减),&(位与)
4 =,>,<,>=,<=,<>,!=,!>,!<(比较运算符)
5 ^(位异或),位或(符号打不出来,前面有,自己翻)
6 NOT
7 AND
8 ALL,ANY,BETWEEN,IN,LIKE,ALL,SOME
9 =(赋值)

当表明式中之运算符有相同的预先级时,遵照她以表明式中之岗位,一首运算符按从左边为左运算,二初运算符(对少只表明式成效的运算符)按从左往右运算。
示例9:验证运算符优先级
行下列语句

DECLARE @result INT,@num INT
SET @num=45
SET @result=@num+(~@num)*4-@num/(~@num)
SELECT @result AS result
GO

结果如图所示
图片 15
算代码中之表达式
@result=@num+(~@num)4-@num/(~@num)
=@num+(-46)
4-@num/(-46)
=45+(-46)4-45/(-46)
=45+(-46)
4
=-139

3.操纵语句

3.1.BEGIN END语句块

BEGIN END可以定义SQL
Server语句块,使那多少个话语作为一如既往组报告句执行,允许告诉句嵌套。举例请见示例4

3.2.IF ELSE语句块

用以指定T-SQL语句的举办规范,若条件吧确实,则履行尺度表达式前边的言语,条件也假时,能够试用ELSE关键字指定要执行之T-SQL语句。举例请见示例4

3.3.CASE分支语句子

示例10:将Student表的学员,性别与籍贯打印出,要求籍贯只可以展现省内,省外或自治区。
Student表的数目如图所示
图片 16
推行下列语句

SELECT stu_name AS 姓名,stu_sex AS 性别,
(CASE stu_native_place
WHEN '浙江' THEN '省内'
WHEN '内蒙古' THEN '自治区'
WHEN '西藏' THEN '自治区'
WHEN '宁夏' THEN '自治区'
WHEN '新疆' THEN '自治区'
WHEN '广西' THEN '自治区'
ELSE '省外'
END) AS 籍贯 
FROM Student

结果如图所示
图片 17

3.4.WHILE语句

用来安装双重执行T-SQL语句或报告句块的规范。
示例11:用“*”在屏幕上输出一个幅为9底菱形。
尽下列语句

DECLARE @width int,@j int
SET @width=9--@width为菱形的最大宽度
SET @j=1--@j表示每行打印的“*”符号的个数
WHILE @j<=@width
BEGIN
PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)--SPACE函数打印n个空字符,REPLICATE打印n个特定字符串
SET @j=@j+2
END
SET @j=@width-2
WHILE @j>0
BEGIN
PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)
SET @j=@j-2
END

结果如图所示
图片 18

3.5.WAITFOR推语句

WAITFOR延迟语句可以给以它们今后的语以一个点名的时刻或者时间间隔后执行,可以挂于批处理,存储过程要业务的履。
示例12:在某时刻接触查询Student表学号为20180101底学生音信

BEGIN
WAITFOR TIME '15:03'--在15点03分查询
SELECT * FROM Student
WHERE stu_no='20180101'
END

示例13:在3分钟后查询Student表学号为20180102底学员消息

BEGIN
WAITFOR DELAY '00:03'--在3分钟后查询
SELECT * FROM Student
WHERE stu_no='20180102'
END

图片 19

3.6.RETURN无条件退出语句

该语句表示无条件截止查询,批处理依旧存储过程的尽。存储过程以及批判处理RETURN语句前边的口舌都不再举行。当在储存过程遭到应用该语句时,可以指定再次来到给调用应用程序、批处理如故过程的整数值。假诺RETURN未指定重返值,则存储过程的再次回到值是0

3.7.GOTO跳转语词

该语句使T-SQL批判处理的尽过反至指定标签。由于该语句破坏结构化语词的协会,尽量少用
示例13:将GOTO作为分支机制
执行下语句

DECLARE @Counter int;  
SET @Counter = 1;  
WHILE @Counter < 10  
BEGIN   
    SELECT @Counter  
    SET @Counter = @Counter + 1  
    IF @Counter = 4 GOTO Branch_One --Jumps to the first branch.  
    IF @Counter = 5 GOTO Branch_Two  --This will never execute.  
END  
Branch_One:  
    SELECT 'Jumping To Branch One.'  
    GOTO Branch_Three; --This will prevent Branch_Two from executing.  
Branch_Two:  
    SELECT 'Jumping To Branch Two.'  
Branch_Three:  
SELECT 'Jumping To Branch Three.';

结果如图所示
图片 20
当Counter=4时,执行GOTO语句子输出Branch
One,执行了这讲话之后便打破了WHILE循环,接着执行Branch_One语句被之GOTO,输出Branch
Three,截至。

注:在WHILE循环中采取GOTO会打破循环。

示例14:用GOTO语句实现示例11遭打印菱形的功力
履下列语句

DECLARE @width int,@j int,@i int
SET @width=9--@width为菱形的最大宽度
SET @j=1--@j表示每行打印的“*”符号的个数
SET @i=1--@i表示下一行打印第i行
Set3:PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)--SPACE函数打印n个空字符,REPLICATE打印n个特定字符串
SET @i=@i+1
IF @i<=(@width+1)/2
GOTO Set1
ELSE
GOTO Set2
Set1:
SET @j=@j+2
GOTO Set3
Set2:
SET @j=@j-2
IF @j>=1
GOTO Set3

结果如图所示
图片 21

3.8.TRY CATCH错误处理语句

使TRY块内部有误,会以决定传递让CATCH块内的语句组。TRY
CATCH构造捕捉所有严重级别大于10不过切莫汇合停数据库连接的不当。
示例15:TRY CATCH的示例
实践下列语句

BEGIN TRY
SELECT * FROM Student
SELECT 120/0 FROM Student
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS '错误信息'
END CATCH

履结果如图所示
图片 22
报句被3单select语句全部且推行了。假如将报错的select语句放到正常的select语句前边,正常的select语句还会免可知进可以吗?执行下列语句

BEGIN TRY
SELECT 120/0 FROM Student
SELECT * FROM Student
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS '错误信息'
END CATCH

结果如图所示
图片 23
正常select语句不能实施。TRY
CATCH语句的逻辑是,一旦TRY语句子块被起问题谈,即刻跳反到CATCH语句块,TRY语句块接下的说话不再举办。

4.时不时因而函数

4.1.数据类型转换函数

默认状况下SQL
Server会对有数据类型举办机动转换,这种转移称为隐式转换。境遇无法自动转换,则用由此CAST()函数和CONVERT()函数转换,这种转移称为显式转换。CAST()函数和CONVERT()函数的效果是一模一样的,CAST函数更易于拔取,CONVERT函数的独到之处是可以指定日期与数值格式。
示例16:将Student表中的学号转换为日期格式
脚两词语句的效率是同一的,执行下列语句

SELECT stu_name,CAST(stu_no AS DATE) AS 学号转换成日期,stu_enter_score,stu_birthday FROM Student
SELECT stu_name,CONVERT(DATE,stu_no) AS 学号转换成日期,stu_enter_score,stu_birthday FROM Student

结果如图所示
图片 24
示例17:用CONVERT()函数将stu_birthday转化成指定格式的日期
施行下列语句

SELECT stu_name,CONVERT(VARCHAR(20),stu_birthday,101) FROM Student
--CONVERT函数将DATE类型的stu_birthday字段转化为字符串,并限定了样式,代码101

结果如图所示
图片 25

流淌:在上述代码中,CONVERT(DATE,stu_birthday,101)这么写是没由此之。101格式码只对日期格式转化为字符串有效,其他格式转化为日期格式是无用的。

其余常用函数太简单了此不写了,略。

相关文章