SQL 入門教程:使用函式
大多數 SQL 實現支援以下型別的函式。
- 用於處理文字字串(如刪除或填充值,轉換值為大寫或小寫)的文字函式。
- 用於在數值資料上進行算術操作(如返回絕對值,進行代數運算)的數值函式。
- 用於處理日期和時間值並從這些值中提取特定成分(如返回兩個日期之差,檢查日期有效性)的日期和時間函式。
- 用於生成美觀好懂的輸出內容的格式化函式(如用語言形式表達出日期,用貨幣符號和千分位表示金額)。
- 返回 DBMS 正使用的特殊資訊(如返回使用者登入資訊)的系統函式。
我們在 拼接欄位 中看到函式用於 SELECT
語句的其他成分,如在 WHERE 子句 中使用,在其他 SQL 語句中使用等,後面會做更多的介紹。
一、文字處理函式
在 拼接欄位 中,我們已經看過一個文字處理函式的例子,其中使用 RTRIM()
函式來去除列值右邊的空格。下面是另一個例子,這次使用的是 UPPER()
函式:
輸入▼
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
輸出▼
vend_name vend_name_upcase --------------------------- ---------------------------- Bear Emporium BEAR EMPORIUM Bears R Us BEARS R US Doll House Inc. DOLL HOUSE INC. Fun and Games FUN AND GAMES Furball Inc. FURBALL INC. Jouets et ours JOUETS ET OURS
可以看到,UPPER()
將文字轉換為大寫,因此本例子中每個供應商都列出兩次,第一次為 Vendors
表中儲存的值,第二次作為列 vend_name_upcase
轉換為大寫。
提示:大寫,小寫,大小寫混合
此時你應該已經知道 SQL 函式不區分大小寫,因此
upper()
,UPPER()
,Upper()
都可以,substr()
,SUBSTR()
,SubStr()
也都行。隨你的喜好,不過注意保持風格一致,不要變來變去,否則你寫的程式程式碼就不好讀了。
表 2 列出了一些常用的文字處理函式。
表 2 常用的文字處理函式
函式 | 說明 |
---|---|
LEFT() (或使用子字串函式) | 返回字串左邊的字元 |
LENGTH() (也使用 DATALENGTH() 或 LEN() ) |
返回字串的長度 |
LOWER() |
將字串轉換為小寫 |
LTRIM() |
去掉字串左邊的空格 |
RIGHT() (或使用子字串函式) |
返回字串右邊的字元 |
RTRIM() |
去掉字串右邊的空格 |
SUBSTR() 或 SUBSTRING() |
提取字串的組成部分 DB2、Oracle、PostgreSQL 和 SQLite 使用 SUBSTR() ;MariaDB、MySQL 和 SQL Server 使用 SUBSTRING() |
SOUNDEX() |
返回字串的 SOUNDEX 值 |
UPPER() |
將字串轉換為大寫 |
表 2 中的 SOUNDEX
需要做進一步的解釋。SOUNDEX
是一個將任何文字串轉換為描述其語音表示的字母數字模式的演算法。SOUNDEX
考慮了類似的發音字元和音節,使得能對字串進行發音比較而不是字母比較。雖然 SOUNDEX
不是 SQL 概念,但多數 DBMS 都提供對 SOUNDEX 的支援。
說明:
SOUNDEX
支援PostgreSQL 不支援
SOUNDEX()
,因此以下的例子不適用於這個 DBMS。另外,如果在建立 SQLite 時使用了
SQLITE_SOUNDEX
編譯時選項,那麼SOUNDEX()
在 SQLite 中就可用。因為SQLITE_SOUNDEX
不是預設的編譯時選項,所以多數 SQLite 實現不支援SOUNDEX()
。
下面給出一個使用 SOUNDEX()
函式的例子。Customers
表中有一個顧客 Kids Place,其聯絡名為 Michelle Green。但如果這是錯誤的輸入,此聯絡名實際上應該是 Michael Green,該怎麼辦呢?顯然,按正確的聯絡名搜尋不會返回資料,如下所示:
輸入▼
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_contact = 'Michael Green';
輸出▼
cust_name cust_contact
-------------------------- ----------------------------
現在試一下使用 SOUNDEX()
函式進行搜尋,它匹配所有發音類似於 Michael Green 的聯絡名:
輸入▼
SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
輸出▼
cust_name cust_contact
-------------------------- ----------------------------
Kids Place Michelle Green
分析▼
在這個例子中,WHERE 子句 使用 SOUNDEX()
函式把 cust_contact
列值和搜尋字串轉換為它們的 SOUNDEX
值。因為 Michael Green 和 Michelle Green 發音相似,所以它們的 SOUNDEX
值匹配,因此 WHERE
子句正確地過濾出了所需的資料。
二、日期和時間處理函式
日期和時間採用相應的資料型別儲存在表中,每種 DBMS 都有自己的特殊形式。日期和時間值以特殊的格式儲存,以便能快速和有效地排序或過濾,並且節省物理儲存空間。
應用程式一般不使用日期和時間的儲存格式,因此日期和時間函式總是用來讀取、統計和處理這些值。由於這個原因,日期和時間函式在 SQL 中具有重要的作用。遺憾的是,它們很不一致,可移植性最差。
我們舉個簡單的例子,來說明日期處理函式的用法。Orders
表中包含的訂單都帶有訂單日期。要檢索出某年的所有訂單,需要按訂單日期去找,但不需要完整日期,只要年份即可。
為在 SQL Server 中檢索 2020 年的所有訂單,可如下進行:
輸入▼
SELECT order_num
FROM Orders
WHERE DATEPART(yy, order_date) = 2020;
輸出▼
order_num
-----------
20005
20006
20007
20008
20009
分析▼
這個例子使用了 DATEPART()
函式,顧名思義,此函式返回日期的某一部分。DATEPART()
函式有兩個引數,它們分別是返回的成分和從中返回成分的日期。在此例子中,DATEPART()
只從 order_date
列中返回年份。通過與 2020 比較,WHERE
子句只過濾出此年份的訂單。
下面是使用名為 DATE_PART()
的類似函式的 PostgreSQL 版本:
輸入▼
SELECT order_num
FROM Orders
WHERE DATE_PART('year', order_date) = 2020;
Oracle 沒有 DATEPART()
函式,不過有幾個可用來完成相同檢索的日期處理函式。例如:
輸入▼
SELECT order_num
FROM Orders
WHERE EXTRACT(year FROM order_date) = 2020;
分析▼
在這個例子中,EXTRACT()
函式用來提取日期的成分,year
表示提取哪個部分,返回值再與 2020 進行比較。
提示:PostgreSQL 支援 Extract()
除了前面用到的 DatePart()
,PostgreSQL 也支援 Extract()
函式,因而也能這麼用。
完成相同工作的另一方法是使用 BETWEEN
操作符:
輸入▼
SELECT order_num
FROM Orders
WHERE order_date BETWEEN to_date('2020-01-01', 'yyyy-mm-dd')
AND to_date('2020-12-31', 'yyyy-mm-dd');
分析▼
在此例子中,Oracle 的 to_date()
函式用來將兩個字串轉換為日期。一個包含 2020 年 1 月 1 日,另一個包含 2020 年 12 月 31 日。BETWEEN
操作符用來找出兩個日期之間的所有訂單。值得注意的是,相同的程式碼在 SQL Server 中不起作用,因為它不支援 to_date()
函式。但是,如果用 DATEPART()
替換 to_date()
,當然可以使用這種型別的語句。
DB2,MySQL 和 MariaDB 具有各種日期處理函式,但沒有 DATEPART()
。DB2,MySQL 和 MariaDB 使用者可使用名為 YEAR()
的函式從日期中提取年份:
輸入▼
SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2020;
在 SQLite 中有個小技巧:
輸入▼
SELECT order_num
FROM Orders
WHERE strftime('%Y', order_date) = '2020';
這裡給出的例子提取和使用日期的成分(年)。按月份過濾,可以進行相同的處理,使用 AND 操作符可以進行年份和月份的比較。
DBMS 提供的功能遠不止簡單的日期成分提取。大多數 DBMS 具有比較日期、執行日期的運算、選擇日期格式等的函式。但是,可以看到,不同 DBMS 的日期-時間處理函式可能不同。關於你的 DBMS 具體支援的日期-時間處理函式,請參閱相應的文件。
三、數值處理函式
數值處理函式僅處理數值資料。這些函式一般主要用於代數、三角或幾何運算,因此不像字串或日期-時間處理函式使用那麼頻繁。
具有諷刺意味的是,在主要 DBMS 的函式中,數值函式是最一致、最統一的函式。表 3 列出一些常用的數值處理函式。
表 3 常用數值處理函式
函式 | 說明 |
---|---|
ABS() |
返回一個數的絕對值 |
COS() |
返回一個角度的餘弦 |
EXP() |
返回一個數的指數值 |
PI() |
返回圓周率π的值 |
SIN() |
返回一個角度的正弦 |
SQRT() |
返回一個數的平方根 |
TAN() |
返回一個角度的正切 |
關於具體 DBMS 所支援的算術處理函式,請參閱相應的文件。
請參閱
(完)