关系数据库SQL之可编程性函数(用户自定义函数)
生活随笔
收集整理的這篇文章主要介紹了
关系数据库SQL之可编程性函数(用户自定义函数)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言
在關系型數(shù)據(jù)庫中除了前面幾篇基本的數(shù)據(jù)庫和數(shù)據(jù)表操作之外,還提供了可編程性的函數(shù)、存儲過程、事務、觸發(fā)器及游標。
本文介紹的是函數(shù)。
函數(shù)分為兩種:
系統(tǒng)函數(shù)
用戶自定義函數(shù)
準備工作
這里以銀行存取款為例說明。
1、創(chuàng)建數(shù)據(jù)表
--創(chuàng)建賬戶信息表 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--創(chuàng)建卡信息表 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)字段創(chuàng)建外鍵 */--外鍵(銀行卡卡號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)字段創(chuàng)建唯一約束 */ alter table [dbo].[AccountInfo] add unique (IDCard ASC) go/* 3.使用T-SQL語句創(chuàng)建約束,使銀行卡信息表(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 = '活期') go2、插入基本數(shù)據(jù)
--插入三個賬戶信息 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ù)庫系統(tǒng)定義的函數(shù),即內(nèi)置函數(shù)。
| 聚合函數(shù) | 執(zhí)行的操作是將多個值合并為一個值。例如?COUNT、SUM、MIN?和MAX。 |
| 配置函數(shù) | 是一種標量函數(shù),可返回有關配置設置的信息。 |
| 加密函數(shù) | 支持加密、解密、數(shù)字簽名和數(shù)字簽名驗證。 |
| 游標函數(shù) | 返回有關游標狀態(tài)的信息。 |
| 日期和時間函數(shù) | 可以更改日期和時間的值。 |
| 數(shù)學函數(shù) | 執(zhí)行三角、幾何和其他數(shù)字運算。 |
| 元數(shù)據(jù)函數(shù) | 返回數(shù)據(jù)庫和數(shù)據(jù)庫對象的屬性信息。 |
| 排名函數(shù) | 是一種非確定性函數(shù),可以返回分區(qū)中每一行的排名值。 |
| 行集函數(shù) | 返回可在?Transact-SQL?語句中表引用所在位置使用的行集。 |
| 安全函數(shù) | 返回有關用戶和角色的信息。 |
| 字符串函數(shù) | 可更改?char、varchar、nchar、nvarchar、binary?和?varbinary?的值。 |
| 系統(tǒng)函數(shù) | 對系統(tǒng)級的各種選項和對象進行操作或報告。 |
| 系統(tǒng)統(tǒng)計函數(shù) | 返回有關?SQL Server?性能的信息。 |
| 文本和圖像函數(shù) | 可更改?text?和?image?的值。 |
具體的函數(shù)如果不清楚請自行搜索,本文著重介紹用戶自定義函數(shù)。
用戶自定義函數(shù)
除了系統(tǒng)提供的函數(shù),用戶可以根據(jù)自己的需求自定義函數(shù);
用戶自定義函數(shù),顧名思義,就是數(shù)用戶自己定義的函數(shù);
用戶自定義函數(shù)分為兩類:表值函數(shù)和標量值函數(shù);
其中,表值函數(shù)也分兩種:內(nèi)聯(lián)表值函數(shù)和多語句表值函數(shù)。
表值函數(shù)
表值函數(shù)是返回一個Table類型,相當與一張存儲在內(nèi)存中的一張?zhí)摂M表。
內(nèi)聯(lián)表值函數(shù)
語法
CREATE FUNCTION <函數(shù)名稱> ( -- 添加函數(shù)所需的參數(shù),可以沒有參數(shù)[<@param1> <參數(shù)類型>][,<@param1> <參數(shù)類型>]… ) RETURNS TABLE AS RETURN (-- 查詢返回的SQL語句SELECT查詢語句 )示例
/* * 創(chuàng)建內(nèi)聯(lián)表值函數(shù),查詢交易總額大于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 -- 調(diào)用內(nèi)聯(lián)表值函數(shù) select * from getCustInfo() go多語句表值函數(shù)
語法
CREATE FUNCTION <函數(shù)名稱> ( -- 添加函數(shù)所需的參數(shù),可以沒有參數(shù)[<@param1> <參數(shù)類型>][,<@param1> <參數(shù)類型>]… ) RETURNS <@定義的表名> TABLE (-- 添加返回數(shù)據(jù)表的列<列名1> <數(shù)據(jù)類型1>, <列名2> <數(shù)據(jù)類型2>,……<列名n> <數(shù)據(jù)類型n>] ) AS BEGIN--為<@定義的表名>賦值的SQL語句RETURN END示例
/* * 創(chuàng)建多語句表值函數(shù),可以查詢出一個月內(nèi)有交易記錄的用戶姓名,聯(lián)系電話,身份證號碼,銀行卡卡號和賬戶余額 */ 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 -- 調(diào)用多語句表值函數(shù) select * from getCustInfo() go標量值函數(shù)
返回一個標量值
語法
CREATE FUNCTION <FunctionName> (-- 添加函數(shù)所需的參數(shù),可以沒有參數(shù)[<@param1> <參數(shù)類型>][,<@param1> <參數(shù)類型>]… ) RETURNS <函數(shù)返回數(shù)據(jù)類型> AS BEGIN-- 定義返回數(shù)據(jù)變量DECLARE @變量名 數(shù)據(jù)類型-- 通過SQL語句為返回變量賦值SELECT @變量名 = SQL語句-- 返回結果RETURN @變量名END示例
/* 7.創(chuàng)建標量值函數(shù),根據(jù)用戶傳入的銀行卡卡號,獲得該卡交易次數(shù) */ create function getTransCount (@CardID varchar(19) --參數(shù)銀行卡卡號 ) returns int --返回int類型 as begindeclare @count intselect @count = count(*) from TransInfo where CardID = @CardIDreturn @count end go -- 調(diào)用標量值函數(shù) select getTransCount('1027 3526 1536 1135') as 次數(shù) go函數(shù)部分介紹到這里,如有疑問,請留言。
謝謝各位看官的瀏覽。
總結
以上是生活随笔為你收集整理的关系数据库SQL之可编程性函数(用户自定义函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ShowMsg函数妙用
- 下一篇: 考勤助手——数据库3.0版本