关系数据库SQL之可编程性函数(用户自定义函数)
生活随笔
收集整理的這篇文章主要介紹了
关系数据库SQL之可编程性函数(用户自定义函数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
在關系型數據庫中除了前面幾篇基本的數據庫和數據表操作之外,還提供了可編程性的函數、存儲過程、事務、觸發器及游標。
本文介紹的是函數。
函數分為兩種:
系統函數
用戶自定義函數
準備工作
這里以銀行存取款為例說明。
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 = '活期') go2、插入基本數據
--插入三個賬戶信息 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函數部分介紹到這里,如有疑問,請留言。
謝謝各位看官的瀏覽。
總結
以上是生活随笔為你收集整理的关系数据库SQL之可编程性函数(用户自定义函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ShowMsg函数妙用
- 下一篇: 第五课 机器学习中的特征工程