【SQL server速成之路】函数

?个人主页:这个昵称我想了20分钟
✨往期专栏:【速成之路】jQuery


?️专栏:【速成之路】SQL server
?往期回顾:
【SQL server速成之路】数据库基础
【SQL server速成之路】数据库和表(一)
【SQL server速成之路】数据库和表(二)
【SQL server速成之路】数据库的查询
【SQL server速成之路】数据库的视图和游标
【SQL server速成之路】T-SQL语言(一)
【SQL server速成之路】T-SQL语言(二)

【SQL server速成之路】函数

?系统内置函数

1.数学函数

(1)ABS函数

ABS ( numeric_expression ) 

功能:返回给定数字表达式的绝对值。参数numeric_expression为数字型表达式(bit 数据类型除外),返回值类型与numeric_expression 相同。

【例】 显示ABS 函数对3个不同数字的效果。

SELECT ABS(-5.0), ABS(0.0), ABS(8.0)

(2)RAND函数

RAND ([ seed ] ) 

功能:返回0到1之间的一个随机值。参数seed是指定种子值的整型表达式,返回值类型为float。如果未指定seed,则随机分配种子值。对于指定的种子值,返回的结果始终相同。

【例】 如下程序通过 RAND 函数产生随机数。

DECLARE @count int
SET @count = 5
SELECT RAND(@count) AS Rand_Num  

2.字符串处理函数

(1)ASCII函数

ASCII ( character_expression ) 

功能:返回字符表达式最左端字符的ASCII值。参数character_expression的类型为字符型的表达式,返回值为整型。
(2)CHAR函数

CHAR ( integer_expression ) 

功能:将ASCII码转换为字符。参数integer_expression为介于 0~255 之间的整数表达式,返回值为字符型。

(3)LEFT函数

LEFT ( character_expression , integer_expression ) 

功能:返回从字符串character_expression左边开始,由integer_expression指定个数的字符。参数character_expression:为字符型表达式,integer_expression:为整型表达式,返回值为varchar型。

【例】 返回书名最左边的 10 个字符。

SELECT LEFT(书名, 10) 
	FROM book
	ORDER BY ISBN
GO

(4)LTRIM函数

LTRIM ( character_expression )

功能:删除character_expression字符串中的前导空格,并返回字符串。参数character_expression为字符型表达式,返回值类型为varchar。

【例】 使用 LTRIM 字符删除字符变量中的起始空格。

DECLARE @string varchar(40)
SET @string = '    中国,一个古老而伟大的国家'
SELECT  LTRIM(@string)

(5)REPLACE函数

REPLACE (string_expression1,string_expression2,string_expression3)

功能:用第三个字符串表达式替换第一个字符串表达式中包含的第二个字符串表达式,并返回替换后的表达式。
【例】 用 REPLACE实现字符串的替换。

DECLARE @str1 char(20),@str2 char(4),@str3 char(20)
SET @str1='数据库原理'
SET @str2='原理'
SET @str3='概论'
SET @str3=REPLACE (@str1, @str2, @str3)
SELECT @str3

(6)SUBSTRING函数
语法格式:

SUBSTRING ( expression , start , length ) 

功能:返回expression中指定的部分数据。参数expression可为字符串二进制串textimage字段或表达式;StartLength均为整型,前者指定子串的开始位置,后者指定子串的长度(要返回的字节数)。如果 expression 是字符类型和二进制类型,则返回值类型与expression的类型相同,在其它情况下,参考下表。
【SQL server速成之路】函数
【例】 如下程序在一列中返回xs表中的姓氏,在另一列中返回表中学生的名。

SELECT SUBSTRING(姓名, 1,1), SUBSTRING(姓名, 2, LEN(姓名)-1)
	FROM xs
	ORDER BY 姓名

(7)STR函数
语法格式:

STR ( float_expression [ , length [ , decimal ] ] ) 

功能:将数字数据转换为字符数据。参数float_expression为float类型的表达式,Length用于指定总长度,包括小数点,Decimal指定小数点右边的位数,Length、Decimal必须均为正整型。返回值类型为char。

【例】 如下程序用于查询ISBN号978-7-111-21382-6书籍的书名和库存量。

DECLARE @str char(80)
SET @str=(SELECT 书名 FROM book WHERE ISBN='978-7-111-21382-6 ') + 
	'库存量' + STR((SELECT 库存量 FROM book WHERE ISBN='978-7-111-21382-6 '))
SELECT @str

3.系统函数

系统函数用于对SQL Server中的值、对象和设置进行操作并返回有关信息。
(1)CASE函数
CASE有两种使用形式:一种是简单的CASE函数,另一种是搜索型的CASE函数

① 简单的 CASE 函数。语法格式:

CASE input_expression                 
	WHEN when_expression THEN result_expression […n ]
[ ELSE else_result_expression  ]
END

功能:计算input_expression表达式之值,并与每一个when_expression表达式的值比较,若相等,则返回对应的result_expression表达式之值;否则返回else_result_expression表达式的值。

② 搜索型的CASE 函数。语法格式:

CASE
	WHEN Boolean_expression THEN result_expression […n ]
	[ ELSE else_result_expression]
END

功能:按指定顺序为每个 WHEN 子句的 Boolean_expression 表达式求值,返回第一个取值为 TRUE 的 Boolean_expression 表达式对应的 result_expression表达式之值;如果没有取值为TRUE的Boolean_expression表达式,则当指定 ELSE 子句时,返回 else_result_expression 之值;若没有指定 ELSE 子句,则返回 NULL。

【例】 使用CASE函数对读者按性别分类。

/*使用带有简单 CASE 函数的 SELECT 语句*/
SELECT 借书证号,sex= 
 		CASE 性别
			WHEN 0 THEN '男生'
			WHEN 1 THEN '女生'
 		END
	FROM xs

使用第二种格式的CASE语句则可以使用以下T-SQL语句:

SELECT 借书证号, 姓名, 专业, SEX= 
	 		CASE 
				WHEN 性别=1 THEN '男'
				WHEN 性别=0 THEN '女'
				ELSE  '无'
			END
	FROM xs

(2)CAST 和 CONVERT函数
常用的类型转换有如下几种:

① 日期型→字符型。
② 字符型→日期型。
③ 数值型→字符型。

语法格式:

CAST ( expression AS data_type ) 
CONVERT (data_type[(length)], expression)

功能:将expression表达式的类型转换为data_type所指定的类型。

【例】 如下程序将检索库存量为3~10的ISBN、书名,并将库存量转换为char(20)。

/*如下例子同时使用 CAST 和 CONVERT*/
-- 使用CAST实现.
SELECT ISBN,书名,库存量
	FROM book
	WHERE CAST(库存量 AS char(20)) LIKE '__' and 库存量>=3 and 库存量10
GO
-- 使用 CONVERT实现.
SELECT ISBN,书名,库存量
	FROM book
	WHERE CONVERT(char(20),库存量) LIKE '__'  and 库存量>=3 and 库存量10
GO

(3)COALESCE函数

COALESCE ( expression [ ,…n ] ) 

功能:返回参数表中第一个非空表达式的值,如果所有表达式均为 NULL,则 COALESCE 返回 NULL 值。
COALESCE(expression1,...n) 与如下形式的CASE 函数等价:

CASE
   	WHEN (expression1 IS NOT NULL) THEN expression1
   	...
   	WHEN (expressionN IS NOT NULL) THEN expressionN
	ELSE NULL

(4)ISNUMBRIC函数。
ISNUMBRIC函数用于判断一个表达式是否为数值类型

ISNUMBRIC(expression)

如果输入表达式的计算值为有效的整数浮点数moneydecimal类型时,ISNUMERIC返回1;否则返回 0。

4.日期时间函数

日期函数可用在 SELECT 语句的选择列表或用在查询的 WHERE 子句中
(1)GETDATE函数

GETDATE ( )

功能:按SQL Server标准内部格式返回当前系统日期和时间。返回值类型:datetime

(2)DATEPAR函数

DATEPART(datepart,date)

功能:按datepart指定格式返回日期,返回值类型为int。datepart的取值可为非缩写形式或缩写形式。参数date的类型应为datetimesmalldatetime

(3)DATEDIFF函数

DATEDIFF(datepart,startdate,enddate)

功能:按datepart指定的内容,返回startdateenddate两个指定的日期时间之间的间隔,间隔可以以年、季度、月、周、天数或小时等为单位,这取决于datepart的取值
参数类型与取值:datepart的取值范围如下表所示。
【SQL server速成之路】函数
【例】 编写程序根据读者的出生时间,计算其年龄。

USE xsbook
SET NOCOUNT ON
DECLARE @startdate datetime
SET @startdate = getdate()
SELECT DATEDIFF(yy,出生时间,@startdate )  AS 年龄
	FROM xs

(4)YEAR、MONTH、DAY函数
这三个函数分别返回指定日期的年、月、天部分,返回值都为整数。语法格式:

YEAR(date)
MONTH(date)
DAY(date)

5.游标函数

游标函数用于返回游标的有关信息。主要有如下游标函数:

(1)@@CURSOR_ROWS
语法格式:

@@CURSOR_ROWS

功能:返回最后打开的游标中当前存在的满足条件的行数。

(2)CURSOR_STATUS
语法格式:

CURSOR_STATUS
(	 { 'local' , 'cursor_name' }  		/*指明数据源为本地游标*/
	| { 'global' , 'cursor_name' }  	     	/*指明数据源为全局游标*/
	| { 'variable' , cursor_variable }		/*指明数据源为游标变量*/
) 

功能:返回游标状态是打开还是关闭CURSOR_STATUS函数返回值如下表所示。
【SQL server速成之路】函数
(3)@@FETCH_STATUS

语法格式:

@@FETCH_STATUS

功能:返回== FETCH 语句执行后游标的状态==。返回值类型为integer@@FETCH_STATUS返回值如表下所示。
【SQL server速成之路】函数

?用户函数的定义与调用

根据用户定义函数返回值的类型,可将用户定义函数分为如下两个类别:

(1)标量函数:用户定义函数返回值为标量值,这样的函数称为标量函数。
(2)表值函数:返回值为整个表的用户定义函数为表值函数。根据函数主体的定义方式,表值函数又可分为内嵌表值函数或多语句表值函数。

1.标量函数

(1)标量函数的定义。
语法格式:

CREATE FUNCTION [ 数据库架构名>. ] 函数名> 		/*函数名部分*/
( [ { @形参名> [ AS ][ type_schema_name.]数据类型> 		/*形参定义部分*/
  [ = default ] [ READONLY ] } [ ,...n ] ])					
RETURNS 返回类型>					/*返回参数的类型*/
  [ WITH function_option> [ ,...n ] ]			                 /*函数选项定义*/
  [ AS ]
  BEGIN 
        function_body 					/*函数体部分*/
    RETURN scalar_expression				/*返回语句*/
  END
[ ; ]

其中:

function_option>::= 
{
   [ ENCRYPTION ]
  | [ SCHEMABINDING ]
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}

说明:

(1):函数名必须符合标识符的规则,对其架构来说该名在数据库中必须是唯一的。
(2):CREATE FUNCTION语句中可以声明一个或多个参数,用@符号作为第一个字符来指定形参名,每个函数的参数局部于该函数。
(3):参数的数据类型可为系统支持的基本标量类型,不能为timestamp类型、用户定义数据类型、非标量类型(如cursor和table)。
(4):函数使用RETURNS语句指定用户定义函数的返回值类型。
(5)function_body:由T-SQL语句序列构成的函数体。
(6):标量函数的选项。

从上述语法形式,归纳出标量函数的一般定义形式如下:

CREATE FUNCTION [所有者名.] 函数名
( 参数1 [AS] 类型1 [ = 默认值 ] ) [ ,...参数n [AS] 类型n [ = 默认值 ] ] ] ) 
RETURNS 返回值类型
[ WITH 选项 ] 
[ AS ]
BEGIN
	函数体
	RETURN 标量表达式
END

【例】 定义一个函数,按性别计算当前所有读者的平均年龄。

① 为了计算平均年龄,创建如下视图:

USE xsbook
GO
IF EXISTS(SELECT name FROM sysobjects WHERE name='VIEW_AGE' AND type='v')
	DROP VIEW VIEW_AGE
GO
CREATE VIEW VIEW_AGE
	AS SELECT 借书证号,性别,datepart(yyyy,GETDATE ( ))-datepart(yyyy,出生时间) as 年龄
		FROM xs
GO

② 创建函数aver_age,用于按性别计算当前读者的平均年龄。

/*检查该函数aver_age是否已定义,若已定义,则删除之*/
IF EXISTS(SELECT name FROM sysobjects WHERE name='aver_age' AND type='FN')
	DROP FUNCTION aver_age
GO
CREATE FUNCTION aver_age(@sex bit) RETURNS int
	AS
	BEGIN
		DECLARE @aver int
		SELECT @aver=
			( SELECT avg(年龄) 
				FROM VIEW_AGE 
				WHERE 性别=@SEX
			)
		RETURN @aver
	END
GO

(2)标量函数的调用

可按以下方式调用标量函数:

① 在SELECT语句中调用。调用形式:

架构名.函数名(实参1,,实参n)

实参可为已赋值的局部变量或表达式

【例】 如下程序对上例定义的aver_age函数进行调用。

/*定义局部变量*/
DECLARE @sex bit
DECLARE @aver1 int
/*给局部变量赋值*/
SELECT @sex = 1
SELECT @aver1=dbo.aver_age(@sex)       /*调用用户函数,并将返回值赋给局部变量*/
/*显示局部变量的值*/
SELECT @aver1 AS '男性读者的平均年龄' 

② 利用EXEC语句执行
用T-SQL的EXECUTE(EXEC)语句调用用户函数时,参数的标识次序与函数定义中的参数标识次序可以不同。

调用形式:

EXEC 变量名=架构名名.函数名 实参1,,实参n 

EXEC变量名=架构名.函数名 形参名1=实参1,, 形参名n=实参n

【例】 利用EXEC调用用户定义函数aver_age。

DECLARE @aver1 int				/*显示局部变量的值*/
EXEC @aver1 = dbo.aver_age  @sex = 0
/*通过EXEC调用用户函数,并将返回值赋给局部变量*/
SELECT @aver1 AS '女性读者的平均年龄'

2.内嵌表值函数

内嵌表值函数是返回记录集的用户自定义函数,可用于实现参数化视图的功能。例如,有如下视图:

CREATE VIEW View1 
	AS
	SELECT 借书证号, 姓名
		FROM xsbook.dbo.xs
		WHERE 专业= '计算机'

若希望设计更通用的程序,让用户能指定感兴趣的查询内容,可将WHERE 专业= ‘计算机’ 替换为 WHERE 专业= @para,@para用于传递参数,但视图不支持在 WHERE 子句中指定搜索条件参数,为解决这一问题,我们可定义内嵌表值函数,如下例所示。

/*内嵌表值函数的定义*/
IF EXISTS(SELECT name FROM sysobjects WHERE name='fn_View1' AND TYPE='IF')
	DROP FUNCTION fn_View1
GO
CREATE FUNCTION fn_View1 ( @Para char(12) )
	RETURNS TABLE
	AS RETURN
		( SELECT 借书证号,姓名
			FROM dbo.xs
			WHERE 专业= @para
		)
GO
/*内嵌函数的调用*/
SELECT * FROM fn_View1 (N'计算机')
GO

下面介绍内嵌表值函数的定义及调用。

(1)内嵌表值函数的定义
语法格式:

CREATE FUNCTION [ 数据库架构名>. ] 函数名> 			/*定义函数名部分*/
( [ { @形参名> [ AS ] [ type_schema_name. ]数据类型> 
  [ = default ] } [ ,...n ] ])															/*定义参数部分*/
RETURNS TABLE																	/*返回值为表类型*/
  [ WITH function_option> [ ,...n ] ]										/*定义函数的可选项*/
  [ AS ]
  RETURN [ ( ] select_stmt [ ) ]							/*通过SELECT语句返回内嵌表*/
[ ; ]

② 定义如下内嵌表值函数:

IF EXISTS(SELECT name FROM sysobjects WHERE name='fn_query' AND TYPE='IF')
	DROP FUNCTION fn_query
GO
CREATE FUNCTION fn_query ( @READER_ID char(8) )
RETURNS TABLE
AS RETURN
(
	SELECT *
		FROM  dbo.jyls
		WHERE dbo.jyls.借书证号= @READER_ID
)

(2)内嵌表值函数的调用。
内嵌表值函数只能通过SELECT语句调用,调用时,可以仅使用函数名
【例】 调用fn_query()函数,查询借书证号为“131101”读者的借阅历史。

SELECT *
	FROM dbo.fn_query('131101') 

3.多语句表值函数

(1)多语句表值函数的定义
语法格式:

CREATE FUNCTION [ 数据库架构名>. ] 函数名> 			/*定义函数名部分*/
( [ { @形参名> [ AS ] [ type_schema_name. ]数据类型> 
  [ = default ] } [ ,...n ] ])								/*定义参数部分*/
RETURNS @return_variable TABLE  table_type_definition >	      /*定义作为返回值的表*/
  [ WITH function_option> [ ,...n ] ]						/*定义函数的可选项*/
  [ AS ]
  BEGIN 
        function_body 								/*定义函数体*/
    RETURN
  END
[ ; ]

其中:

table_type_definition>:: = 			/*定义表,参考第3章*/
( {  column_definition> column_constraint> } 
    [ table_constraint> ] [ ,...n ]
) 

(2)多语句表值函数的调用

多语句表值函数的调用与内嵌表值函数的调用方法相同。如下例子是上述多语句表值函数book_readers( )的调用。

【例】 查询ISBN为978-7-111-21382-6的书名及当前的所有读者。

SELECT * 
	FROM xsbook.dbo.book_readers('978-7-111-21382-6')

语句执行结果如图所示。
【SQL server速成之路】函数

4.用户定义函数的删除

对于一个已创建的用户定义函数,可有两种方法删除:

(1)通过对象资源管理器删除,此方法非常简单,请读者自己练习;
(2)利用T-SQL语句DROP FUNCTION删除。

语法格式:

DROP FUNCTION { [数据库架构名>. ] 函数名> } [ ,...n ] 

可以一次删除一个或多个用户定义函数。

【SQL server速成之路】函数

文章来源于互联网:【SQL server速成之路】函数

DevOps后端技术服务器开发

〖Docker指南⑤〗学习Dockerfile,看这一篇就够了

2022-5-31 12:58:29

DevOps后端技术

分布式协调服务-ZooKeeper

2022-5-31 13:00:20

搜索