昨天已經將大部分常用的 SQL 指令做一個簡單的說明,接下來我們接著聊一聊由資料庫系統所提供的系統函數。這些系統函數在我們寫 Store Procedure 時,提供很多強大的功能,方便我們整合到我們的 SQL 程式中使用。不同的資料庫都會有自己的一套系統函數,我之前有整理過常用系統函數的比較一覽表,請參考下面的列表說明。
| 函式名 | MS-SQL | MySQL | PostgreSQL |
|---|---|---|---|
| 聚合函數 | |||
| 取某欄位的平均值 | avg() | avg(col) | avg(expression) |
| 計算筆數 | count() | count(col) | count(xx) |
| 某個欄位值最大值 | max() | max(col) | max(expression) |
| 某個欄位值的最小值 | min() | min(col) | min(expression) |
| 某個欄位取值的總和 | sum() | sum(col) | sum(expression) |
| 字串類 | |||
| 取ascii碼 | ascii(char) | ascii(char) | ascii(string) |
| 根據ascii碼取字元 | char(ascii) | chr() | chr(int) |
| 轉化為指定的資料類型 | cast() | cast() | to_char() |
| 將s1,s2...,sn連接成字串 | + | concat(s1,s2...,sn) | concat(x,y,x) |
| 返回字串的位元長度 | datalength(Char_expr) | data_length(str) | char_length(string) |
| 返回字串長度 | len() | length(s) | length(string) |
| 取子字串 | substring(exp,start,len) | substring() | substring() |
| 返回字串右邊 x 個字元 | right(str,x) | right(str,x) | right(str text, n int) |
| 返回字串左邊 x 個字元 | left(str,x) | left(str,x) | left(str text, n int) |
| 轉爲大寫 | upper(str) | upper(str) | upper(string) |
| 轉爲小寫 | lower(str) | lower(str) | lower(string) |
| 生成n個空格 | space(n) | ||
| 複制字串n 次 | replicate(str,n) | repeat(str,src,rplcstr) | repeat() |
| 反轉字串 | reverse(str) | reverse(str) | reverse(str) |
| 字串代替 | replace() | replace() | replace() |
| 指定位置插入指定字串 | stuff(str,x,y,instr) | insert(str,x,y,instr) | |
| 取掉左方空格 | ltrim(char_expr) | ltrim(str) | ltrim(str) |
| 取掉右方空格 | rtrim(char_expr) | rtrim(str) | rtrim(str) |
| 返回str在sub的起始位置 | charindex(substr,str) | position(substr,str) | strpos(str, substr) |
| 條件式判斷 | iif(bool,val_t,val_f) | iif(bool,val_t,val_f) | |
| 若 null取第2個引數 | isnull(bool,val_null) | ifnull() | |
| 反斜線轉義str中的單引號 | quote(str) | ||
| 去除字串前後的所有空格 | trim(str) | trim(str) | |
| 日期格式化 | convert() | date_format(date,fmt) | to_date(text, text) |
| 比較字串s1和s2 | strcmp(s1,s2) | ||
| 固定字串長度(左或右) | lpad or rpad | lpad or rpad | |
| 數學類 | |||
| 求num絕對值 | abs(num) | abs(x) | abs(x) |
| 取指數 | exp(float_expr) | exp(x) | exp(x) |
| 返回x/y的模(餘數) | mod() | mod(x,y) | mod(y, x) |
| 隨機數産生器 | rand([int_expr]) | rand() | random() |
| 四捨五入 | round(x,y) | round(x,y) | round(x,y) |
| 平方根 | sqrt(float_expr) | sqrt(x) | sqrt(x) |
| 返回數字x截短為y位小數 | truncate(x,y) | trunc(x,y) | |
| 日期類 | |||
| 返回當前日期及時間 | now() | Now() | now() |
| 返回日期 | getdate() | current_date() | current_date |
| 返回當前的時間 | current_time() | current_time | |
| 返回日期加上 number | dateadd(type,int,d_exp) | date_add()/date_sub() | date_part(text, times) |
| 日期差 | datediff(type,d1,d2) | datediff(date1,date2) | |
| 傳回日期欄的西元年 | year(date) | year(date) | |
| 傳回日期欄的月 | month(date) | dayofmonth(date) | |
| 傳回日期欄的日 | day(date) | dayname(date) | |
| 傳回日期欄是星期幾 | dayofweek(date) | ||
| 返回日期為一年中第幾 | week(date) | ||
| 系統函數 | |||
| 數據庫名 | db_name() | database() | current_database() |
| 伺服器的版本 | version() | version() |
善用上面這些系統的函數,可以大幅提升我們撰寫SQL的效率。那如果找不到所需的函數時該怎麼辦? 當然就只能自己寫了,限於篇幅我就不在此繼續說明。在接下來的進階說明,如果有機會,我們再來深入聊聊。
也就是因為資料庫允許自行開發所需的函數,讓SQL 更接近一種程式語言,如果想要深入的運用資料庫,就應該要下功夫努力學習,今天就聊到這邊,我們明天繼續努力。