前言

在关系型数据库中除了前面几篇基本的数据库和数据表操作之外,还提供了可编程性的函数、存储过程、事务、触发器及游标。

本文介绍的是函数。

函数分为两种:

  1. 系统函数
  2. 用户自定义函数

准备工作

这里以银行存取款为例说明。

1、创建数据表

  1. --创建账户信息表
  2. create table AccountInfo
  3. (
  4. --账户ID
  5. CustID int identity(1,1) primary key,
  6. --帐户名称
  7. CustName varchar(20) not null,
  8. --身份证号
  9. IDCard varchar(18),
  10. --电话
  11. TelePhone varchar(13) not null,
  12. --地址
  13. Address varchar(50) default('地址不详')
  14. )
  15. go
  16. --创建卡信息表
  17. create table CardInfo
  18. (
  19. --银行卡卡号
  20. CardID varchar(19) primary key,
  21. --银行卡密码
  22. CardPassWord varchar(6) not null default('888888'),
  23. --身份证号
  24. CustID int references AccountInfo(CustID),
  25. --存款类型
  26. SaveType varchar(10) not null ,
  27. --开户日期
  28. OpenDate datetime not null default(getdate()),
  29. --开户金额
  30. OpenMoney money not null check(OpenMoney>1),
  31. --可用余额
  32. LeftMoney money not null check(LeftMoney>1),
  33. --是否挂失
  34. IsLost varchar(2) not null default('否')
  35. )
  36. go
  37. --交易信息表
  38. create table TransInfo
  39. (
  40. --交易编号
  41. transID int identity primary key,
  42. --银行卡卡号
  43. CardID varchar(19) not null,
  44. --交易类型
  45. TransType varchar(4) not null,
  46. --交易金额
  47. TransMoney money not null,
  48. --交易时间
  49. TransDate datetime default(getdate())
  50. )
  51. go
  52. /*
  53. 1.使用T-SQL语句为交易信息表(TransInfo)的银行卡卡号(CardID)字段创建外键
  54. */
  55. --外键(银行卡卡号CardID)
  56. alter table [dbo].TransInfo with check add constraint [fk_CardInfo_TransInfo] foreign key(CardID)
  57. references [dbo].[CardInfo] (CardID)
  58. go
  59. /*
  60. 2.使用T-SQL语句为账户信息表(AccountInfo)的银行卡卡号(IDCard)字段创建唯一约束
  61. */
  62. alter table [dbo].[AccountInfo] add unique (IDCard ASC)
  63. go
  64. /*
  65. 3.使用T-SQL语句创建约束,使银行卡信息表(CardInfo)的银行卡卡号(CardID)字段值长度只能为19位
  66. */
  67. alter table [dbo].[CardInfo] add constraint CK_CardID check(len(CardID) = 19)
  68. go
  69. /*
  70. 4.使用T-SQL语句使交易信息表(TransInfo)的交易类型(TransType)字段只能选择'存款'和'取款',
  71. 银行卡信息表(CardInfo)的存款类型(SaveType)字段只能选择'定期'和'活期'
  72. */
  73. alter table [dbo].TransInfo add constraint CK_TransType
  74. check(TransType = '存款' or TransType = '取款')
  75. go
  76. alter table [dbo].CardInfo add constraint CK_SaveType
  77. check(SaveType = '定期' or SaveType = '活期')
  78. go

2、插入基本数据

  1. --插入三个账户信息
  2. insert into AccountInfo values
  3. ('孙悟空','422322001502110017','027-88888888','花果山'),
  4. ('唐僧','420322001902140019','027-85368962','大唐'),
  5. ('沙和尚','410340001572144714','13295654665','通天河')
  6. insert into CardInfo values
  7. ('1027 3526 1536 1135','888888',1,'定期',default,500,500,'否'),
  8. ('1029 3326 1536 1235','888888',2,'活期',default,1500,1500,'否'),
  9. ('1324 3626 7532 1935','888888',1,'活期',default,4500,4500,'否')

函数调用

  1. SELECT 字段列表/* FROM <函数名称>([参数列表]);

系统函数

数据库系统定义的函数,即内置函数。

函数列别 说明
聚合函数 执行的操作是将多个值合并为一个值。例如 COUNT、SUM、MIN 和MAX。
配置函数 是一种标量函数,可返回有关配置设置的信息。
加密函数 支持加密、解密、数字签名和数字签名验证。
游标函数 返回有关游标状态的信息。
日期和时间函数 可以更改日期和时间的值。
数学函数 执行三角、几何和其他数字运算。
元数据函数 返回数据库和数据库对象的属性信息。
排名函数 是一种非确定性函数,可以返回分区中每一行的排名值。
行集函数 返回可在 Transact-SQL 语句中表引用所在位置使用的行集。
安全函数 返回有关用户和角色的信息。
字符串函数 可更改 char、varchar、nchar、nvarchar、binary 和 varbinary 的值。
系统函数 对系统级的各种选项和对象进行操作或报告。
系统统计函数 返回有关 SQL Server 性能的信息。
文本和图像函数 可更改 text 和 image 的值。

具体的函数如果不清楚请自行搜索,本文着重介绍用户自定义函数。


用户自定义函数

除了系统提供的函数,用户可以根据自己的需求自定义函数;

用户自定义函数,顾名思义,就是数用户自己定义的函数;

用户自定义函数分为两类:表值函数和标量值函数;

其中,表值函数也分两种:内联表值函数和多语句表值函数。


表值函数

表值函数是返回一个Table类型,相当与一张存储在内存中的一张虚拟表。

内联表值函数

语法

  1. CREATE FUNCTION <函数名称>
  2. (
  3. -- 添加函数所需的参数,可以没有参数
  4. [<@param1> <参数类型>]
  5. [,<@param1> <参数类型>]…
  6. )
  7. RETURNS TABLE
  8. AS
  9. RETURN
  10. (
  11. -- 查询返回的SQL语句
  12. SELECT查询语句
  13. )

示例

  1. /*
  2. * 创建内联表值函数,查询交易总额大于1W的开户人个人信息
  3. */
  4. create function getCustInfo()
  5. returns @CustInfo table --返回table类型
  6. (
  7. --账户ID
  8. CustID int,
  9. --帐户名称
  10. CustName varchar(20) not null,
  11. --身份证号
  12. IDCard varchar(18),
  13. --电话
  14. TelePhone varchar(13) not null,
  15. --地址
  16. Address varchar(50) default('地址不详')
  17. )
  18. as
  19. begin
  20. --为table表赋值
  21. insert into @CustInfo
  22. select CustID,CustName,IDCard,TelePhone,Address from AccountInfo
  23. where CustID in (select CustID from CardInfo
  24. where CardID in (select CardID from TransInfo group by CardID,transID,TransType,TransMoney,TransDate having sum(TransMoney)>10000))
  25. return
  26. end
  27. go
  28. -- 调用内联表值函数
  29. select * from getCustInfo()
  30. go

多语句表值函数

语法

  1. CREATE FUNCTION <函数名称>
  2. (
  3. -- 添加函数所需的参数,可以没有参数
  4. [<@param1> <参数类型>]
  5. [,<@param1> <参数类型>]…
  6. )
  7. RETURNS
  8. <@定义的表名> TABLE
  9. (
  10. -- 添加返回数据表的列
  11. <列名1> <数据类型1>,
  12. <列名2> <数据类型2>,
  13. ……
  14. <列名n> <数据类型n>]
  15. )
  16. AS
  17. BEGIN
  18. --为<@定义的表名>赋值的SQL语句
  19. RETURN
  20. END

示例

  1. /*
  2. * 创建多语句表值函数,可以查询出一个月内有交易记录的用户姓名,联系电话,身份证号码,银行卡卡号和账户余额
  3. */
  4. create function getCustInfoMonth()
  5. returns @CustInfo table --返回table类型
  6. (
  7. --帐户名称
  8. CustName varchar(20) not null,
  9. --电话
  10. TelePhone varchar(13) not null,
  11. --身份证号
  12. IDCard varchar(18),
  13. --银行卡卡号
  14. CardID varchar(19) not null,
  15. --可用余额
  16. LeftMoney money not null check(LeftMoney>1)
  17. )
  18. as
  19. begin
  20. --为table表赋值
  21. insert into @CustInfo
  22. select A.CustName, A.TelePhone, A.IDCard, T.CardID, C.LeftMoney
  23. from AccountInfo as A inner join CardInfo as C on A.CustID = C.CustID
  24. inner join TransInfo as T on C.CardID = T.CardID
  25. where exists(select * from TransInfo
  26. group by CardID,TransDate,transID,TransType,TransMoney
  27. having datediff(MONTH,TransDate,GETDATE())=0)
  28. return
  29. end
  30. go
  31. -- 调用多语句表值函数
  32. select * from getCustInfo()
  33. go

标量值函数

返回一个标量值

语法

  1. CREATE FUNCTION <FunctionName>
  2. (
  3. -- 添加函数所需的参数,可以没有参数
  4. [<@param1> <参数类型>]
  5. [,<@param1> <参数类型>]…
  6. )
  7. RETURNS <函数返回数据类型>
  8. AS
  9. BEGIN
  10. -- 定义返回数据变量
  11. DECLARE @变量名 数据类型
  12. -- 通过SQL语句为返回变量赋值
  13. SELECT @变量名 = SQL语句
  14. -- 返回结果
  15. RETURN @变量名
  16. END

示例

  1. /*
  2. 7.创建标量值函数,根据用户传入的银行卡卡号,获得该卡交易次数
  3. */
  4. create function getTransCount
  5. (
  6. @CardID varchar(19) --参数银行卡卡号
  7. )
  8. returns int --返回int类型
  9. as
  10. begin
  11. declare @count int
  12. select @count = count(*) from TransInfo where CardID = @CardID
  13. return @count
  14. end
  15. go
  16. -- 调用标量值函数
  17. select getTransCount('1027 3526 1536 1135') as 次数
  18. go

函数部分介绍到这里,如有疑问,请留言。

谢谢各位看官的浏览。

关系数据库SQL之可编程性函数(用户自定义函数)的更多相关文章

  1. 关系数据库SQL之可编程性触发器

    前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程.事务,本文来介绍一下触发器的使用.(还是以 ...

  2. 关系数据库SQL之可编程性事务

    前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程,本文来介绍一下事务的使用.(还是以前面的银 ...

  3. 关系数据库SQL之可编程性存储过程

    前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数,本文来介绍一下存储过程的创建.执行.删除.(还是以前 ...

  4. SQL之用户自定义函数

    关于SQL Server用户自定义的函数,有标量函数.表值函数(内联表值函数.多语句表值函数)两种. 题外话,可能有部分朋友不知道SQL Serve用户自定义的函数应该是写在哪里,这里简单提示一下,在 ...

  5. SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性

    原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 ...

  6. SQL SERVER 用户自定义函数(UDF)深入解析

    本文内容概要: UDF 概念.原理.优缺点.UDF 的分类 详细讲述3种 UDF 的创建.调用方法以及注意事项 UDF 的实践建议 基本原理: UDF:user-defined functions,用 ...

  7. T-SQL编程 —— 用户自定义函数(内嵌表值函数)

    内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以 ...

  8. T-SQL编程 —— 用户自定义函数(标量函数)

    用户自定义函数 在使用SQL server的时候,除了其内置的函数之外,还允许用户根据需要自己定义函数.根据用户定义函数返回值的类型,可以将用户定义的函数分为三个类别: 返回值为可更新表的函数 如果用 ...

  9. SQL Server用户自定义函数

    用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统 函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过EXECUTE 命令来执行.在 SQL Server 中根据函数 ...

随机推荐

  1. SQL Server 连接问题案例解析(1)

    SQL Server 连接问题案例解析(1) 转载自:http://blogs.msdn.com/b/apgcdsd/archive/2015/04/27/sql.aspx?CommentPosted ...

  2. 简单明了区分escape、encodeURI和encodeURIComponent

    一.前言 讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种 ...

  3. 《R in Action》读书笔记(1)

    MindMapper 原文件

  4. .Net组件程序设计之上下文

    .Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...

  5. chrome使用技巧(看了定不让你失望)

    写在前面 之前有看过刘哇勇写的Chrome 控制台不完全指南,让我觉得瞬间对chrome的了解实在太浅了.对此特意了解了一番(也就是在他的博文上进行了一些总结和了解一些其它chrome使用方面的诀窍) ...

  6. Hello Blog

    转眼之间,工作已经快五年了. 五年走的时候不觉得,当真正过来了,一回头,才真正体会到什么叫时间匆匆. 做了五年的技术,算是多有波折.想一想,做技术真的挺需要耐得住寂寞的,毕竟花花世界,压力太大,诱惑太 ...

  7. Js的语法和循环

    1.蓝球弹起的高度 篮球从10米高的地方落下,每次弹起的高度是原来的0.3倍,问弹跳10次之后篮球的高度. <script type="text/javascript"> ...

  8. Web APi入门之移除XML格式(一)

    前言 回头想来,没想到自己却坚持下来了,EntityFramework系列终于全部完成了,给自己点个赞先.本系列将着手于Web API,关于一些基础的介绍及定义就不再叙述,请参考园友们文章,非常详细, ...

  9. CSS之水平垂直居中

    在css的世界里,如果我们想让一个块级元素水平居中,想必大家都知道利用margin:0 auto;嘛,这样就可以让块级元素在它的父元素中水平居中了. 列如这样: <!DOCTYPE html&g ...

  10. C# 一个页面,多个Updatepannel,多个Timer

    这几天在搞一个项目,其中一个页面里面有好几组数据要定时刷新,但是,每一组数据要刷新的时间不一样,所以就需要用到多个定时器.本人刚工作不久,对Js 的Ajax不太了解,反而对微软的那个Ajax相对了解一 ...