关系数据库SQL之可编程性函数(用户自定义函数)

前言

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

本文介绍的是函数。

函数分为两种:

  1. 系统函数

  2. 用户自定义函数


准备工作

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

1、创建数据表

--创建账户信息表
create table AccountInfo
(--账户IDCustID int identity(1,1) primary key,--帐户名称CustName varchar(20) not null,--身份证号IDCard varchar(18),--电话TelePhone varchar(13) not null,--地址Address varchar(50) default('地址不详')
)go--创建卡信息表
create table CardInfo
(--银行卡卡号CardID varchar(19) primary key,--银行卡密码CardPassWord varchar(6) not null default('888888'),--身份证号CustID int references AccountInfo(CustID),--存款类型SaveType varchar(10) not null ,--开户日期OpenDate datetime not null default(getdate()),--开户金额OpenMoney money not null check(OpenMoney>1),--可用余额LeftMoney money  not null check(LeftMoney>1),--是否挂失IsLost varchar(2) not null default('否')
)go--交易信息表
create table TransInfo
(--交易编号transID int identity primary key,--银行卡卡号CardID varchar(19) not null,--交易类型TransType varchar(4) not null,--交易金额TransMoney money not null,--交易时间TransDate datetime default(getdate())
)
go/*
1.使用T-SQL语句为交易信息表(TransInfo)的银行卡卡号(CardID)字段创建外键
*/--外键(银行卡卡号CardID)
alter table [dbo].TransInfo  with check add  constraint [fk_CardInfo_TransInfo] foreign key(CardID)
references [dbo].[CardInfo] (CardID)
go/*
2.使用T-SQL语句为账户信息表(AccountInfo)的银行卡卡号(IDCard)字段创建唯一约束
*/
alter table [dbo].[AccountInfo] add unique (IDCard ASC)
go/*
3.使用T-SQL语句创建约束,使银行卡信息表(CardInfo)的银行卡卡号(CardID)字段值长度只能为19位
*/
alter table [dbo].[CardInfo] add constraint CK_CardID check(len(CardID) = 19)
go/*
4.使用T-SQL语句使交易信息表(TransInfo)的交易类型(TransType)字段只能选择'存款'和'取款',银行卡信息表(CardInfo)的存款类型(SaveType)字段只能选择'定期'和'活期'
*/
alter table [dbo].TransInfo add constraint CK_TransType 
check(TransType = '存款' or TransType = '取款')
go
alter table [dbo].CardInfo add constraint CK_SaveType 
check(SaveType = '定期' or SaveType = '活期')
go

2、插入基本数据

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

函数调用

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

系统函数

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

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

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


用户自定义函数

除了系统提供的函数,用户可以根据自己的需求自定义函数;
用户自定义函数,顾名思义,就是数用户自己定义的函数;
用户自定义函数分为两类:表值函数和标量值函数;
其中,表值函数也分两种:内联表值函数和多语句表值函数。


表值函数

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

内联表值函数

语法

CREATE FUNCTION <函数名称> 
(    -- 添加函数所需的参数,可以没有参数[<@param1> <参数类型>][,<@param1> <参数类型>]…
)
RETURNS TABLE 
AS
RETURN 
(-- 查询返回的SQL语句SELECT查询语句
)

示例

/*
* 创建内联表值函数,查询交易总额大于1W的开户人个人信息
*/
create function getCustInfo()
returns @CustInfo table  --返回table类型
(--账户IDCustID int,--帐户名称CustName varchar(20) not null,--身份证号IDCard varchar(18),--电话TelePhone varchar(13) not null,--地址Address varchar(50) default('地址不详')
)
as
begin--为table表赋值insert into @CustInfoselect CustID,CustName,IDCard,TelePhone,Address from AccountInfo where CustID in (select CustID from CardInfo where CardID in (select CardID from TransInfo group by CardID,transID,TransType,TransMoney,TransDate having sum(TransMoney)>10000))return
end
go
-- 调用内联表值函数
select * from getCustInfo()
go

多语句表值函数

语法

CREATE FUNCTION <函数名称> 
(    -- 添加函数所需的参数,可以没有参数[<@param1> <参数类型>][,<@param1> <参数类型>]…
)
RETURNS 
<@定义的表名> TABLE 
(-- 添加返回数据表的列<列名1> <数据类型1>, <列名2> <数据类型2>,……<列名n> <数据类型n>]
)
AS
BEGIN--为<@定义的表名>赋值的SQL语句RETURN 
END

示例

/*
* 创建多语句表值函数,可以查询出一个月内有交易记录的用户姓名,联系电话,身份证号码,银行卡卡号和账户余额
*/
create function getCustInfoMonth()
returns @CustInfo table  --返回table类型
(--帐户名称CustName varchar(20) not null,--电话TelePhone varchar(13) not null,--身份证号IDCard varchar(18),--银行卡卡号CardID varchar(19) not null,--可用余额LeftMoney money  not null check(LeftMoney>1)
)
as
begin--为table表赋值insert into @CustInfoselect A.CustName, A.TelePhone, A.IDCard, T.CardID, C.LeftMoneyfrom AccountInfo as A inner join CardInfo as C on A.CustID = C.CustID inner join TransInfo as T on C.CardID = T.CardID where exists(select * from TransInfo group by CardID,TransDate,transID,TransType,TransMoneyhaving datediff(MONTH,TransDate,GETDATE())=0)return
end
go
-- 调用多语句表值函数
select * from getCustInfo()
go

标量值函数

返回一个标量值

语法

CREATE FUNCTION <FunctionName> 
(-- 添加函数所需的参数,可以没有参数[<@param1> <参数类型>][,<@param1> <参数类型>]…
)
RETURNS <函数返回数据类型>
AS
BEGIN-- 定义返回数据变量DECLARE @变量名 数据类型-- 通过SQL语句为返回变量赋值SELECT @变量名 = SQL语句-- 返回结果RETURN @变量名END

示例

/*
7.创建标量值函数,根据用户传入的银行卡卡号,获得该卡交易次数
*/
create function getTransCount
(@CardID varchar(19)  --参数银行卡卡号
)
returns int  --返回int类型
as
begindeclare @count intselect @count = count(*) from TransInfo where CardID = @CardIDreturn @count
end
go
-- 调用标量值函数
select getTransCount('1027 3526 1536 1135') as 次数
go

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

谢谢各位看官的浏览。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

土压力图怎么画_电气系统图怎么画?

电气系统图&#xff0c;又称为电气系统控制图&#xff0c;是通过使用国家规定的图形符号和文字代号代表各种电器、电机及元件&#xff0c;根据生产机械的要求和各种电器的原理&#xff0c;用线条代表导线连接起来&#xff0c;用于展示供电线路与各设备工作原理及其相互关系的一…

mvc

Model、View、Controller 一、Model Proxy-->数据端(与远程服务器通信) 二、view Mediator--->操作视图组件(添加事件监听器&#xff0c;发送或接收Notification) 三、Controller Command映射(获取Proxy,通过收发Notification操作别的Command) 框架以外要做的&#xff1a…

C#中往数据库插入/更新时候关于NUll空值的处理

本文转载&#xff1a;http://blog.csdn.net/chybaby/article/details/2338943 今天碰到个问题。。SqlCommand对传送的参数中如果字段的值是NULL具然不进行更新操作&#xff0c;也不提示任何错误。。。百思不得其解。。。先作个记录&#xff0c;再查资料看看什么原因。 暂时的解…

考勤助手——数据库3.0版本

基于数据库1.0及2.0版本&#xff0c;我们将细节的地方逐一进行讨论&#xff0c;设计出了数据库3.0版本。 根据ER图&#xff0c;进行基本表的设计如下&#xff1a; 转载于:https://www.cnblogs.com/GG-TEN/p/5471019.html

System.Data.OleDb.OleDbException: INSERT INTO 语句的语法错误

这个错误主要是因为INSERT INTO 语句里包括了access的关键字&#xff0c;可以通过对插入的字段中加上括号[]即可。如&#xff1a;insert into key_list([key],[ZM]) values(key,ZM)即可解决。转载于:https://www.cnblogs.com/liuhaitao/archive/2011/07/07/2100561.html

Ruby中的%表示法

%{String} 用于创建一个使用双引号括起来的字符串 %Q{String} 用于创建一个使用双引号括起来的字符串 %q{String} 用于创建一个使用单引号括起来的字符串 %r{String} 用于创建一个正则表达式字面值 %w{String} 用于将一个字符串以空白字符切分成一个字符串数组…

幽灵交易策略_幽灵交易者策略(附源代码)

NO1 . 前言正如幽灵交易者的名字&#xff0c;该策略的核心思路是&#xff0c;在真实下单交易之前&#xff0c;先虚拟出一个交易&#xff0c;如果这个虚拟的交易是亏损的&#xff0c;那么下一次才启动真实的交易。NO2 . 策略简介该策略思路源自于交易者的观察&#xff0c;交易者…

test blog

blogsdf sdfsd转载于:https://blog.51cto.com/11570194/1771304

面向对象66原则

你不必严格遵守这些原则&#xff0c;违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃&#xff0c;若违背了其中的一条&#xff0c;那么警铃就会响起。 ----- Arthur J.Rie…

并行编程——内存模型之缓存一致性

1 定义 缓存一致性 Cache coherence 简称 CC&#xff0c; 缓存一致性协议是在共享缓存多处理器架构确保最终一致性最突出、最重要的机制。这些协议在缓存线&#xff08;cache-line&#xff09;级别实现了对一致性的保证。缓存线是从主内存中读取数据和向内存中写入数据的缓存单…

Start Instance 操作详解 - 每天5分钟玩转 OpenStack(31)

本节通过日志文件详细分析 instance start 操作。下面是 start instance 的流程图向 nova-api 发送请求nova-api 发送消息nova-compute 执行操作下面我们详细讨论每一个步骤。 向 nova-api 发送请求客户&#xff08;可以是 OpenStack 最终用户&#xff0c;也可以是其他程序&…

失望时想起了你是什么歌_你是空你是空是什么歌 你是风你是风什么歌

“你是空&#xff0c;你是空”“你是风&#xff0c;你是风”“下起雨想起了你”前奏的歌曲最近在抖音受到很多人的喜欢&#xff0c;想要找到完整版歌词作为BGM&#xff0c;这首歌非常的洗脑&#xff0c;你是空你是空是什么歌&#xff1f;你是风什么歌&#xff1f;下面八宝网带来…

linux screen 命令详解

一、背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器&#xff0c;经常运行一些需要很长时间才能完成的任务&#xff0c;比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口&#xff0c;因为它们执行的时间太长了。必须等待它…

ASP.NET MVC从视图传递多个模型到Controller

从后台组织好数据然后传递到页面倒是水到渠成很方便&#xff0c;因为MVC自身就将这样的需求内建到了这个系统中。我只需要在后台组织好一个List 或IEnumerable类型的变量&#xff0c;将需要传递的数据模型扔进去便可。 比如这里我们向视图返回5条product信息在页面进行展示&…

mysql存储过程_Mysql存储过程

存储过程存储过程简单来说&#xff0c;就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件&#xff0c;虽然它们的作用不仅限于批处理。在我看来&#xff0c; 存储过程就是有业务逻辑和流程的集合&#xff0c; 可以在存储过程中创建表&#xff0c;更新数据&am…

修复IE9-- safari 的sort方法

解决方案其实就是冒泡排序的一个包装 本补丁不修复各浏览的排序算法不一致的问题 当前版本 v0.2v0.1 修复IE9-- Array.prototype.sort 不能根据 对象属性 做排序的遗憾v0.2 修复safari 不支持函数参数 ; !function(window){var ua window.navigator.userAgent.toLowerCase(),r…

还原virtual函数的本质-----C++

当你每次看到C类中声明一个virtual函数&#xff0c;特别是看到了一个virtual的虚构函数。你知道它的意思吗&#xff1f;你肯定会毫不犹豫的回答&#xff1a;不就是多态么。。。在运行时确定具体的行为么。。。完全正确&#xff0c;但这里我要讲的不只是这些东西。 有些类需要虚…

C++实践参考——数组类运算的实现

【项目-数组类运算的实现】   设计数组类Array&#xff0c;为了实现测试函数中要求的功能&#xff0c;请补足相关的函数&#xff08;构造、析构函数&#xff09;和运算符重载的函数。   实现策略提示&#xff1a;可以将测试函数中的语句加上注释&#xff0c;取消一句的注…

MySQL支持的四种索引_Mysql常见四种索引的使用

提到mysql优化&#xff0c;索引优化是必不可少的。其中一种优化方式 ——索引优化&#xff0c;添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升。我们知道项目性能的瓶颈主要是在"查(select)"语句&#xff0c;要提升"查"这一性能&#xff0c;…

java调用、执行groovy代码

java调用、执行groovy代码 1: package test; 2: 3: import javax.script.ScriptEngine; 4: import javax.script.ScriptEngineManager; 5: import javax.script.ScriptException; 6: 7: public class ScriptExcuteUtil { 8: 9: public ScriptExcuteUtil() { 10: 11…