【SQL server速成之路】函数

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)




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



[]( )4.日期时间函数

-----------------------------------------------------------------------



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

  **(1)GETDATE函数**



GETDATE ( )




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



  **(2)DATEPAR函数**



DATEPART(datepart,date)




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



  **(3)DATEDIFF函数**



DATEDIFF(datepart,startdate,enddate)




  功能:按datepart指定的内容,返回startdate,enddate两个指定的日期时间之间的间隔,间隔可以以年、季度、月、周、天数或小时等为单位,这取决于datepart的取值。  

  参数类型与取值:datepart的取值范围如下表所示。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/878297ea667e46c299c70fed736c472c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L-Z5Liq5pi156ew5oiR5oOz5LqGMjDliIbpkp8=,size_12,color_FFFFFF,t_70,g_se,x_16)  

  【例】 编写程序根据读者的出生时间,计算其年龄。



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函数返回值如下表所示。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/da024bb5b6354fecb7c820a890fd941f.png)  

  **(3)@@FETCH\_STATUS**



  语法格式:



@@FETCH_STATUS




  功能:返回== FETCH 语句执行后游标的状态==。返回值类型为integer。@@FETCH\_STATUS返回值如表下所示。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/7b601c8af5f84eb1b875c3cfb88a7520.png)



[]( )🎆用户函数的定义与调用

===========================================================================



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



> (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)<function\_option>:标量函数的选项。



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



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”读者的借阅历史。

#  最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/87bd8a3ef359ecd1b546fb8984769071.jpeg)

![](https://img-blog.csdnimg.cn/img_convert/e201d5aa2b1ab6afea82a3be19a8aaee.png)

![](https://img-blog.csdnimg.cn/img_convert/c11f1ebfb5fb6fb33714188ce77c30ae.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618191877)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
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”读者的借阅历史。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-ZWYkIcV4-1715768858866)]

[外链图片转存中…(img-gq5Y83bB-1715768858867)]

[外链图片转存中…(img-CyIifD7R-1715768858867)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值