sql常用函式分析
一旦成功地從表中檢索出資料,就需要進一步操縱這些資料,以獲得有用或有意義的結果。這些要求包括:執行計算與數學運算、轉換資料、解析數值、組合值和聚合一個範圍內的值等。
下表給出了T-SQL函式的類別和描述。
函式類別 |
作用 |
聚合函式 |
執行的操作是將多個值合併為一個值。例如 COUNT、SUM、MIN 和 MAX。 |
配置函式 |
是一種標量函式,可返回有關配置設定的資訊。 |
轉換函式 |
將值從一種資料型別轉換為另一種。 |
加密函式 |
支援加密、解密、數字簽名和數字簽名驗證。 |
遊標函式 |
返回有關遊標狀態的資訊。 |
日期和時間函式 |
可以更改日期和時間的值。 |
數學函式 |
執行三角、幾何和其他數字運算。 |
元資料函式 |
返回資料庫和資料庫物件的屬性資訊。 |
排名函式 |
是一種非確定性函式,可以返回分割槽中每一行的排名值。 |
行集函式 |
返回可在 Transact-SQL 語句中表引用所在位置使用的行集。 |
安全函式 |
返回有關使用者和角色的資訊。 |
字串函式 |
可更改 char、varchar、nchar、nvarchar、binary 和 varbinary 的值。 |
系統函式 |
對系統級的各種選項和物件進行操作或報告。 |
系統統計函式 |
返回有關 SQL Server 效能的資訊。 |
文字和影象函式 |
可更改 text 和 image 的值。 |
函式的組成
函式的目標是返回一個值。大多數函式都返回一個標量值(scalar value),標量值代表一個數據單元或一個簡單值。實際上,函式可以返回任何資料型別,包括表、遊標等可返回完整的多行結果集的型別。本章不準備討論到這個深度,第12章將講解如何建立和使用使用者自定義函式,以返回更復雜的資料。
函式己經存在很長時間了,它的歷史比SQL還要長。在幾乎所有的程式語言中,函式呼叫的方式都是相同的:
Result=Function()
在T-SQL中,一般用SELECT語句來返回值。如果需要從查詢中返回一個值,就可以把SELECT當成輸出運算子,而不用使用等號:
SELECT Function()
一個論點
對於SQL函式而言,引數表示輸入變數或者值的佔位符。函式可以有任意個引數,有些引數是必須的,而有些引數是可選的。可選引數通常被置於以逗號隔開的引數表的末尾,以便於在函式呼叫中去除不需要的引數。
在SQL Server線上圖書或者線上幫助系統中,函式的可選引數用方括號表示。在下列的CONVERT()函式例子中,資料型別的length和style引數是可選的:
CONVERT (data-type [(length)], expression[,style])
可將它簡化為如下形式,因為現在不討論如何使用資料型別:
CONVERT(date_type, expression[,style])
根據上面的定義,CONVERT()函式可接受2個或3個引數。因此,下列兩個例子都是正確的:
SELECT CONVERT(Varchar(20), GETDATE()) SELECT CONVERT(Varchar(20), GETDATE(), 101) |
這個函式的第一個引數是資料型別Varchar(20),第2個引數是另一個函式GETDATE()。GETDATE()函式用datetime資料型別將返回當前的系統日期和時間。第2條語句中的第3個引數決定了日期的樣式。這個例子中的101指以mm/dd/yyyy格式返回日期。本章後面將詳細介紹GETDATE()函式。即使函式不帶引數或者不需要引數,呼叫這個函式時也需要寫上一對括號,例如GETDATE()函式。注意在書中使用函式名引用函式時,一定要包含括號,因為這是一種標準形式。
確定性函式
由於資料庫引擎的內部工作機制,SQL Server必須根據所謂的確定性,將函式分成兩個不同的組。這不是一種新時代的信仰,只和能否根據其輸入引數或執行對函式輸出結果進行預測有關。如果函式的輸出只與輸入引數的值相關,而與其他外部因素無關,這個函式就是確定性函式。如果函式的輸出基於環境條件,或者產生隨機或者依賴結果的演算法,這個函式就是非確定性的。例如,GETDATE()函式是非確定性函式,因為它不會兩次返回相同的值。為什麼要把看起來簡單的事弄得如此複雜呢?主要原因是非確定性函式與全域性變數不能在一些資料庫程式設計物件中使用(如使用者自定義函式)。部分原因是SQL Server快取與預編譯可執行物件的方式。例如,即席查詢可以使用任何函式,不過如果打算構建先進的、可重用的程式設計物件,理解這種區別很重要。
以下這些函式是確定性的:
l AVG()(所有的聚合函式都是確定性的)
l CAST()
l CONVERT()
l DATEADD()
l DATEDIFF()
l ASCII()
l CHAR()
l SUBSTRING()
以下這些函式與變數是非確定性的:
l GETDATE()
l @@ERROR
l @@SERVICENAME
l CURSORSTATUS()
l RAND()
在函式中使用使用者變數
變數既可用於輸入,也可用於輸出。在T-SQL中,使用者變數以@符號開頭,用於宣告為特定的資料型別。可以使用SET或者SELECT語句給變數賦值。以下的例子用於將一個int型別的變數@MyNumber傳遞給SQRT()函式:
DECLARE @MyNumber int SET @MyNumber=144 SELECT SQRT(@MyNumber) |
結果是12,即144的平方根。
用SET給變數賦值
以下例子使用另一個int型的變數@MyResult,來捕獲該函式的返回值。這個技術類似於程序式程式設計語言中的函式呼叫樣式,即把SET語句和一個表示式結合起來,給引數賦值:
DECLARE @MyNumber int, @MyResult int SET @MyNumber = 144 -- Assign the function result to the variable: SET @MyResult = SQRT(@MyNumber) -- Return the variable value SELECT @MyResult |
用SELECT給變數賦值
使用SELECT的另一種形式也可以獲得同樣的結果。對變數要在賦值前要先宣告。使用SELECT語句來替代SET命令的主要優點是,可以在一個操作內同時給多個變數賦值。執行下面的SELECT語句,通過SELECT語句賦值的變數就可以用於任何操作了。
DECLARE @MyNumber1 int, @MyNumber2 int, @MyResult1 int, @MyResult2 int SELECT @MyNumber1 = 144, @MyNumber2 = 121 -- Assign the function result to the variable: SELECT @MyResult1 = SQRT(@MyNumber1), @MyResult2 = SQRT(@MyNumber2) -- Return the variable value SELECT @MyResult1, @MyResult2 |
上面的例子首先聲明瞭4個變數,然後用兩個SELECT語句給這些變數賦值,而不是用4個SELECT語句給變數賦值。雖然這些技術在功能上是相同的,但是在伺服器的資源耗費上,用一個SELECT語句給多個變數賦值一般比用多個SET命令的效率要高。將一個甚至多個值選進引數的限制是,對變數的賦值不能和資料檢索操作同時進行。這就是上面的例子使用SELECT語句來填充變數,而用另外一個SELECT語句來檢索變數中資料的原因。例如,下面的指令碼就不能工作:
DECLARE @RestockName varchar(50) SELECT ProductId ,@RestockName = Name + ':' + ProductNumber FROM Production.Product |
這個指令碼會產生如下錯誤:
訊息141,級別15,狀態1,第2 行 向變數賦值的SELECT 語句不能與資料檢索操作結合使用。 |
在查詢中使用函式
函式經常和查詢表示式結合使用來修改列值。這隻需將列名作為引數傳遞給函式即可,隨後函式將引用插入到SELECT查詢的列的列表中,如下所示:
SELECT Title, NationalIDNumber, YEAR(BirthDate) AS BirthYear FROM HumanResources.Employee |
在這個例子中,BirthDate列的值被作為引數傳遞給YEAR()函式。函式的結果是別名為BirthYear的列。
巢狀函式
我們需要的功能常常不能僅由一個函式來實現。根據設計,函式應儘量簡單,用於提供特定的功能。如果一個函式要執行許多不同的操作,就變得複雜和難以使用。因此,每個函式通常僅執行一個操作,要實現所有的功能,可以將一個函式的返回值傳遞給另一個函式,這稱為巢狀函式呼叫。
以下是一個簡單的例子:GETDATE()函式的作用是返回當前的日期與時間,但不能返回經過格式化的資料,因為這是CONVERT()函式的功能。要想同時使用這兩個函式,可以把GETDATE()函式的輸出作為CONVERT()函式的輸入引數。
SELECT CONVERT(Varchar(20), GETDATE(), 101) |
聚合函式
報表的典型用途是從全部資料中提取出代表一種趨勢的值或者彙總值,這就是聚合的意義。聚合函式回答資料使用者的如下問題:
上個月雞雛的總銷售量是多少?
19~24歲之間的巴西男性在食品調味品上的平均支出是多少?
上季度所有訂單中從訂購到運輸的最長時間是多少?
收發室裡仍在工作的最老的員工是誰?
聚合函式應用特定的聚合操作並返回一個標量值(單一值)。返回的資料型別對應於該列或者傳遞到函式中的值。聚合經常和分組、累積以及透視等表運算一起使用,生成資料分析結果。第7章將詳細介紹這個主題,這裡僅討論簡單SELECT查詢中的一些常用函式。
聚合函式不僅可用在SELECT查詢中,還可以和標量輸入值一起使用。那麼,這樣做的意義是什麼呢?在下列程式碼中,將值15傳遞給下列聚合函式,每個函式的返回值都相同:
SELECT AVG(15) SELECT SUM(15) SELECT MIN(15) SELECT MAX(15) |
它們都返回15。雖然,對同一個值求平均、求和、求最小值、求最大值,所得的結果還是那個值。如果對一個值計數,又會產生什麼結果呢?
SELECT COUNT(15)
得到的值是1,因為函式只計數了一個值。
現在做一些有意義的事。聚合函式只有在處理結果集合中的一組資料時才有意義。每個函式都處理某列的非空值。除非使用分組操作(詳見第7章),否則不能在同一個SELECT語句中既返回聚合的值,又返回常規的列值。
AVG()函式
AVG()函式用於返回一組數值中所有非空數值的平均值。例如,表6-2包含了體操成績。
表 6-2
體操運動員 |
項 目 |
成 績 |
Sara |
跳馬 |
9.25 |
Cassie |
跳馬 |
8.75 |
Delaney |
跳馬 |
9.25 |
Sammi |
跳馬 |
8.05 |
Erika |
跳馬 |
8.60 |
Sara |
平衡木 |
9.70 |
Cassie |
平衡木 |
9.00 |
Delaney |
平衡木 |
9.25 |
Sammi |
平衡木 |
8.95 |
Erika |
平衡木 |
8.85 |
對這些資料執行以下查詢:
SELECT AVG(Score)
結果是8.965。
如果有三個女孩沒有完成一些專案,在表中沒有記錄成績,則可用NULL來表示(見表6-3)。
表 6-3
體操運動員 |
項 目 |
成 績 |
Sara |
跳馬 |
9.25 |
Cassie |
跳馬 |
8.75 |
Delaney |
跳馬 |
NULL |
Sammi |
跳馬 |
8.05 |
Erika |
跳馬 |
8.60 |
Sara |
平衡木 |
9.70 |
Cassie |
平衡木 |
NULL |
Delaney |
平衡木 |
9.25 |
Sammi |
平衡木 |
NULL |
Erika |
平衡木 |
8.85 |
指令碼:
create table #GymEvent(Player varchar(10),[Subject] nvarchar(5),Scoredecimal(4,2)) go insert into #GymEvent values('Sara','跳馬',9.25) insert into #GymEvent values('Cassie','跳馬',8.75) insert into #GymEvent values('Delaney','跳馬',NULL) insert into #GymEvent values('Sammi','跳馬',8.05) insert into #GymEvent values('Erika','跳馬',8.60) insert into #GymEvent values('Sara','平衡木',9.70) insert into #GymEvent values('Cassie','平衡木',NULL) insert into #GymEvent values('Delaney','平衡木',9.25) insert into #GymEvent values('Sammi','平衡木',NULL) insert into #GymEvent values('Erika','平衡木',8.85) go drop table #GymEvent |
在這種情況下,計算平均值時只考慮實際的數值,NULL不參與運算,結果是8.921429。 但是,如果把缺少的成績也算在內,即用數值0代替NULL,則會嚴重影響最終成績(6.245),她們能不能進入國家級的比賽就難說了。
COUNT()函式
COUNT()函式用於返回一個列內所有非空值的個數,這是一個整型值。比如,在上一個例子中,體操資料被儲存在#GymEvent表中,要確定Sammi參加的專案數,則可以執行下列查詢:
SELECT COUNT(Score) FROM #GymEvent WHERE Player='Sammi'
結果是1,因為Sammi只參加了跳馬比賽,她的平衡木成績是NULL。
如果需要確定表中的行數,無論這些行是不是NULL值,都可以使用以下語法:
SELECT COUNT (*) FROM #GymEvent
以Sammi為例,COUNT(*)查詢如下所示:
SELECT COUNT(*) FROM #GymEvent WHERE Player='Sammi'
由於COUNT(*)函式會忽略NULL值,所以這個查詢的結果是2。
MIN()與MAX()函式
MIN()函式用於返回一個列範圍內的最小非空值;MAX()函式用於返回最大值。這兩個函式可以用於大多數的資料型別,返回的值根據對不同資料型別的排序規則而定。為了說明這兩個函式,假設有一個表包含了兩列值,一列是整型值,另一列是字元型值,如表6-4所示。
IntegerColumn(int型別) |
VarCharColumn(varChar型別) |
2 |
2 |
4 |
4 |
12 |
12 |
19 |
19 |
表 6-4
指令碼:
create table #Temp(IntegerColumn int,VarCharColumn varchar(10)) go insert into #Temp values(2,'2') insert into #Temp values(4,'4') insert into #Temp values(12,'12') insert into #Temp values(19,'19') go drop table #Temp |
如果分別呼叫MIN()與MAX()函式將會返回什麼值呢?
select MIN(IntegerColumn),MAX(IntegerColumn) from #Temp select MIN(VarCharColumn),MAX(VarCharColumn) from #Temp |
因為VarCharColumn中值的儲存型別為字元型別,而不是數字,所以結果以每個字元的ASCII值為順序從左到右排序。這就是12比其他值小、而4比其他值大的原因。
SUM()函式
SUM()函式是最常用的聚合函式之一,它的功能很容易理解:和AVG()函式一樣,它用於數值資料型別,返回一個列範圍內所有非空值的總和。
配置變數
配置變數不是函式,不過它們的用法和系統函式相同。每個全域性變數都能夠返回SQL Server執行環境的標量資訊。以下是一些常見的例子。
@@ERROR變數
這個變數包含當前連線發生的最後一次錯誤的程式碼。在執行的語句沒有錯誤時,@@ERROR變數的值是0。出現標準錯誤時,錯誤是由資料庫引擎引發的。所有的標準錯誤程式碼與訊息都儲存在sys.messages系統檢視中,可以使用如下指令碼查詢:
SELECT * FROM sys.messages
定製錯誤可以通過呼叫RAISERROR語句來手動引發,並呼叫sp_addmessage系統儲存過程將其新增到sysmessages表中。
以下是一個@@ERROR變數的簡單例子。先試著將一個數除以0,資料庫引擎會引發標準錯誤號為8134的錯誤。注意檢視Results選項卡中的查詢結果。在發生錯誤時,Management Studio的Messages選項卡將預設顯示在Results選項卡的上面:
SELECT 5 / 0 SELECT @@ERROR |
在成功檢索@@ERROR的值後,@@ERROR的值將返回0,因為@@ERROR只儲存了上次執行的語句的錯誤程式碼。如果希望檢索更多的錯誤資訊,可以使用如下指令碼從sysmessages檢視中得到:
SELECT 5 / 0 SELECT * FROM master.dbo.sysmessages WHERE error = @@ERROR |
本節的後面部分內容將說明如何通過使用錯誤函式來更高效地返回錯誤資料。
error |
severity |
dlevel |
description |
msglangid |
8134 |
16 |
0 |
Divide by zero error encountered. |
1033 |
8134 |
16 |
0 |
Fehler aufgrund einer Division durch Null. |
1031 |
8134 |
16 |
0 |
Division par zéro. |
1036 |
8134 |
16 |
0 |
0 除算エラーが発生しました。 |
1041 |
8134 |
16 |
0 |
Error de división entre cero. |
3082 |
8134 |
16 |
0 |
Errore di divisione per zero. |
1040 |
8134 |
16 |
0 |
Обнаружена ошибка: деление на ноль. |
1049 |
8134 |
16 |
0 |
Erro de divisão por zero. |
1046 |
8134 |
16 |
0 |
發現除以零的錯誤。 |
1028 |
8134 |
16 |
0 |
0으로 나누기 오류가 발생했습니다. |
1042 |
8134 |
16 |
0 |
遇到以零作除數錯誤。 |
2052 |
除了美國英語之外,SQL Server還預設安裝了其他語言。每種語言專用的錯誤訊息都有一個語言識別符號(mslangid),對應於syslanguages表中的一種語言,如下圖所示。
屬性名mslangid被非正式地定義為Microsoft Global Language Identifier。微軟公司用這個識別符號來標識一種語言或語言和國家的組合,微軟公司把語言和國家的組合定義為地區。例如,在隨SQL Server安裝的英語中,美國英語的mslangid是1033,英國英語的mslangid是2057。要檢索出所有已安裝的、支援的語言,可以執行下面的查詢:
SELECT alias, name, msglangid FROM sys.syslanguages |
@@SERVICENAME變數
這個變數是用於執行和維護當前SQL Server例項的Windows服務名。它通常返回SQL Server預設例項MSSQLSERVER,但SQL Server的指定例項有唯一的服務名。例如在名為WoodVista的計算機上有兩個SQL Server例項:預設例項和指定例項AughtEight。如在預設例項上檢索@@SERVICENAME全域性變數的內容,將返回MSSQLSERVER,但在指定例項上檢索,會返回AUGHTEIGHT。
@@TOTAL_ERRORS變數
這個變數用於記錄從開啟當前連線開始發生的總錯誤次數。和@@ERROR變數一樣,它對每個使用者會話是唯一的,並將在連線關閉時被重置。
@@TOTAL_READ變數
這個變數記錄從開啟當前連線時開始計算的磁碟讀取總數。DBA使用這個變數檢視磁碟讀取活動的情況。
@@VERSION變數
這個變數包含當前SQL Server例項的完整版本資訊。
SELECT @@VERSION
比如,對於執行在Windows 7上的SQL Server 2008開發版例項,以上指令碼能夠返回如下資訊:
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 6.1 <X86> (Build 7600: )
實際的版本號是一個簡單的整型值,它在微軟公司內部使用。而發行的產品可能有其他的商標名。在本例中,SQL Server 2005的版本是9,SQL Server 2008的版本是10。Windows XP Professional顯示為Windows NT 5.l版,而Vista顯示為6.0版。構建號用於內部控制,反映beta版和預覽版以及正式發行後的補丁包的變化。
錯誤函式
前面學習瞭如何使用@@ERROR全域性變數來檢索錯誤資訊。而返回所有錯誤資料的更好方法是使用錯誤函式。這些函式返回的資訊可以儲存在錯誤跟蹤表中,以供錯誤稽核。錯誤函式巢狀在錯誤處理例程中。第11章將詳細討論錯誤處理,其實通過使用巢狀在TRY和END TRY語句中的程式碼塊,後跟一個放在CATCH和END CATCH語句中的程式碼塊就可以實現錯誤處理。
--Try to do something BEGIN TRY SELECT 5 / 0 END TRY --If it causes an error, do this BEGIN CATCH PRINT ERROR_MESSAGE() END CATCH |
所謂的錯誤捕獲,其實就是這個意思。如果執行上面的示例,將不會出現可識別的錯誤,因為錯誤將被捕獲並在CATCH語句塊中進行處理。在編寫錯誤處理程式碼時,SQL程式設計師必須把這些程式碼放在會引發系統錯誤的catch程式碼塊中。
下列幾個錯誤函式用於返回錯誤的特定資訊:
函式 |
說明 |
ERROR_MESSAGE() |
返回錯誤的描述。 |
ERROR_NUMBER() |
返回錯誤號。 |
ERROR_SEVERITY() |
返回錯誤的嚴重級別。錯誤的嚴重級別是一個從0到25的整數。 |
ERROR_STATE() |
返回錯誤的狀態號。錯誤狀態是一個整數,可以唯一地表示系統錯誤的原因。 |
ERROR_LINE() |
返回例程中導致出錯的行號。 |
ERROR_PROCEDURE() |
返回發生錯誤的儲存過程名或觸發器名。 |
下表簡要描述了嚴重級別。
嚴 重 級 別 |
說 明 |
0~10 |
資訊性訊息。不會引發系統錯誤 |
11~16 |
使用者可以更正的錯誤,例如違反了外來鍵或主鍵規則 |
17 |
非致命的、不重要的資源錯誤 |
18 |
非致命的內部錯誤 |
19 |
致命的、不重要的資源錯誤 |
20 |
當前程序中的致命錯誤 |
21 |
所有程序中的致命資料庫錯誤 |
22 |
致命的表完整性錯誤 |
23 |
致命的資料庫完整性錯誤 |
24 |
致命的硬體錯誤 |
25 |
致命的系統錯誤 |
下面指令碼使用T-SQL的內建錯誤處理功能,來捕獲和輸出遇到除0錯誤時返回的錯誤資料。SELECT命令的結果將顯示在Management Studio的訊息選項卡中。
--Try to do something BEGIN TRY SELECT 5 / 0 END TRY --If it causes an error, do this BEGIN CATCH SELECT ERROR_MESSAGE(),ERROR_NUMBER(),ERROR_SEVERITY(), ERROR_STATE(),ERROR_LINE(),ERROR_PROCEDURE() END CATCH |
可以看出,執行這個指令碼會在訊息選項卡中返回有關錯誤的更多詳細資訊,而不僅僅是錯誤號本身。
ERROR_PROCEDURE()函式不能返回過程名,因為錯誤是在ad-hoc查詢中生成的。
轉換函式
資料型別轉換可以通過CAST()和CONVERT()函式來實現。大多數情況下,這兩個函式是重疊的,它們反映了SQL語言的演化歷史。這兩個函式的功能相似,不過它們的語法不同。雖然並非所有型別的值都能轉變為其他資料型別,但總的來說,任何可以轉換的值都可以用簡單的函式實現轉換。
CAST()函式
CAST()函式的引數是一個表示式,它包括用AS關鍵字分隔的源值和目標資料型別。以下例子用於將文字字串'123'轉換為整型:
SELECT CAST('123' AS int)
返回值是整型值123。如果試圖將一個代表小數的字串轉換為整型值,又會出現什麼情況呢?
SELECT CAST('123.4' AS int)
CAST()函式和CONVERT()函式都不能執行四捨五入或截斷操作。由於123.4不能用int資料型別來表示,所以對這個函式呼叫將產生一個錯誤:
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value
'123.4' to a column of data type int.
在將varchar 值'123.4' 轉換成資料型別int 時失敗。
要返回一個合法的數值,就必須使用能處理這個值的資料型別。對於這個例子,存在多個可用的資料型別。如果通過CAST()函式將這個值轉換為decimal型別,需要首先定義decimal值的精度與小數位數。在本例中,精度與小數位數分別為9與2。精度是總的數字位數,包括小數點左邊和右邊位數的總和。而小數位數是小數點右邊的位數。這表示本例能夠支援的最大的整數值是9999999,而最小的小數是0.01。
SELECT CAST('123.4' AS decimal(9,2))
decimal資料型別在結果網格中將顯示有效小數位:123.40
精度和小數位數的預設值分別是18與0。如果在decimal型別中不提供這兩個值,SQL Server將截斷數字的小數部分,而不會產生錯誤。
SELECT CAST('123.4' AS decimal)
結果是一個整數值:123
在表的資料中轉換資料型別是很簡單的。下面的例子使用Product表,首先執行如下查詢:
SELECT ProductNumber, ProductLine, ProductModelID FROM Production.Product WHERE ProductSubcategoryID < 4 |
假定產品經理已經建立了一個系統,用於唯一地標識生產出來的每輛自行車,以便跟蹤其型號、型別和類別。他決定合併產品號、產品生產線識別符號、產品型號識別符號和一個順序號,為生產出來的每輛自行車建立一個唯一的序列號。在這個過程的第一步,他要求提供包括除順序號之外的所有屬性的所有可能產品的根識別符號。
如果使用下面的表示式,就不能得到希望的結果,如圖6-2所示。
SELECT ProductNumber + '-' + ProductLine + '-' + ProductModelID AS BikeSerialNum FROM Production.Product WHERE ProductSubcategoryID < 4 |
訊息245,級別16,狀態1,第1 行 在將nvarchar 值'BK-R93R-62-R -' 轉換成資料型別int 時失敗。 |
我們沒有得到希望的結果,而得到了有點奇怪的錯誤訊息:請把nvarchar值轉換為int。因為之前我們沒有要求進行任何轉換,所以這個錯誤很奇怪。這個查詢的問題在於我們試圖利用第一個連線符來連線字元值ProductNumber,利用第二個連線符連線另一個字元值ProductLine,最後連線的是ProductModelID字元值(它是一個整數)。
查詢引擎會把連線符當成一個數學運算子,而不是一個字元。不管結果是什麼,都需要更正這個表示式,以確保使用正確的資料型別。以下表達式執行了必要的型別轉換,返回如圖6-3所示的結果:
SELECT ProductNumber + '-' + ProductLine + '-' + CAST(ProductModelID AS char(4)) AS BikeSerialNum FROM Production.Product WHERE ProductSubcategoryID < 4 |
如果把整型值轉換為字元型別就不會增加多餘的空格了。查詢引擎將把這些值用加號和連線符組合在一起,進行字串連線運算,而不是和前面的數值進行加法或者減法運算了。
CONVERT()函式
對於簡單型別轉換,CONVERT()函式和CAST()函式的功能相同,只是語法不同。CAST()函式一般更容易使用,其功能也更簡單。CONVERT()函式的優點是可以格式化日期和數值,它需要兩個引數:第1個是目標資料型別,第2個是源資料。以下的兩個例子和上一節的例子類似:
SELECT CONVERT(int, '123') SELECT
一旦成功地從表中檢索出資料,就需要進一步操縱這些資料,以獲得有用或有意義的結果。這些要求包括:執行計算與數學運算、轉換資料、解析數值、組合值和聚合一個範圍內的值等。
下表給出了T-SQL函式的類別和描述。
函式類別
作用
聚
一、字元轉換函式
1、ASCII()
返回字元表示式最左端字元的ASCII 碼值。在ASCII()函式中,純數字的字串可不用‘’括起來,但含其它字元的字串必須用‘’括起來使用,否則會出錯。
2、CHAR()
將ASCII 碼轉換為字元。如果沒有輸入0 ~ 255 之間的A
說明,本文所述,全部是針對使用SQL語句操作DB2,而不是在AS400的綠屏下使用AS400的命令操作Library、object、menber
一、AS400 DB2 SQL語法基礎特別說明
1、AS400 DB2 SQL庫、表、欄位名都不區分大小寫
以下的函式分別在mssqlserver和oracle中進行測試,只列出常用的函式,不列出具體用法.
1,得到系統時間函式
mssqlserver getDate()
oracle sysDate
2, 提取串的組成部分
mssqlserver
http://www.cnblogs.com/hantianwei/archive/2009/12/03/1616148.html
http://www.cnblogs.com/wanghonghu/p/4099712.html
--==================================--SQL 基礎-->常用函式--==================================/*一、函式的分類SQL函式一般分為兩種單行函式基於單行的處理,一行產生一個結果多行函式基於多行
在Oracle中
可以使用**instr**函式對某個字串進行判斷,判斷其是否含有指定的字元。
其語法為:
**instr(sourceString,destString,start,appearPosition)**. instr('源字串' , '目標字 BIN(x) 返回x的二進位制(OCT返回八進位制,HEX返回十六進位制)CEILING(x) 返回大於x的最小整數值EXP(x) 返回值e(自然對數的底)的x次方FLOOR(x) 返回小於x的最大整數值GREATEST(x1,x2,...,xn)返回集合中最大的值LEAST(x1,x2,..
表8-2 中的SOUNDEX 需要做進一步的解釋。SOUNDEX 是一個將任何文字串轉換為描述其語音表示的字母數字模式的演算法。SOUNDEX 考慮了類似的發音字元和音節,使得能對字串進行發音比較而不是字母比較。雖然SOUNDEX 不是SQL 概念,但多數D
目錄
第二章 常用函式
1 檔案讀寫示例
建立對角矩陣: np.eye(2)
儲存為txt檔案:np.savetxt("eye.txt", i2)
2 CSV檔案讀取: loadtxt()
3 &nb
03. 矩陣運算和常用函式(重點)
文章目錄
03. 矩陣運算和常用函式(重點)
1. numpy 矩陣判斷和計算
1.1 與運算
1.2 或運算
1.3 或運算作為矩陣索引賦值
(1)sum函式,統計總合 按照月份,統計每個地區的總收入 Sql程式碼
select earnmonth, area, sum(personincome) from earnings group by earnmonth,area; 檢視結果如下:
(2)rollup函式 按照月份 Sql注入擷取字串常用函式
在sql注入中,往往會用到擷取字串的問題,例如不回顯的情況下進行的注入,也成為盲注,這種情況下往往需要一個一個字元的去猜解,過程中需要用到擷取字串。本文中主要列舉三
Oracle:(百度百科查詢整理) 1,ROUND()函式為四捨五入函式 Round(number,[decimals] number 待做四捨五入處理的數值 decimals 指明需保留小數點後面的位數
在sql注入中,往往會用到擷取字串的問題,例如不回顯的情況下進行的注入,也成為盲注,這種情況下往往需要一個一個字元的去猜解,過程中需要用到擷取字串。本文中主要列舉三個函式和該函式注入過程中的一些用例。Ps;此處用mysql進行說明,其他型別資料庫請自行檢測。
三大法寶:
視窗函式與分析函式
應用場景:
(1)用於分割槽排序
(2)動態Group By
(3)Top N
(4)累計計算
(5)層次查詢
視窗函式
FIRST_VALUE:取分組內排序後,截止到當前行,第一個值
LAST_VALUE: 取分組內排序後,截止到當前行,最
MySQL是一個關係型資料庫管理系統,在開始學習MySQL資料庫前,讓我們先了解下RDBMS的一些術語:
資料庫: 資料庫是一些關聯表的集合。
資料表: 表是資料的矩陣,在一個數據庫中的表看起來像一個簡單的電子表格。
列:一列(資料元素) 包含了相同的資料,例如郵政編碼
1.1 Hive函式分類
1.2 Hive CLI命令
顯示當前會話有多少函式可用
show functions;
顯示函式的描述資訊:
DESC FUNCTION concat;
顯示函式的擴充套
save C:\Users\DH2016PSY\Desktop\資料庫PPT18\SY3\SY3.sql;
save C:\Users\DH2016PSY\Desktop\資料庫PPT18\SY3\SY3.sql append;
1.ASCII:返回與指定的字元對應的ASCII碼。
RELATED函式
RELATED(ColumnName)
RELATED(返回的對應值的列名)
→從其他表返回相關值
類似於Excel中的Vlookup,Power Query中的合併查詢RELATED 函式要求當前表與包含相關資訊的表之間存在關係,需要指定包含所需資 |