SQLite教程(四):內建函數,sqlite教程內建函數
一、彙總函式:
SQLite中支援的彙總函式在很多其他的關係型資料庫中也同樣支援,因此我們這裡將只是給出每個聚集合函式的簡要說明,而不在給出更多的樣本了。這裡還需要進一步說明的是,對於所有彙總函式而言,distinct關鍵字可以作為函數參數欄位的前置屬性,以便在進行計算時忽略到所有重複的欄位值,如count(distinct x)。
| 函數 |
說明 |
| avg(x) |
該函數返回在同一組內參數欄位的平均值。對於不能轉換為數字值的String和BLOB類型的欄位值,如'HELLO',SQLite會將其視為0。avg函數的結果總是浮點型,唯一的例外是所有的欄位值均為NULL,那樣該函數的結果也為NULL。 |
| count(x|*) |
count(x)函數返回在同一組內,x欄位中值不等於NULL的行數。count(*)函數返回在同一組內的資料行數。 |
| group_concat(x[,y]) |
該函數返回一個字串,該字串將會串連所有非NULL的x值。該函數的y參數將作為每個x值之間的分隔字元,如果在調用時忽略該參數,在串連時將使用預設分隔字元","。再有就是各個字串之間的串連順序是不確定的。 |
| max(x) |
該函數返回同一組內的x欄位的最大值,如果該欄位的所有值均為NULL,該函數也返回NULL。 |
| min(x) |
該函數返回同一組內的x欄位的最小值,如果該欄位的所有值均為NULL,該函數也返回NULL。 |
| sum(x) |
該 函數返回同一組內的x欄位值的總和,如果欄位值均為NULL,該函數也返回NULL。如果所有的x欄位值均為整型或者NULL,該函數返回整型值,否則就 返回浮點型數值。最後需要指出的是,如果所有的資料值均為整型,一旦結果超過上限時將會拋出"integer overflow"的異常。 |
| total(x) |
該函數不屬於標準SQL,其功能和sum基本相同,只是計算結果比sum更為合理。比如當所有欄位值均為NULL時,和sum不同的是,該函數返回0.0。再有就是該函數始終返回浮點型數值。該函數始終都不會拋出異常。 |
二、核心函數:
以下函數均為SQLite預設提供的內建函數,其聲明和描述見如下列表:
| 函數 |
說明 |
| abs(X) |
該函數返回數值參數X的絕對值,如果X為NULL,則返回NULL,如果X為不能轉換成數值的字串,則返回0,如果X值超出Integer的上限,則拋出"Integer Overflow"的異常。 |
| changes() |
該函數返回最近執行的INSERT、UPDATE和DELETE語句所影響的資料行數。我們也可以通過執行C/C++函數sqlite3_changes()得到相同的結果。 |
| coalesce(X,Y,...) |
返回函數參數中第一個非NULL的參數,如果參數都是NULL,則返回NULL。該函數至少2個參數。 |
| ifnull(X,Y) |
該函數等同於兩個參數的coalesce()函數,即返回第一個不為NULL的函數參數,如果兩個均為NULL,則返回NULL。 |
| length(X) |
如果參數X為字串,則返回字元的數量,如果為數值,則返回該參數的字串表示形式的長度,如果為NULL,則返回NULL。 |
| lower(X) |
返回函數參數X的小寫形式,預設情況下,該函數只能應用於ASCII字元。 |
| ltrim(X[,Y]) |
如果沒有選擇性參數Y,該函數將移除參數X左側的所有空格符。如果有參數Y,則移除X左側的任意在Y中出現的字元。最後返回移除後的字串。 |
| max(X,Y,...) |
返回函數參數中的最大值,如果有任何一個參數為NULL,則返回NULL。 |
| min(X,Y,...) |
返回函數參數中的最小值,如果有任何一個參數為NULL,則返回NULL。 |
| nullif(X,Y) |
如果函數參數相同,返回NULL,否則返回第一個參數。 |
| random() |
返回整型的偽隨機數。 |
| replace(X,Y,Z) |
將字串類型的函數參數X中所有子字串Y替換為字串Z,最後返回替換後的字串,源字串X保持不變。 |
| round(X[,Y]) |
返回數值參數X被四捨五入到Y刻度的值,如果參數Y不存在,預設參數值為0。 |
| rtrim(X[,Y]) |
如果沒有選擇性參數Y,該函數將移除參數X右側的所有空格符。如果有參數Y,則移除X右側的任意在Y中出現的字元。最後返回移除後的字串。 |
| substr(X,Y[,Z]) |
返回函數參數X的子字串,從第Y位開始(X中的第一個字元位置為1)截取Z長度的字元,如果忽略Z參數,則取第Y個字元後面的所有字元。如果Z的值為負數,則從第Y位開始,向左截取abs(Z)個字元。如果Y值為負數,則從X字串的尾部開始計數到第abs(Y)的位置開始。 |
| total_changes() |
該函數返回自從該串連被開啟時起,INSERT、UPDATE和DELETE語句總共影響的行數。我們也可以通過C/C++介面函數sqlite3_total_changes()得到相同的結果。 |
| trim(x[,y]) |
如果沒有選擇性參數Y,該函數將移除參數X兩側的所有空格符。如果有參數Y,則移除X兩側的任意在Y中出現的字元。最後返回移除後的字串。 |
| upper(X) |
返回函數參數X的大寫形式,預設情況下,該函數只能應用於ASCII字元。 |
| typeof(X) |
返回函數參數資料類型的字串表示形式,如"Integer、text、real、null"等。 |
三、日期和時間函數:
SQLite主要支援以下四種與日期和時間相關的函數,如:
1). date(timestring, modifier, modifier, ...)
2). time(timestring, modifier, modifier, ...)
3). datetime(timestring, modifier, modifier, ...)
4). strftime(format, timestring, modifier, modifier, ...)
以上所有四個函數都接受一個時間字串作為參數,其後再跟有0個或多個修改符。其中strftime()函數還接受一個格式字串作為其第一個參數。strftime()和C執行階段程式庫中的同名函數完全相同。至於其他三個函數,date函數的預設格式為:"YYYY-MM-DD",time函數的預設格式為:"HH:MM:SS",datetime函數的預設格式為:"YYYY-MM-DD HH:MM:SS"。
1. strftime函數的格式資訊:
| 格式 |
說明 |
| %d |
day of month: 00 |
| %f |
fractional seconds: SS.SSS |
| %H |
hour: 00-24 |
| %j |
day of year: 001-366 |
| %J |
Julian day number |
| %m |
month: 01-12 |
| %M |
minute: 00-59 |
| %s |
seconds since 1970-01-01 |
| %S |
seconds: 00-59 |
| %w |
day of week 0-6 with Sunday==0 |
| %W |
week of year: 00-53 |
| %Y |
year: 0000-9999 |
| %% |
% |
需要額外指出的是,其餘三個時間函數均可用strftime來表示,如:
複製代碼 代碼如下:
date(...) strftime('%Y-%m-%d', ...)
time(...) strftime('%H:%M:%S', ...)
datetime(...) strftime('%Y-%m-%d %H:%M:%S', ...)
2. 時間字串的格式:
見如下列表:
1). YYYY-MM-DD
2). YYYY-MM-DD HH:MM
3). YYYY-MM-DD HH:MM:SS
4). YYYY-MM-DD HH:MM:SS.SSS
5). HH:MM
6). HH:MM:SS
7). HH:MM:SS.SSS
8). now
5)到7)中只是包含了時間部分,SQLite將假設日期為2000-01-01。8)表示目前時間。
3. 修改符:
見如下列表:
1). NNN days
2). NNN hours
3). NNN minutes
4). NNN.NNNN seconds
5). NNN months
6). NNN years
7). start of month
8). start of year
9). start of day
10).weekday N
1)到6)將只是簡單的加減指定數量的日期或時間值,如果NNN的值為負數,則減,否則加。7)到9)則將時間串中的指定日期部分設定到當前月、年或日的開始。10)則將日期前進到下一個星期N,其中星期日為0。註:修改符的順序極為重要,SQLite將會按照從左至右的順序依次執行修改符。
4. 樣本:
複製代碼 代碼如下:
--返回當前日期。
sqlite> SELECT date('now');
2012-01-15
--返回當前月的最後一天。
sqlite> SELECT date('now','start of month','1 month','-1 day');
2012-01-31
--返回從1970-01-01 00:00:00到目前時間所流經的秒數。
sqlite> SELECT strftime('%s','now');
1326641166
--返回當前年中10月份的第一個星期二是日期。
sqlite> SELECT date('now','start of year','+9 months','weekday 2');
2012-10-02