SQL必知必會筆記八(使用函式處理資料)

2021-10-05 11:49:59 字數 3938 閱讀 6047

什麼是函式,dbms支援何種函式,以及如何使用這些函式;為什麼sql函式的使用可能會帶來問題。

一、函式

與大多數其他計算機語言一樣,sql也可以用函式來處理資料。函式一般是在資料上執行的,為資料的轉換和處理提供了方便。

例如sql必知必會筆記七(建立計算字段)用來去掉字串尾的空格的rtrim()就是乙個函式。

函式帶來的問題:

與幾乎所有dbms都等同地支援sql語句(如select)不同,每乙個dbms都有特定的函式。事實上,只有少數幾個函式被所有主要的dbms等同地支援。雖然所有型別的函式一般都可以在每個dbms中使用,但各個函式的名稱和語法可能極其不同。

表8-1 dbms函式的差異

可以看到,與sql語句不一樣,sql函式不是可移植的。這意味著為特定sql實現編寫的**在其他實現中可能不正常。

可移植(portable)

所編寫的**可以在多個系統上執行。

如果你決定使用函式,應該保證做好**注釋,以便以後你(或其他人)能確切地知道所編寫的sql**的含義。

二、使用函式

大多數的sql支援以下型別的函式:

• 用於處理文字字串(如刪除或填充值,轉換值為大寫或小寫)的文字函式。

• 用於在數值資料上進行算術操作(如返回絕對值,進行代數運算)的數值函式。

• 用於處理日期和時間值並從這些值中提取特定成分(如返回兩個日期之差,檢查日期有效性)的日期和時間函式。

• 返回dbms正使用的特殊資訊(如返回使用者登入資訊)的系統函式。

文字處理函式

表8-2 常見的文字處理函式

表8-2中的soundex需要做進一步的解釋。soundex是乙個將任何文字串轉換為描述其語音表示的字母數字模式的演算法。soundex考慮了類似的發音字元和音節,使得能對字串進行發音比較而不是字母比較。雖然soundex不是sql概念,但多數dbms都提供對soundex的支援。

soundex轉換規則:

a e h i o u w y -> 0

b f p v -> 1

c g j k q s x z -> 2

d t -> 3

l -> 4

m n -> 5

r -> 6

1、提取字串的首字母作為soundex的第乙個值。

2、按照上面的字母對應規則,將後面的字母逐個替換為數字。如果有連續的相等的數字,只保留乙個,其餘的都刪除掉。並去除所有的0。

3、如果結果超過4位,取前四位;如果結果不足4位向後補0。

說明:soundex支援

microsoft access和postgresql不支援soundex()

另外,如果在建立sqlite時使用了sqlite_soundex編譯時選項,那麼soundex()在sqlite中就可用。因為sqlite_soundex不是預設的編譯時選項,所以多數sqlite實現不支援soundex()。

例如:customers表中有乙個顧客kids place,其聯絡名為michelle green。但如果這是錯誤的輸入,此聯絡名實際上應該是michael green

select cust_name, cust_contact from customers where cust_contact = 'michael green';

soundex搜尋:

select cust_name, cust_contact from customers where soundex(cust_contact) = soundex('michael green');

where子句使用soundex()函式把cust_contact列值和搜尋字串轉換為它們的soundex值。因為michael green和michelle green發音相似,所以它們的soundex值匹配,因此where子句正確地過濾出了所需的資料。

二、日期和時間處理函式

日期和時間採用相應的資料型別儲存在表中,每種dbms都有自己的特殊形式。日期和時間值以特殊的格式儲存,以便能快速和有效地排序或過濾,並且節省物理儲存空間。

應用程式一般不使用日期和時間的儲存格式,因此日期和時間函式總是用來讀取、統計和處理這些值。由於這個原因,日期和時間函式在sql中具有重要的作用。遺憾的是,它們很不一致,可移植性最差。

例如:orders表中包含的訂單都帶有訂單日期。

為在sql server中檢索2023年的所有訂單:

select order_num from orders where datepart(yy, order_date) = 2012;

在access中使用如下版本:

select order_num from orders where datepart('yyyy', order_date) = 2012;

這個例子(sql server和sybase版本以及access版本)使用了datepart()函式,顧名思義,此函式返回日期的某一部分。datepart()函式有兩個引數,它們分別是返回的成分和從中返回成分的日期。在此例子中,datepart()只從order_date列中返回年份。通過與2012比較,where子句只過濾出此年份的訂單。

postgresql版本:

select order_num from orders where date_part('year', order_date) = 2012;

oracle沒有datepart()函式,不過有幾個可用來完成相同檢索的日期處理函式:

select order_num from orders where to_number(to_char(order_date, 'yyyy')) = 2012;

to_char()函式用來提取日期的成分,to_number()用來將提取出的成分轉換為數值,以便能與2012進行比較。

完成相同工作的另一方法是使用between操作符:

select order_num from orders where order_date between to_date('01-01-2012') and to_date('12-31-2012');

在此例子中,oracle的to_date()函式用來將兩個字串轉換為日期。乙個包含2023年1月1日,另乙個包含2023年12月31日。between操作符用來找出兩個日期之間的所有訂單。值得注意的是,相同的**在sql server中不起作用,因為它不支援to_date()函式。但是,如果用convert()替換to_date(),當然可以使用這種型別的語句。

mysql和mariadb具有各種日期處理函式,但沒有datepart()。mysql和mariadb使用者可使用名為year()的函式從日期中提取年份:

select order_num from orders where year(order_date) = 2012;

在sqlite中有個小技巧:

select order_num from orders where strftime('%y', order_date) = '2012';

這裡給出的例子提取和使用日期的成分(年)。按月份過濾,可以進行相同的處理,使用and操作符可以進行年和月份的比較。

dbms提供的功能遠不只簡單的日期成分提取。大多數dbms具有比較日期、執行基於日期的運算、選擇日期格式等的函式。但是,可以看到,不同dbms的日期-時間處理函式可能不同。關於具體dbms支援的日期-時間處理函式,請參閱相應的文件。

三、數值處理函式

數值處理函式僅處理數值資料。這些函式一般主要用於代數、三角或幾何運算,因此不像字串或日期-時間處理函式使用那麼頻繁。

具有諷刺意味的是,在主要dbms的函式中,數值函式是最一致、最統一的函式。

表8-3 常用數值處理函式

《sql必知必會》筆記

資料庫 儲存有組織的資料的容器 通常是乙個檔案或一組檔案 注意誤用混淆 資料庫軟體被稱為dbms,資料庫是通過dbms建立和操縱的容器 模式 關於資料庫和表的布局及特性的資訊。主鍵 一列或一組列,其值能夠唯一標識表中的每一行。多條sql語句必須以 分隔。sql語句不區分大小寫,select和sele...

SQL必知必會

資料庫 儲存有組織的資料的容器。資料庫管理系統 dbms 資料庫軟體,資料庫是通過dbms建立和操縱的容器。表 某種特定資料型別的結構化清單。資料庫中的每個表都有自己的名字,且唯一。不同的資料庫可以使用相同的表名。表的特性 模式 資料在表中如何儲存,儲存什麼樣的資料,資料如何分解。模式可以用來描述資...

《SQL必知必會》 筆記(1 5)

1.1.3 資料型別 varchar和char的區別 表中的每個列都有相應的資料型別,需要注意的是在不同的資料庫中相同型別的命名也是不同的,這個需要檢視對應資料庫的文件說明 就字元型別來說,mysql有char和varchar,而oracle除了這兩種還有一種varchar2型別,同時它們對應的格式...