關(guān)系數(shù)據(jù)庫(kù)SQL之可編程性函數(shù)(用戶自定義函數(shù))

前言

在關(guān)系型數(shù)據(jù)庫(kù)中除了前面幾篇基本的數(shù)據(jù)庫(kù)和數(shù)據(jù)表操作之外靡馁,還提供了可編程性的函數(shù)、存儲(chǔ)過程抄瑟、事務(wù)、觸發(fā)器及游標(biāo)枉疼。

本文介紹的是函數(shù)皮假。

函數(shù)分為兩種:

  1. 系統(tǒng)函數(shù)
  2. 用戶自定義函數(shù)

準(zhǔn)備工作

這里以銀行存取款為例說明鞋拟。

1、創(chuàng)建數(shù)據(jù)表

--創(chuàng)建賬戶信息表
create table AccountInfo
(
    --賬戶ID
    CustID 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 ,
    --開戶日期
    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
(
    --交易編號(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 = '活期')
go

2、插入基本數(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,'否')

系統(tǒng)函數(shù)

數(shù)據(jù)庫(kù)系統(tǒng)定義的函數(shù)褪测,即內(nèi)置函數(shù)猴誊。


內(nèi)置函數(shù)調(diào)用

SELECT 內(nèi)置函數(shù)名(列名稱) FROM <表名>;
函數(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ù)調(diào)用

SELECT 字段列表/* FROM [函數(shù)所有者.]<函數(shù)名稱>([參數(shù)列表]);

在自定義函數(shù)中叫胖,函數(shù)所有者一般默認(rèn)情況下是dbo;
在自定義函數(shù)中她奥,標(biāo)量值函數(shù)一定要加上函數(shù)所有者瓮增,否則會(huì)報(bào)錯(cuò):提示函數(shù)非內(nèi)置函數(shù);


表值函數(shù)

表值函數(shù)是返回一個(gè)Table類型哩俭,相當(dāng)與一張存儲(chǔ)在內(nèi)存中的一張?zhí)摂M表绷跑。

內(nèi)聯(lián)表值函數(shù)

語(yǔ)法

CREATE FUNCTION [函數(shù)所有者.]<函數(shù)名稱> 
(   
    -- 添加函數(shù)所需的參數(shù),可以沒有參數(shù)
    [<@param1> <參數(shù)類型>]
    [,<@param1> <參數(shù)類型>]…
)
RETURNS TABLE 
AS
RETURN 
(
    -- 查詢返回的SQL語(yǔ)句
    SELECT查詢語(yǔ)句
)

示例

/*
* 創(chuàng)建內(nèi)聯(lián)表值函數(shù)凡资,查詢交易總額大于1W的開戶人個(gè)人信息
*/
create function getCustInfo()
returns @CustInfo table  --返回table類型
(
    --賬戶ID
    CustID 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 @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
-- 調(diào)用內(nèi)聯(lián)表值函數(shù)
select * from getCustInfo()
go

多語(yǔ)句表值函數(shù)

語(yǔ)法

CREATE FUNCTION [函數(shù)所有者.]<函數(shù)名稱> 
(   
    -- 添加函數(shù)所需的參數(shù)砸捏,可以沒有參數(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 @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
-- 調(diào)用多語(yǔ)句表值函數(shù)
select * from dbo.getCustInfo()
go

標(biāo)量值函數(shù)

返回一個(gè)標(biāo)量值

語(yǔ)法

CREATE FUNCTION [函數(shù)所有者.]<函數(shù)名稱> 
(
    -- 添加函數(shù)所需的參數(shù)伞访,可以沒有參數(shù)
    [<@param1> <參數(shù)類型>]
    [,<@param1> <參數(shù)類型>]…
)
RETURNS <函數(shù)返回?cái)?shù)據(jù)類型>
AS
BEGIN
    -- 定義返回?cái)?shù)據(jù)變量
    DECLARE @變量名 數(shù)據(jù)類型

    -- 通過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
begin
    declare @count int
    select @count = count(*) from TransInfo where CardID = @CardID
    return @count
end
go
-- 調(diào)用標(biāo)量值函數(shù)
-- `標(biāo)量值函數(shù)`一定要加上`函數(shù)所有者`厚掷,否則會(huì)報(bào)錯(cuò):提示函數(shù)非內(nèi)置函數(shù)
select dbo.getTransCount('1027 3526 1536 1135') as 次數(shù)
go

再次提示:
在自定義函數(shù)中弟灼,函數(shù)所有者一般默認(rèn)情況下是dbo;
在自定義函數(shù)中冒黑,標(biāo)量值函數(shù)一定要加上函數(shù)所有者田绑,否則會(huì)報(bào)錯(cuò):提示函數(shù)非內(nèi)置函數(shù);

自定義函數(shù)刪除

-- 自定義函數(shù)刪除語(yǔ)法
DROP FUNCTION [函數(shù)所有者.]<函數(shù)名稱>;

-- 示例
-- 刪除查詢交易總額大于1W的開戶人個(gè)人信息內(nèi)聯(lián)表值函數(shù)
DROP FUNCTION getCustInfo

函數(shù)部分介紹到這里抡爹,如有疑問掩驱,請(qǐng)留言。

謝謝各位看官的瀏覽冬竟。

本文采用知識(shí)共享署名-相同方式共享 4.0 國(guó)際許可協(xié)議進(jìn)行許可欧穴。
基于簡(jiǎn)書上的作品創(chuàng)作。 可轉(zhuǎn)載诱咏、引用,但需經(jīng)本人同意后署名作者且注明文章出處缴挖,并以相同方式共享袋狞。

知識(shí)共享許可協(xié)議
知識(shí)共享許可協(xié)議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苟鸯,更是在濱河造成了極大的恐慌同蜻,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件早处,死亡現(xiàn)場(chǎng)離奇詭異湾蔓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砌梆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門默责,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咸包,你說我怎么就攤上這事桃序。” “怎么了烂瘫?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵媒熊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我坟比,道長(zhǎng)芦鳍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任葛账,我火速辦了婚禮柠衅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘注竿。我一直安慰自己茄茁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布巩割。 她就那樣靜靜地躺著裙顽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宣谈。 梳的紋絲不亂的頭發(fā)上愈犹,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音闻丑,去河邊找鬼漩怎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嗦嗡,可吹牛的內(nèi)容都是我干的勋锤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼侥祭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼叁执!你這毒婦竟也來了茄厘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤谈宛,失蹤者是張志新(化名)和其女友劉穎次哈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吆录,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窑滞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恢筝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哀卫。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滋恬,靈堂內(nèi)的尸體忽然破棺而出聊训,到底是詐尸還是另有隱情,我是刑警寧澤恢氯,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布带斑,位于F島的核電站,受9級(jí)特大地震影響勋拟,放射性物質(zhì)發(fā)生泄漏勋磕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一敢靡、第九天 我趴在偏房一處隱蔽的房頂上張望挂滓。 院中可真熱鬧,春花似錦啸胧、人聲如沸赶站。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贝椿。三九已至,卻和暖如春陷谱,著一層夾襖步出監(jiān)牢的瞬間烙博,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工烟逊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渣窜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓宪躯,卻偏偏與公主長(zhǎng)得像乔宿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子访雪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理详瑞,服務(wù)發(fā)現(xiàn)囤官,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 什么是SQL數(shù)據(jù)庫(kù): SQL是Structured Query Language(結(jié)構(gòu)化查詢語(yǔ)言)的縮寫蛤虐。SQL是...
    西貝巴巴閱讀 1,801評(píng)論 0 10
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,512評(píng)論 25 707
  • 禪茶之境蘊(yùn)萬象,茶境之妙狼讨,妙在“清贝淤、正、雅政供、和 ”播聪。 茶之起源,神農(nóng)說布隔、西周說离陶、秦漢說、四川說衅檀、云南說招刨,眾說說...
    妙吉祥子閱讀 508評(píng)論 0 2
  • 我從碧海蘇醒 透過咸澀的光影 被白云吸引 努力變得輕盈 隨風(fēng)乘云游蕩 掠過花影 我聚作一點(diǎn)晶瑩 它的美太醉 我就此...
    夏爅閱讀 292評(píng)論 0 3