柚子快報激活碼778899分享:數(shù)據(jù)庫 筆記 SQL中的函數(shù)
柚子快報激活碼778899分享:數(shù)據(jù)庫 筆記 SQL中的函數(shù)
目錄
前言
一、系統(tǒng)內(nèi)置函數(shù)
1、數(shù)學(xué)函數(shù)
2、日期和時間函數(shù)
3、聚合函數(shù)
4、字符串函數(shù)
二、自定義函數(shù)
1、標(biāo)量函數(shù)的創(chuàng)建與調(diào)用
2、內(nèi)嵌表值函數(shù)的創(chuàng)建與調(diào)用
3、多語句表值函數(shù)的創(chuàng)建與調(diào)用
前言
? ? ? ? 函數(shù)是由一個或多個 T-SQL 語句組成的子程序,可用于封裝代碼以便重復(fù)使用。
一、系統(tǒng)內(nèi)置函數(shù)
????????T-SQL提供的內(nèi)置函數(shù),按照返回值是否具有確定性可分為確定性函數(shù)和非確定性函數(shù)兩大類。
確定性函數(shù):每次使用特定的輸入值調(diào)用該函數(shù)時,返回的結(jié)果都相同。非確定性函數(shù):每次使用特定的輸入值調(diào)用時,返回的結(jié)果都不同。
? ? ? ? 函數(shù) DATEADD為確定性函數(shù),因為對于任何給定參數(shù),返回的結(jié)果總是相同。函數(shù) GETDATE為非確定性函數(shù),因為每次執(zhí)行這個函數(shù),返回的結(jié)果都不同。
1、數(shù)學(xué)函數(shù)
常用數(shù)學(xué)函數(shù)
函數(shù)名稱函數(shù)功能函數(shù)名稱函數(shù)功能ABS求絕對值POWER求 x的 y 次方COS余弦函數(shù)RAND求隨機(jī)數(shù)COT余切函數(shù)ROUND四舍五入EXP計算 e的 x次冪SIN正弦函數(shù)FLOOR求僅次于最小值的值SQUARE開方LOG求自然對數(shù)SQRT求平方根PI常量,圓周率TAN正切函數(shù)
2、日期和時間函數(shù)
GETDATE():返回系統(tǒng)當(dāng)前的日期和時間。DATEADD(datepart, integer_expression, date_expression):返回指定日期?date_expression(日期表達(dá)式)加上指定的額外日期間隔?integer_expression(整形表達(dá)式)產(chǎn)生的新日期。DATEDIFF(datepart, date_expression1,?date_expression2):返回兩個指定日期在 datepart 方面的不同之處,即?date_expression2 超過?date_expression1 的差值,結(jié)果值是一個帶有正負(fù)號的整數(shù)值。DATENAME(datepart, date_expression):以字符串的形式返回日期的指定部分,此部分由 datepart 來指定。DATEPART(datepart, date_expression):以整數(shù)值的形式返回日期表達(dá)式的指定部分。此部分由 datepart 來指定。day(date_expression):返回日期表達(dá)式中的日。month(date_expression):返回日期表達(dá)式中的月。year(date_expression):返回日期表達(dá)式中的年。
????????DATEPART() 函數(shù) 和 DATENAME 函數(shù)極其相似,只不過前者返回的是時間的名稱,后者返回的是具體的時間數(shù)值。
3、聚合函數(shù)
常用聚合函數(shù)
函數(shù)名描述sum(列名)返回一個數(shù)字列的總和。avg(列名)對一個數(shù)據(jù)列計算平均值。min(列名)返回一個數(shù)字、字符串或日期列的最小值。max(列名)返回一個數(shù)字、字符串或日期列的最大值。count(列名)返回一個列的數(shù)據(jù)項數(shù),條數(shù)。count(*)返回找到的函數(shù)
4、字符串函數(shù)
ASCII(char_expression):返回表達(dá)式最左邊一個字符的 ASCII碼。CHAR(integer_expression):返回整數(shù)所代表的 ASCII碼值所對應(yīng)的字符。LOWER(char_expression):將大寫字符轉(zhuǎn)為小寫字符。UPPER(char_expression):將小寫字符轉(zhuǎn)為大寫字符。LTRIM(char_expression):刪除字符串開始部分的空格。RTRIM(char_expression):刪除字符串結(jié)尾部分的空格。RIGHT(char_expression, integer_expression):返回 char_expression 字符串中 integer_expression 個字符以后的部分字符串,integer_expression為負(fù)數(shù)時,返回 NULL。SPACE(integer_expression):返回由 integer_expression 個空格組成的字符串,integer_expression為負(fù)數(shù)時,返回 NULL。STR(float_expression [ , length [ , decimal ] ]):將一個數(shù)值類型數(shù)據(jù)轉(zhuǎn)為字符串,length 為字符串長度,decimal 為小數(shù)點的位數(shù)。STUFF(char_expression1, start, length, char_expression2):從?char_expression1 字符串的?start個字符位置刪除 length個字符,然后把?char_expression2 字符串插入到 char_expression1 的 start 處。SUBSTRING(expression, start, length):從?expression 的第 start 個字符處返回 length 個字符。REVERSE(char_expression):返回 char_expression 的逆序。CHARINDEX( ' pattern ', char_expression ):返回指定?pattern字符串在表達(dá)式中的起始位置。
二、自定義函數(shù)
? ? ? ? 在 SQL SERVER 中,根據(jù)函數(shù)返回值類型,將不同自定義函數(shù)分為 標(biāo)量函數(shù)、內(nèi)嵌表值函數(shù) 和多語句表值函數(shù)。
標(biāo)量函數(shù):返回一個確定類型的變量值,其返回值類型除了 TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP 和 TABLE 類型外的其它數(shù)據(jù)類型。函數(shù)體語句定義在 BEGIN ··· END 語句內(nèi)。內(nèi)嵌表值函數(shù):返回值為一個表。內(nèi)嵌表值函數(shù)沒有由?BEGIN ··· END 語句括起來的函數(shù)體。返回的表由一個位于 RETURN 子句中的 SELECT 命令段從數(shù)據(jù)庫中篩選出來。內(nèi)嵌表值函數(shù)功能相當(dāng)于一個參數(shù)化的試圖。多語句表值函數(shù):可以看作是?內(nèi)嵌表值函數(shù)和內(nèi)嵌表值函數(shù)的結(jié)合體。它返回的是一個表,但它和標(biāo)量函數(shù)一樣有一個用? BEGIN ··· END 括起來的函數(shù)體,返回值的表中的數(shù)據(jù)是由函數(shù)體中的語句插入的。因此,它可以進(jìn)行多次查詢,對數(shù)據(jù)進(jìn)行多次篩選與合并,彌補(bǔ)了內(nèi)嵌表值函數(shù)的不足。
1、標(biāo)量函數(shù)的創(chuàng)建與調(diào)用
--? 創(chuàng)建標(biāo)量函數(shù)的語法格式
CREATE? FUNCTIOIN? [ owner_name.?]? ?function_name? ? /*? 函數(shù)名部分? */
? ? ? ? ( [ { @parameter_name? ?[ AS ]? ?parameter_data_type
? ? ? ? ? ? ? ? [ = DEFAULT ]?}? ?[ , ... n ]??] )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /*? 形參定義部分? */
RETURNS? ?return_data_type? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /*? 返回參數(shù)的類型? */
[ AS ]
BEGIN
? ? ? ? function_body? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /*? 函數(shù)體部分? */
? ? ? ? ? ? ? ? RETURN? expression? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*? 返回語句? */
END
?
--??owner_name:指定自定義函數(shù)的所有者。
--??function_name:指定自定義函數(shù)的名稱。
--??@parameter_name:定義一個或多個參數(shù),一個函數(shù)最多可以定義1024個參數(shù),參數(shù)的作用范圍是整個函數(shù)。
--??parameter_data_type 和?return_data_type 指定參數(shù)的數(shù)據(jù)類型和 返回值類外的其它數(shù)據(jù)類型。
--??function_body:是函數(shù)體部分,決定了函數(shù)的返回值。
--??expression:指定自定義函數(shù)返回的標(biāo)量值表達(dá)式。
--? 當(dāng)函數(shù)參數(shù)由默認(rèn)值時,調(diào)用該函數(shù)時必須指定默認(rèn) DEFAULT 關(guān)鍵字才能獲取默認(rèn)值。
--? 示例:求 sc表中某門課程的平均成績。
create? ?function? ?average? (@cn? char(20))? ?returns? ?float
as
begin
? ? ? ? declare? ?@aver? ?float
? ? ? ? select? @aver = (select? avg(score)? ?from? sc? where? ?sno = @cn)
? ? ? ? return? ?@aver
end
--? 調(diào)用標(biāo)量函數(shù)的語法格式
owner_name.function_name? (parameter_expression? ?1 ··· parameter_expression? ?n)
?
--? 含義為: 所有者. 函數(shù)名(實參1, 實參2, ... , 實參n)。
當(dāng)調(diào)用自定義的標(biāo)量函數(shù)時,必須提供至少由兩部分組成的名稱(所有者. 函數(shù)名)??梢栽?SELECT 語句中調(diào)用,實參可為已賦值的局部變量或表達(dá)式;也可以使用 EXECUTE 語句調(diào)用,方法與調(diào)用存儲過程相同。
--? 示例:求 C001號課的平均成績。
declare? ?@course? ?char(6)
set? ?@course = 'C001'
select? ?dbo.average(@course)? ?as? ?'C001號課的平均成績'
2、內(nèi)嵌表值函數(shù)的創(chuàng)建與調(diào)用
--? 創(chuàng)建內(nèi)嵌表值函數(shù)的語法格式
CREATE? FUNCTIOIN? [ owner_name.?]? ?function_name? ? /*? 函數(shù)名部分? */
? ? ? ? ( [ { @parameter_name? ?[ AS ]? ?parameter_data_type
? ? ? ? ? ? ? ? [ = DEFAULT ]?}? ?[ , ... n ]??] )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /*? 形參定義部分? */
RETURNS? ?table? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*? 返回參數(shù)的類型? */
[ AS ]
RETURN? ?[ ( SELECT? ?statement ) ]? ? ? ? ? ? ? ? ? ? ? ???/*? 通過 SELECT 語句返回內(nèi)嵌表? */
?
--? table:指定返回值為一個表。
--??SELECT? ?statement:指單個 SELECT語句,確定返回的表的數(shù)據(jù)。
--? 示例:查看某個專業(yè)所有學(xué)生的學(xué)號、姓名、所選課程的課程號和成績。
create? ?function? ?st_func(@major? ?nvarchar(20))? ?returns? ?table
as? ?return
? ? ? ? (select? ?student.sno, student.sname, sc.cno, sc.score? from? student, sc
? ? ? ? ? ? ? ? where? specialty = @major? ?and? ?student.sno? = sc.sno)
? ? ? ? 因為內(nèi)嵌套表值函數(shù)的返回值為 table 類型,所以在調(diào)用這類函數(shù)時,只能通過 SELECT語句。
--? 示例:查看計算機(jī)專業(yè)所有學(xué)生的學(xué)號、姓名、所選的課程號和成績。
select? *? from? st_func('計算機(jī)')
3、多語句表值函數(shù)的創(chuàng)建與調(diào)用
? ? ? ? 內(nèi)嵌表值函數(shù) 和多語句表值函數(shù)的返回值都是表,其不同之處在于,內(nèi)嵌表值函數(shù)沒有函數(shù)體,返回的表是單個 SELECT語句的結(jié)果集;而多語句表值函數(shù)在?BEGIN ··· END 塊中定義的函數(shù)主體包含 T-SQL 語句,這些語句可生成行,并將行插入至表中,最后返回表。
--??多語句表值函數(shù)的創(chuàng)建語法格式
CREATE? FUNCTIOIN? [ owner_name.?]? ?function_name? ? /*? 函數(shù)名部分? */
? ? ? ? ( [ { @parameter_name? ?[ AS ]? ?parameter_data_type
? ? ? ? ? ? ? ? [ = DEFAULT ]?}? ?[ , ... n ]??] )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /*? 定義函數(shù)參數(shù)部分? */
RETURNS? ?@return_variable? table?
[ AS ]
BEGIN
? ? ? ? function_body? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /*? 函數(shù)體部分? */
? ? ? ? ? ? ? ? RETURN? ? ??
END
?
--??@return_variable:是一個 TABLE 類型的變量,用于存儲和累積返回的表中的數(shù)據(jù)行。其余參數(shù)與標(biāo)量函數(shù)相同。
--? 示例:創(chuàng)建多語句表值函數(shù),通過學(xué)號作為實參調(diào)用該函數(shù),可顯示該學(xué)生的姓名,以及各門功課的成績和學(xué)分。
create? ?function? ?st_score? (@no? char(20))? ?returns? ?@score? ?table
(
s_no? char(20),
s_name? ?nvarchar(20),
c_name? ?nvarchar(20),
c_score? ?tinyint,
c_credit? ?tinyint
)
as? ?
begin
? ? ? ? insert? ?into? ?@score
? ? ? ? select? s.sno, s.sname, c.cname, sc.score, c.credit
? ? ? ? from? ?student? s,? course? ?c,? sc? ?sc??
? ? ? ? where? ?s.sno = sc.sno? and? sc.cno = c.cno? and? s.sno = @co
? ? ? ? return
end
? ? ? ? 多語句表值函數(shù)的調(diào)用方法與內(nèi)嵌表值函數(shù)的調(diào)用方法相同,只能通過 SELECT 語句調(diào)用。
--? 示例:查詢201602001號學(xué)生的姓名以及各門功課的成績和學(xué)分。
select? *? from? st_score('201602001')
若有不足之處,歡迎大佬斧正。
柚子快報激活碼778899分享:數(shù)據(jù)庫 筆記 SQL中的函數(shù)
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。