关系数据库SQL之可编程性函数(用户自定义函数)
前言
在關(guān)系型數(shù)據(jù)庫(kù)中除了前面幾篇基本的數(shù)據(jù)庫(kù)和數(shù)據(jù)表操作之外,還提供了可編程性的函數(shù)、存儲(chǔ)過(guò)程、事務(wù)、觸發(fā)器及游標(biāo)。
本文介紹的是函數(shù)。
函數(shù)分為兩種:
系統(tǒng)函數(shù)
用戶自定義函數(shù)
準(zhǔn)備工作
這里以銀行存取款為例說(shuō)明。
1、創(chuàng)建數(shù)據(jù)表
--創(chuàng)建賬戶信息表 create table AccountInfo (--賬戶IDCustID int identity(1,1) primary key,--帳戶名稱CustName varchar(20) not null,--身份證號(hào)IDCard varchar(18),--電話TelePhone varchar(13) not null,--地址Address varchar(50) default('地址不詳') )go--創(chuàng)建卡信息表 create table CardInfo (--銀行卡卡號(hào)CardID varchar(19) primary key,--銀行卡密碼CardPassWord varchar(6) not null default('888888'),--身份證號(hào)CustID int references AccountInfo(CustID),--存款類型SaveType varchar(10) not null ,--開(kāi)戶日期OpenDate datetime not null default(getdate()),--開(kāi)戶金額OpenMoney money not null check(OpenMoney>1),--可用余額LeftMoney money not null check(LeftMoney>1),--是否掛失IsLost varchar(2) not null default('否') )go--交易信息表 create table TransInfo (--交易編號(hào)transID int identity primary key,--銀行卡卡號(hào)CardID varchar(19) not null,--交易類型TransType varchar(4) not null,--交易金額TransMoney money not null,--交易時(shí)間TransDate datetime default(getdate()) ) go/* 1.使用T-SQL語(yǔ)句為交易信息表(TransInfo)的銀行卡卡號(hào)(CardID)字段創(chuàng)建外鍵 */--外鍵(銀行卡卡號(hào)CardID) alter table [dbo].TransInfo with check add constraint [fk_CardInfo_TransInfo] foreign key(CardID) references [dbo].[CardInfo] (CardID) go/* 2.使用T-SQL語(yǔ)句為賬戶信息表(AccountInfo)的銀行卡卡號(hào)(IDCard)字段創(chuàng)建唯一約束 */ alter table [dbo].[AccountInfo] add unique (IDCard ASC) go/* 3.使用T-SQL語(yǔ)句創(chuàng)建約束,使銀行卡信息表(CardInfo)的銀行卡卡號(hào)(CardID)字段值長(zhǎng)度只能為19位 */ alter table [dbo].[CardInfo] add constraint CK_CardID check(len(CardID) = 19) go/* 4.使用T-SQL語(yǔ)句使交易信息表(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 = '活期') go2、插入基本數(shù)據(jù)
--插入三個(gè)賬戶信息 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,'否')函數(shù)調(diào)用
SELECT 字段列表/* FROM <函數(shù)名稱>([參數(shù)列表]);系統(tǒng)函數(shù)
數(shù)據(jù)庫(kù)系統(tǒng)定義的函數(shù),即內(nèi)置函數(shù)。
| 聚合函數(shù) | 執(zhí)行的操作是將多個(gè)值合并為一個(gè)值。例如?COUNT、SUM、MIN?和MAX。 |
| 配置函數(shù) | 是一種標(biāo)量函數(shù),可返回有關(guān)配置設(shè)置的信息。 |
| 加密函數(shù) | 支持加密、解密、數(shù)字簽名和數(shù)字簽名驗(yàn)證。 |
| 游標(biāo)函數(shù) | 返回有關(guān)游標(biāo)狀態(tài)的信息。 |
| 日期和時(shí)間函數(shù) | 可以更改日期和時(shí)間的值。 |
| 數(shù)學(xué)函數(shù) | 執(zhí)行三角、幾何和其他數(shù)字運(yùn)算。 |
| 元數(shù)據(jù)函數(shù) | 返回?cái)?shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)對(duì)象的屬性信息。 |
| 排名函數(shù) | 是一種非確定性函數(shù),可以返回分區(qū)中每一行的排名值。 |
| 行集函數(shù) | 返回可在?Transact-SQL?語(yǔ)句中表引用所在位置使用的行集。 |
| 安全函數(shù) | 返回有關(guān)用戶和角色的信息。 |
| 字符串函數(shù) | 可更改?char、varchar、nchar、nvarchar、binary?和?varbinary?的值。 |
| 系統(tǒng)函數(shù) | 對(duì)系統(tǒng)級(jí)的各種選項(xiàng)和對(duì)象進(jìn)行操作或報(bào)告。 |
| 系統(tǒng)統(tǒng)計(jì)函數(shù) | 返回有關(guān)?SQL Server?性能的信息。 |
| 文本和圖像函數(shù) | 可更改?text?和?image?的值。 |
具體的函數(shù)如果不清楚請(qǐng)自行搜索,本文著重介紹用戶自定義函數(shù)。
用戶自定義函數(shù)
除了系統(tǒng)提供的函數(shù),用戶可以根據(jù)自己的需求自定義函數(shù);
用戶自定義函數(shù),顧名思義,就是數(shù)用戶自己定義的函數(shù);
用戶自定義函數(shù)分為兩類:表值函數(shù)和標(biāo)量值函數(shù);
其中,表值函數(shù)也分兩種:內(nèi)聯(lián)表值函數(shù)和多語(yǔ)句表值函數(shù)。
表值函數(shù)
表值函數(shù)是返回一個(gè)Table類型,相當(dāng)與一張存儲(chǔ)在內(nèi)存中的一張?zhí)摂M表。
內(nèi)聯(lián)表值函數(shù)
語(yǔ)法
CREATE FUNCTION <函數(shù)名稱> ( -- 添加函數(shù)所需的參數(shù),可以沒(méi)有參數(shù)[<@param1> <參數(shù)類型>][,<@param1> <參數(shù)類型>]… ) RETURNS TABLE AS RETURN (-- 查詢返回的SQL語(yǔ)句SELECT查詢語(yǔ)句 )示例
/* * 創(chuàng)建內(nèi)聯(lián)表值函數(shù),查詢交易總額大于1W的開(kāi)戶人個(gè)人信息 */ create function getCustInfo() returns @CustInfo table --返回table類型 (--賬戶IDCustID int,--帳戶名稱CustName varchar(20) not null,--身份證號(hào)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 -- 調(diào)用內(nèi)聯(lián)表值函數(shù) select * from getCustInfo() go多語(yǔ)句表值函數(shù)
語(yǔ)法
CREATE FUNCTION <函數(shù)名稱> ( -- 添加函數(shù)所需的參數(shù),可以沒(méi)有參數(shù)[<@param1> <參數(shù)類型>][,<@param1> <參數(shù)類型>]… ) RETURNS <@定義的表名> TABLE (-- 添加返回?cái)?shù)據(jù)表的列<列名1> <數(shù)據(jù)類型1>, <列名2> <數(shù)據(jù)類型2>,……<列名n> <數(shù)據(jù)類型n>] ) AS BEGIN--為<@定義的表名>賦值的SQL語(yǔ)句RETURN END示例
/* * 創(chuàng)建多語(yǔ)句表值函數(shù),可以查詢出一個(gè)月內(nèi)有交易記錄的用戶姓名,聯(lián)系電話,身份證號(hào)碼,銀行卡卡號(hào)和賬戶余額 */ create function getCustInfoMonth() returns @CustInfo table --返回table類型 (--帳戶名稱CustName varchar(20) not null,--電話TelePhone varchar(13) not null,--身份證號(hào)IDCard varchar(18),--銀行卡卡號(hào)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 -- 調(diào)用多語(yǔ)句表值函數(shù) select * from getCustInfo() go標(biāo)量值函數(shù)
返回一個(gè)標(biāo)量值
語(yǔ)法
CREATE FUNCTION <FunctionName> (-- 添加函數(shù)所需的參數(shù),可以沒(méi)有參數(shù)[<@param1> <參數(shù)類型>][,<@param1> <參數(shù)類型>]… ) RETURNS <函數(shù)返回?cái)?shù)據(jù)類型> AS BEGIN-- 定義返回?cái)?shù)據(jù)變量DECLARE @變量名 數(shù)據(jù)類型-- 通過(guò)SQL語(yǔ)句為返回變量賦值SELECT @變量名 = SQL語(yǔ)句-- 返回結(jié)果RETURN @變量名END示例
/* 7.創(chuàng)建標(biāo)量值函數(shù),根據(jù)用戶傳入的銀行卡卡號(hào),獲得該卡交易次數(shù) */ create function getTransCount (@CardID varchar(19) --參數(shù)銀行卡卡號(hào) ) returns int --返回int類型 as begindeclare @count intselect @count = count(*) from TransInfo where CardID = @CardIDreturn @count end go -- 調(diào)用標(biāo)量值函數(shù) select getTransCount('1027 3526 1536 1135') as 次數(shù) go函數(shù)部分介紹到這里,如有疑問(wèn),請(qǐng)留言。
謝謝各位看官的瀏覽。
總結(jié)
以上是生活随笔為你收集整理的关系数据库SQL之可编程性函数(用户自定义函数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ShowMsg函数妙用
- 下一篇: 第五课 机器学习中的特征工程