目錄匯總:SSQL 零基礎入門教程
大多數 SQL 實現支持以下類型的函數。
- 用於處理文本字符串(如刪除或填充值,轉換值為大寫或小寫)的文本函數。
- 用於在數值數據上進行算術操作(如返回絕對值,進行代數運算)的數值函數。
- 用於處理日期和時間值並從這些值中提取特定成分(如返回兩個日期之差,檢查日期有效性)的日期和時間函數。
- 用於生成美觀好懂的輸出內容的格式化函數(如用語言形式表達出日期,用貨幣符號和千分位表示金額)。
- 返回 DBMS 正使用的特殊信息(如返回用戶登錄信息)的系統函數。
我們在 拼接字段 中看到函數用於 SELECT 后面的列名,但函數的作用不僅於此。它還可以作為 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 所支持的算術處理函數,請參閱相應的文檔。
請參閱
(完)