关系数据库SQL之可编程性函数(用户自定义函数)
前言
在关系型数据库中除了前面几篇基本的数据库和数据表操作之外,还提供了可编程性的函数、存储过程、事务、触发器及游标。
本文介绍的是函数。
函数分为两种:
- 系统函数
- 用户自定义函数
准备工作
这里以银行存取款为例说明。
1、创建数据表
--创建账户信息表
create table AccountInfo
(
--账户ID
CustID 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类型
(
--账户ID
CustID int,
--帐户名称
CustName varchar(20) not null,
--身份证号
IDCard varchar(18),
--电话
TelePhone varchar(13) not null,
--地址
Address varchar(50) default('地址不详')
)
as
begin
--为table表赋值
insert into @CustInfo
select 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 @CustInfo
select A.CustName, A.TelePhone, A.IDCard, T.CardID, C.LeftMoney
from 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,TransMoney
having 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
begin
declare @count int
select @count = count(*) from TransInfo where CardID = @CardID
return @count
end
go
-- 调用标量值函数
select getTransCount('1027 3526 1536 1135') as 次数
go
函数部分介绍到这里,如有疑问,请留言。
谢谢各位看官的浏览。
关系数据库SQL之可编程性函数(用户自定义函数)的更多相关文章
- 关系数据库SQL之可编程性触发器
前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程.事务,本文来介绍一下触发器的使用.(还是以 ...
- 关系数据库SQL之可编程性事务
前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程,本文来介绍一下事务的使用.(还是以前面的银 ...
- 关系数据库SQL之可编程性存储过程
前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数,本文来介绍一下存储过程的创建.执行.删除.(还是以前 ...
- SQL之用户自定义函数
关于SQL Server用户自定义的函数,有标量函数.表值函数(内联表值函数.多语句表值函数)两种. 题外话,可能有部分朋友不知道SQL Serve用户自定义的函数应该是写在哪里,这里简单提示一下,在 ...
- SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性
原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 ...
- SQL SERVER 用户自定义函数(UDF)深入解析
本文内容概要: UDF 概念.原理.优缺点.UDF 的分类 详细讲述3种 UDF 的创建.调用方法以及注意事项 UDF 的实践建议 基本原理: UDF:user-defined functions,用 ...
- T-SQL编程 —— 用户自定义函数(内嵌表值函数)
内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以 ...
- T-SQL编程 —— 用户自定义函数(标量函数)
用户自定义函数 在使用SQL server的时候,除了其内置的函数之外,还允许用户根据需要自己定义函数.根据用户定义函数返回值的类型,可以将用户定义的函数分为三个类别: 返回值为可更新表的函数 如果用 ...
- SQL Server用户自定义函数
用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统 函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过EXECUTE 命令来执行.在 SQL Server 中根据函数 ...
随机推荐
- PHP的函数应用
1.全部变量 全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的结尾.和其他编程语言不同,全局变量不是自动设置为可用的.在PHP中,由于函数可以视为单独的程序片 ...
- 如何解决audiodg占用内存高(停止与重启audiodg服务)
window7电脑audiodg.exe进程占用内存很高 首先想到的办法是结束该进程,于是在任务管理器里结束进程后,内存是释放了,但是发现发现电脑没有声音 去到电脑的system32目录下双击audi ...
- IT人生知识分享:博弈论的理性思维
背景: 昨天看了<最强大脑>,由于节目比较有争议性,不知为什么,作为一名感性的人,就想试一下如果自己理性分析会是怎样的呢? 过程是这样的: 中国队(3人)VS英国队(4人). 1:李建东( ...
- Node.js学习笔记
相关介绍 1.Node.js或者Node,是一个可以让javascript运行在服务器端的平台. 2.Node.js是一个为实时Web应用开发而诞生的语言,它从诞生之初就充分考虑了再实时响应.超大规模 ...
- Nodejs初阶之express
PS: 2014/09/24 更新<Express 4.X 启航指南>,欢迎阅读和评论:) 老规矩,开头部分都是些自娱自乐的随想,想到哪写到哪... 到今天俺已经在俺厂工作俩年零几天了 ...
- [SDK2.2]Windows Azure Storage (16) 使用WCF服务,将本地图片上传至Azure Storage (上) 客户端代码
<Windows Azure Platform 系列文章目录> 前一章我们完成了服务器端的代码,并且已经发布到了Windows Azure云端. 本章我们将实现客户端的代码,客户端这里我们 ...
- Module-Zero之组织单元(OU)管理【新增】
返回<Module Zero学习目录> 概览介绍 OrganizationUnit实体 OrganizationUnit管理者 公共用例 设置 概览介绍 组织单元(Organization ...
- Python格式化输出
今天写程序又记不清格式化输出细节了……= =索性整理一下. python print格式化输出. 1. 打印字符串 print ("His name is %s"%("A ...
- Fiddler调式使用知多少(一)深入研究
Fiddler调式使用(一)深入研究 阅读目录 Fiddler的基本概念 如何安装Fiddler 了解下Fiddler用户界面 理解不同图标和颜色的含义 web session的常用的快捷键 了解we ...
- OGNL相关代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...