【数据库原理】Transact-SQL

Transact-SQL.

SQL Server在支持标准SQL语言的同时,对其进行了扩充,引入Transact-SQL,简称T-SQL,它是使用SQL Server的核心,通过它可以定义变量、使用控制流语句、自定义函数以及自定义存储过程等,极大地拓展了SQL Server的功能。在SQL Server-DBMS中,存储过程触发器具有重要的作用,存储过程和触发器都是SQL语句和控制流语句的集合。
SQL是DBMS的标准语言,标准的SQL语句几乎可以不加修改地应用于所有RDBMS上,但它并不支持流程控制,使用起来有时会不方便。因此,大型的RDBMS都在标准SQL的基础上,结合自身特点推出了可以编程的、结构化的SQL语言,例如我们这里SQL Server的T-SQL,以及Oracle 11g的PL/SQL。T-SQL最主要的用途就是设计服务器端能够在后台执行的程序块,例如存储过程触发器

变量.

熟悉高级语言就不会对于变量感到陌生,SQL Server中的变量也很很多高级语言一样,分为全局变量和局部变量,但又存在一些不同。全局变量由系统定义并维护,用户只能使用预先说明及定义了的全局变量,并且权限是【只读】的,也就是用户只能读取,而不能修改或注销;局部变量由用户定义并赋值,并且用途和高级语言中的变量几乎相同。有一点时需要注意的,在SQL Server中使用全局变量,需要以【@@变量名】的形式,使用局部变量需要以【@变量名】的形式。
在这里插入图片描述

局部变量.

局部变量的名称是不能与全局变量相同的,它的作用范围局限于其声明所在的批处理、存储过程或触发器中,并且SQL Server中的局部变量名大小写不敏感。局部变量常用于存储查询得到的数据,当作程序执行过程中的临时变量。

  • 【声明方式】T-SQL提供DECLARE语句来声明局部变量,且变量名必须加以前缀@,其语法格式如下,其中的TYPE可以是SQL Server支持的所有数据类型:
DECLARE @Var_1 TYPE,@Var_2 TYPE,...,@Var_n TYPE
  • 【赋值方式】T-SQL中并不支持很多高级语言中Var=Value这样的赋值方式,而是必须使用SELECTSET命令来给变量赋值,语法格式如下:
SELECT @Var=Value

SET @Var=Value

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运算符.

T-SQL中的运算符基本和C语言中一致。
在这里插入图片描述
【算术运算符】算术运算符对两个表达式执行数学运算,参与运算的
表达式必须是数值数据类型或能够进行算术运算的其他数据类型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【比较运算符】
在这里插入图片描述
【逻辑运算符】

在这里插入图片描述
【按位运算符】

在这里插入图片描述
【一元运算符】
在这里插入图片描述
【优先级与结合性】
在这里插入图片描述

批处理语句.

批处理是包含一个或多个T-SQL语句的一个单元,当中的所有语句被整合成一个执行计划,一个批处理内的所有语句要么被放在一起通过解析,要么一句都不会被执行。批处理的语法是使用GO语句将多条SQL语句进行分隔,其中每两个GO语句之间的代码就是一个批处理单元,每一个批处理单元会被单独地对待,所以不会因为一个单元中的错误,导致所有的语句都被停止运行,例如:

USE Teach
GO
SELECT * FROM SC
SELECT COUNT(*) FROM S
GO

流程控制语句.

T-SQL使用的流程控制语句与常见的程序设计语言类似,使其能够产生控制程序执行及流程分支的作用。主要有以下几种控制语句:

  • BEGIN…END
  • IF…ELSE
  • CASE
  • WHILE
  • WAITFOR
  • GOTO
  • RETURN

● 使用BEGIN…END语句创建一个由一条语句或多条语句构成的程序块,其语法格式如下所示:

BEGIN
	<命令行或程序块>
END

在这里插入图片描述
● 使用IF…ELSE语句创建条件语句,其语法格式如下,其中ELSE子句也是可以省略的:

IF <条件表达式> 
	<命令行或程序块>
ELSE 
	<命令行或程序块>

【例】从数据库Teach中的SC数据表中求出学号S1同学的平均成绩,如果此成绩或等于60分,则输出’pass’信息,否则,输出’fail’信息。

USE Teach
GO
IF (SELECT AVG(SCORE)FROM SC WHERE SNO=‘S1’)>=60
	PRINT ‘pass’
ELSE
	PRINT ‘fail’
GO

IF语句还有一种变体是IF EXISTS|NOTEXISTS语句,其实和普通的IF没有本质区别,其语法如下:

IF EXISTS|NOT EXISTS (SELECT 子查询)
	<命令行或程序块>
ELSE 
	<命令行或程序块>

在这里插入图片描述
【例】从数据库Teach中的S表中读取学号S1同学记录,如果存在,则输出’存在记录’,否则,输出’不存在记录’。

USE Teach
GO
DECLARE @message VARCHAR(255)
IF EXISTS (SELECT * FROM S WHERE SNO=‘S1’)
	SET @message=‘存在记录’
ELSE
	SET @message=‘不存在记录’
PRINT @message
GO

● 当存在多种条件判断时,可以使用CASE语句,通过判断CASE后面表达式的取值,找到对应的WHEN,然后执行THEN后的表达式,执行后跳出CASE。如果没有ELSE子句,则所有比较失败后,反馈NULL,如果存ELSE子句,ELSE是没有任何匹配的WHEN时,执行的内容。其语法格式如下:

CASE <表达式>
	WHEN <表达式> THEN <表达式> 
	…
	WHEN <表达式> THEN <表达式>
	ELSE <表达式>
END

【例】从数据库Teach中的S表中选取SNO和Sex,如果Sex字段为’男’,则输出’M’;如果为’女’,则输出’F’。

USE Teach
GO
SELECT SNO, Sex=
	CASE sex
		WHEN‘男’THEN ‘M’
		WHEN‘女’THEN ‘F’
	END
FROM S
GO

WHILE…CONTINUE…BREAK语句,当需要循环结构时,可以使用WHILE语句,通过WHILE后条件表达式情况,判读循环是否终止。如果循环未结束,则执行BEGINEND标注的内容。其语法如下所示:

WHILE <条件表达式>
BEGIN
	<命令行或程序块>
	[BREAK]
	[CONTINUE]
	[命令行或程序块]
END

【例】计算输出1-100之间能够被3整除的数的总和及个数。

DECLARE @s SMALLINT,@i SMALLINT,@nums SMALLINT 
SET @s=0
SET @i=1
SET @nums=0
WHILE (@i<=100)
	BEGIN
		IF (@i%3=0)
			BEGIN
				SET @s=@s+@i
				SET @nums=@nums+1
			END
		SET @i=@i+1
		END
PRINT @s
PRINT @nums

● 当程序需要阻塞一段时间的时候,可以使用WAITFOR实现。

【例】等待1小时2分零3秒后才执行SELECT语句

WAITFOR DELAY '01:02:03'
SELECT * FROM S

【例】指定在11:24:00时间点时开始执行SELECT语句

WAITFOR TIME '11:24:00'
SELECT * FROM S

DELAY:用来设定等待的时间,最多可达24小时;TIME:用来设定等待结束的时间点。

● 将执行流程改变到由标签指定的位置。系统跳过GOTO后边的语句。

DECLARE @s SMALLINT,@i SMALLINT
SET @i=1
SET @s=0
BEG:				/*标号*/
IF (@i<=10)
	BEGIN
		SET @s=@s+@i
		SET @i=@i+1
		GOTO BEG 	/*使程序跳转到标号为BEG的地方执行*/
	END
PRINT @s

● 可以在任意位置使用RETURN退出,系统将不会执行RETURN后的语句。
RETURN语句不能返回NULL值。SQL Server保留−1~−99之间的返回值作为系统使用。
在这里插入图片描述

常用命令.

  • BACKUP用于将数据库内容或其事务处理日志备份到存储介质上(软盘、硬盘、磁带等)。
  • DBCC用于验证数据库完整性、查找错误、分析系统使用情况等。
  • EXECUTEEXEC命令用来执行存储过程 。
  • KILL命令用于终止某一过程的执行。
  • PRINT命令向客户端返回一个用户自定义的信息,即显示一个字符串、局部变量或全局变量。
  • RAISERROR用于在SQL Server 系统返回错误信息时,同时返回用户指定的信息。
  • SHUTDOWN命令用于停止SQL Server 的执行。
  • USE命令用于改变当前使用的数据库为指定的数据库。
  • SET命令有两种用法:用于给局部变量赋值;用于用户执行SQL 命令时,SQL Server 处理选项的设定 。

内置函数.

函数是能够完成特定功能并返回处理结果的一组T-SQL语句,处理结果称为“返回值”,处理过程称为“函数体”。 函数可以用来构造表达式,可以出现在SELECT语句的选择列表中,也可以出现在WHERE子句的条件中。SQL Server的内置函数包括:

  • 统计函数
  • 算术函数
  • 字符串函数
  • 日期函数
  • 自定义函数

下面是一些常用的内置函数:

  • STDEV函数返回表达式中所有数据的标准差。
  • STDEVP 函数返回表达式中所有数据的总体标准差。
  • 在这里插入图片描述在这里插入图片描述
  • ASCII函数返回字符表达式最左端字符的ASCII码值。
  • CHAR函数用于将ASCII 码转换为字符。
  • LOWER函数用于把字符串全部转换为小写。
  • UPPER函数用于把字符串全部转换为大写。
  • STR函数用于把数值型数据转换为字符型数据。
  • LTRIM函数用于把字符串头部的空格去掉。
  • RTRIM函数用于把字符串尾部的空格去掉 。
  • LEFT(character_expression, integer_expression)函数返回的子串是从字符串最左边起到第integer_expression个字符的部分。对应的还有RIGHT(character_expression, integer_expression)函数返回的子串是从字符串右边第integer_expression个字符起到最后一个字符的部分。
  • CHARINDEX(substring_expression,expression)函数返回字符串中某个指定的子串出现的开始位置。

用户自定义函数。

  • 创建标量值函数;
  • 创建内联表值函数;
  • 多语句表值函数.

数值函数返回结果为单个数据值;表值函数返回结果集(table数据类型)。标量值函数的函数体由一条或多条T-SQL语句组成,这些语句以BEGIN开始,以END结束。

【例】自定义一个标量函数Fun1,判断一个整数是否为素数,如果为素数,则函数返回1,否则返回0,待判断的数通过参数传给函数。

CREATE FUNCTION dbo.Fun1(@n AS INT)
RETURNS INT
AS 
BEGIN 
	DECLARE @i INT
	DECLARE @sign INT
	SET @sign=1
	SET @i=2 
	WHILE @i<=SQRT(@n)
		BEGIN
			IF @n % @i=0
				BEGIN
					SET @sign=0
					BREAK
				END
			SET @i=@i+1
		END
	RETURN @sign
END

调用:SELECT dbo.Fun1(13).

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/108117787