摘要:函數分為兩種系統函數用戶自定義函數準備工作這里以銀行存取款為例說明。具體的函數如果不清楚請自行搜索,本文著重介紹用戶自定義函數。
前言
在關系型數據庫中除了前面幾篇基本的數據庫和數據表操作之外,還提供了可編程性的函數、存儲過程、事務、觸發器及游標。
本文介紹的是函數。
函數分為兩種:
系統函數
用戶自定義函數
這里以銀行存取款為例說明。
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示例( -- 添加函數所需的參數,可以沒有參數 [<@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
函數部分介紹到這里,如有疑問,請留言。
謝謝各位看官的瀏覽。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17541.html
摘要:前言前面關系數據庫之可編程性函數用戶自定義函數一文提到關系型數據庫提供了可編程性的函數存儲過程事務觸發器及游標,前文已介紹了函數存儲過程事務,本文來介紹一下觸發器的使用。觸發器是在執行之后觸發,而觸發器是在執行之前觸發。 前言 前面關系數據庫SQL之可編程性函數(用戶自定義函數)一文提到關系型數據庫提供了可編程性的函數、存儲過程、事務、觸發器及游標,前文已介紹了函數、存儲過程、事務,本...
閱讀 3512·2021-11-15 11:38
閱讀 824·2021-11-08 13:27
閱讀 2235·2021-07-29 14:50
閱讀 2969·2019-08-29 13:06
閱讀 838·2019-08-29 11:22
閱讀 2408·2019-08-29 11:04
閱讀 3499·2019-08-28 18:23
閱讀 890·2019-08-26 13:46