SQL必知必會—使用資料處理函式
《SQL必知必會》讀書筆記
1.函式
與幾乎所有DBMS都等同地支援SQL語句(如SELECT)不同,每一個DBMS都有特定的函式。事實上,只有少數幾個函式被所有主要的DBMS等同支援。
DBMS函式的差異:
可以看到,與SQL語句不一樣,SQL函式不是可移植的。這表示為特定SQL實現編寫的程式碼在其他實現中可能不正常。
2.使用函式
大多數SQL實現支援以下型別的函式。
- 用於處理文字字串(如刪除或填充值,轉換值為大寫或小寫)的文字函式。
- 用於在數值資料上進行算術操作(如返回絕對值,進行代數運算)的數值函式。
- 用於處理日期和時間值並從這些值中提取特定成分(如返回兩個日期之差,檢查日期有效性)的日期和時間函式。
- 返回DBMS正使用的特殊資訊(如返回使用者登陸資訊)的系統函式。
我們在上一課看到函式用作SELECT語句的列表成分,但函式的作用不僅於此。它還可以作為SELECT語句的其他成分,如WHERE子句中使用,在其他SQL語句中使用等,後面會做更多的介紹。
3.文字處理函式
常用的文字處理函式:
- LEFT() 返回字串左邊的字元
- LENGTH() 返回字串的長度
- LOWER() 將字串轉換為小寫
- LTRIM() 去掉字串左邊的空格
- RIGHT() 返回字串右邊的字元
- RTRIM() 去掉字串右邊的空格
- SOUNDEX() 返回字串的SOUNDEX()
- UPPER() 將字串轉換為大寫
SELECT vend_name, UPPER(vend_name) as vend_name_upcase
FROM Vendors
vend_name vend_name_upcase
Bear Emporium BEAR EMPORIUM
Bears R Us BEARS R US
Doll and Inc. DOLL HOUSE INC.
4.日期和時間處理函式
應用程式一般不使用日期和時間的儲存格式,因此日期和時間函式總是用來讀取、統計和處理這些值。由於這個原因,日期和時間函式在SQL中具有重要的作用。遺憾的是,它們很不一致,可移植性最差。
SQL Serve
SELECT order_num
FROM Orders
WHERE DATEPART(yy,order_date) = 2012
order_num
20005
20006
20007
20008
20009
Access
SELECT order_num
FROM Orders
WHERE DATEPART(yyyy,order_date) = 2012
這個例子中,DATEPART()函式返回日期的一部分。DATEPART()函式有兩個引數,它們分別是返回的成分和從中返回成分的日期。
PostgreSQL類似功能的DATE_PART()函式
SELECT order_num
FROM Orders
WHERE DATE_PART('year',order_date) = 2012
Oracle
Oracle沒有上述兩個函式,不過有幾個可用來完成相同檢索的日期處理函式。
SELECT order_num
FROM Orders
WHERE to_number(t0_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()函式用來將兩個字串轉換為日期。
MySQL和MariaDB
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具有比較日期、執行基於日期的運算、選擇日期格式等的函式。
5.數值處理函式
數值處理函式僅處理數值資料。
在主要DBMS的函式中,數值函式是最一致、最統一的函式。