expression
expr ::= expr binary-op expr |
expr [NOT] like-op expr
[ESCAPE expr] |
unary-op expr |
( expr ) |
column-name |
table-name
. column-name |
database-name . table-name . column-name |
literal-value
|
parameter |
function-name ( expr-list | * ) |
expr ISNULL |
expr
NOTNULL |
expr [NOT] BETWEEN expr AND expr |
expr [NOT] IN ( value-list )
|
expr [NOT] IN ( select-statement ) |
expr [NOT] IN [database-name .]
table-name |
[EXISTS] ( select-statement ) |
CASE [expr] ( WHEN expr THEN
expr )+ [ELSE expr] END |
CAST ( expr AS type ) |
expr COLLATE
collation-name
like-op ::= LIKE | GLOB | REGEXP |
MATCH
這部分有別於其它部分。本文檔的其它大多數部分都在講特定的 SQL
命令。本部分所講的不是一個單一的命令,而是“表達式”,它經常用作其它命令的一部分來使用。
SQLite
有如下二元運算符,根據其優先級從高到低有:
||
* / %
+ -
<< >> & |
< <= > >=
= == != <> IN
AND
OR
以下是支持的一元運算符:
- + ! ~ NOT
COLLATE
運算符可以被看作是一個后置的一元運算符它具有最高的優先級。通常,與其前面的一元、及二元運算符相比,它與參數結合更為緊密。
一元 [Operator
+] 什么也不做。它可以被應用於字符串,數字,或BLOB,並永遠返回跟它作用的數值相同的結果。
注意,兩種變體的等號運算符是不一樣的。等可以是 =
或 ==。不等操作符有 != 或 <>。 || 運算符為“連接符”,它將兩個字符串連接到一起。 %
輸出其左邊的數除以右面數后的余數。
除 || 之外,任何二元操作符的結果都是一個數值型的值。 ||
返回兩個操作數連接后的大字符串。
字面值是一個整數或浮點數的值。也支持科學記數法。小數點永遠使用“.” 字符來表示,即使本地設置指定用“,”
來表示也不例外。在這種規則下,使用“,” 作小數點會引起語義上的二義性。字符串值應該用單引號(') 引起來。像在 Pascl
語言中那樣,字符串中的單引號應該使用兩個單引號表示。由於像 C 語言那樣使用反斜線進行轉義的方式不是 SQL 語言的標准,所以不支持那種類型的轉義。
BLOB字面值是以一個“x” 或“X” 打頭的包含十六進制數據的字符串值。例如:
X'53514C697465'
字面值也可以是 "NULL" 記號。
參數用於指定一個字面值在表達式中的存放位置。它將在運行時被使用
sqlite3_bind API 替換。參數有如下幾種格式:
?NNN 問號后跟一個數字 NNN 用於存放第 NNN
個參數。 NNN 必須在 1 到 999 之間。
? 只有一個問號,它將用於存放緊跟其后的一個未用到的參數。
:AAAA 冒號后面跟一個標志符,用於存放名字為 AAAA
的變量。命名的變量也會被編號,編號將使用第一個未被使用的編號。為避免混淆,最好不要混用名字和編號作為參數。
@AAAA 一個 @
符號等價於一個冒號。
$AAAA 美元符號后跟一個標志符也會存放名字為 AAAA
的參數。在這種情況下,參數名字中可以出現很多“::”,並且,在“(...)”后綴中可以包含任何文本。該語法是由 TCL
語言中相同的法而來的。
未使用 sqlite3_bind 來賦值的參數則認為是 NULL。
LIKE
操作符會作一個模式匹配比較。它右邊是一個匹配模式,左邊包含被匹配的字符串。 在匹配模式中,百分號 % 會匹配字符串中任意 0 個或多個字符。一個下划線 _
符號僅匹配一個任意的字符。除此之外,其它的任何字符均只匹配它們自己(在不區分大小寫的環境下可能會匹配與之對應的大、小寫字母)。(一個BUG:SQLite中不區分大小寫僅對
7 比特的拉丁字符有效,對於 8 位的 iso8859 字符集UTF8字符則是區分大小寫的)。例如:表達式 'a' LIKE 'A' 是 TRUE 但 'æ'
LIKE 'Æ' 則是 FALSE)。
若有可選的 ESCAPE 子句,那么 ESCAPE
關鍵字后的表達式必須是一個單個的字符(叫做轉義字符)。該字符可以用於 LIKE
模式字符串中來體現百分號或下划線。轉義字符后面的百分號或下划線均分別保持它們原來的意思。中綴的 LIKE 操作符是使用 like(X,Y)
函數實現的。
LIKE 操作符不區分大小寫,它將匹配一邊是小寫而另一邊是大寫的字符串。(一個BUG:SQLite中不區分大小寫僅對 7
比特的拉丁字符有效,對於 8 位的 iso8859 字符集UTF8字符則是區分大小寫的)。例如:表達式 'a' LIKE 'A' 是 TRUE 但 'æ'
LIKE 'Æ' 則是 FALSE)。
中綴操作符 LIKE 是通過調用用戶函數 like(X,Y) 實現的。但若后面還有 ESCAPE
子句,它會在以上函數中增加第三個參數。如果該函數被其它的 like() SQL 函數重載,則需要注意。
GLOB 操作符與 LIKE
類似,但它使用 Unix 通配符的的文件匹配語法。並且,與 LIKE 不同, GLOB 是大小寫敏感的。GLOB 和 LIKE 都可以用 NOT
關鍵字對匹配結果取反。 中綴的 GLOB 操作符是通過調用用戶函數 glob(X,Y) 實現的,可以通過該函數對其進行重載。
REGEXP
操作符是使用 regexp() 用戶函數的一個特殊語法。默認情況下, regexp() 用戶函數沒有定義,所以使用 REGEXP
將會出錯。如果在運行時增加一個名為 regexp 的用戶定義函數,則使用該操作符時將使用此函數來實現 REGEXP 功能。
MATCH
操作符是使用 match() 用戶函數的一個特殊語法。默認的 match()
函數實現只會引發一個異常,從而沒多大用處。但可以通過擴展該函數來實現更有用的邏輯。
列名colum name 可以是任何在 CREATE
TABLE 語句中指定的列名,也可以是如下一個特殊標志符: "ROWID"、"OID" 或
"_ROWID_"。這些特殊標志符均描述與每個表每一行所關連的唯一的整數鍵。特殊標志符只會在 CREATE TABLE
語句沒有指定相同的列名時才會真正指代每一行。行鍵值就像只讀的列。一個行鍵值可以用在任何一個正常列所能使用的地方。只是,不能使用 UPDATE 或 INSERT
來改變行的鍵值。 “SELECT * ...”也不會返回行鍵值。
SELECT 語句可以出現在 IN
操作符的后面,或作為一個單獨的數量值出現,或者跟在 EXISTS 操作符后面。當作為一個單獨數量值或在 IN 操作符中時,SELECT 必須只能返回單列。復合
SELECT 查詢 (使用 UNION 或 EXCEPT 關鍵字的查詢)也是允許的。當使用 EXISTS 關鍵字時,SELECT 結果中的列被忽略。如果
SELECT 返回了一行或多行,則表達式就為 TRUE,否同就為 FALSE。如果內層 SELECT 表達式中的項目與外層的值無關,則內層 SELECT
會最先求值,並在以后需要時重用該值。如果內層 SELECT 中含有外層查詢相關的變量,那么內層 SELECT
會在每次需要的時候被重新求值。
當一個 SELECT 作為 IN 操作符的右操作數時,如果 IN 左邊的操作數存在於右邊 SELECT
的查詢結果中, IN 就返回 TRUE。 IN 操作符也可以搭配 NOT 來對表達式結果取反。
當一個 SELECT 出現在除 IN
之外的其它表達式中時, SELECT 結果的第一行將作為一個單一的值用於該表達式中。如果 該SELECT 返回多行,那么其它的行將會被忽略。若 SELECT
返回 0 行,則其結果將是 NULL。
一個 CAST 表達式會將 的數據類型轉換為指定的類型
<type>。其中<type> 可以是任何在 CREATE TABLE
語句中有效的非空的類型名。
系統支持簡單和聚集函數。一個簡單函數可以用於任何表達式。簡單函數會在其輸入的基礎上立即返回結果。聚集函數只能用於
SELECT 語句中。 聚集函數會在返回的結果集上進行跨行計算,並返回相應的結果。
核心函數 Core
Functions
下列是默認可以的核心函數。額外的函數可以使用 C 語言編寫並使用 sqlite3_create_function() API
加入數據庫引擎中。
abs(X) 返回參數 X的絕對值。
coalesce(X,Y,...) 返回參數中第一個非 NULL
的值。若所有參數均為 NULL,則返回 NULL。該函數至少需要兩個參數。
glob(X,Y) 該函數用戶實現 SQLite 的 "X GLOB
Y" 語法。可以使用 sqlite3_create_function() 接口來重載該函數,從而改變 GLOB 操作符的行為方式。
ifnull(X,Y)
返回第一個非 NULL 的參數值,如果所有參數都是 NULL, 則返回 NULL。與上面的 coalesce() 一樣。
hex(X)
參數以 BLOB 對待。結果是 BLOB 內容的 16 進制表示。
last_insert_rowid() 返回當前數據庫連接中最后插入的一行的
ROWID。該值與使用 sqlite_last_insert_rowid() API 函數返回的值相同。
length(X) 返回 X
字符串的長度。如果 SQLite 配置為支持 UTF-8,則返回的是 UTF-8
字符的長度,而不是字節數。
like(X,Y)
like(X,Y,Z) 該函數用於實現 SQL 的 "X LIKE Y [ESCAPE
Z]" 語法。如果有可選的 ESCAPE 語句,將使用具有三個參數的函數,否則,將使用只有兩個參數的數據。可以使用
sqlite_create_function() 接口來重載該函數,以改變 LIKE
操作符的行為。如果那樣做,一定要注意同時重載兩個(兩個參數的和三個參數的)版本的函數。否則,依據是否使用了 ESCAPE
子句,可以會調用不同的代碼。
load_extension(X)
load_extension(X,Y) 裝入 SQLite
共享庫之外文件名為 X 而入口點為 Y 的擴展庫。結果將是 NULL。 如果省略了 Y,那么,將使用默認的入口點
sqlite3_extension_init。該函數在裝入或初始化失敗時會引發一個異常。
如果擴展試圖修改或刪除一個 SQL
函數或對照序列,則該函數會失敗。可以使用擴展增加新函數或對照序列,但不能修改或刪除已存在的。這是因為那些函數和/或對照序列可能正在被其它的SQL語句使用。要想裝入可以修改或刪除函數或對照序列的擴展,使用
sqlite3_load_extension() C 語言API。
lower(X) 返回將字符串 X 轉換為小寫后的字符串。該函數使用 C
語言庫函數 tolower() 進行轉換,所以,可能不能正確轉換 UTF-8 字符。
ltrim(X)
ltrim(X,Y)
返回一個字符串,它是從字符串 X 的左邊刪除了任何存在於字符串 Y 中的字符后剩余的字符串。如果省略參數 Y
,則會刪除左邊的空格。
max(X,Y,...) 返回參數的最大值。除數字外,參數可能是字符串。它使用通常的排序順序來決定最大值。注意若
max() 有兩個或多個參數,則它是一個簡單函數。但如果只提供一個參數,它將變成一個聚集函數。
min(X,Y,...)
返回參數的最小值。除數字外,參數可能是字符串。它使用通常的排序順序來決定最小值。注意若 min()
有兩個或多個參數,則它是一個簡單函數。但如果只提供一個參數,它將變成一個聚集函數。
nullif(X,Y)
如果參數不同,則返回第一個參數,否則返回NULL。
quote(X) 該函數返回一個對其參數值進行處理后適合包含在其它 SQL
語句中的字符串。單引號包括的字符串將會按需要轉換成內部引用的格式。 BLOB 將會編碼為十六進制字面值。當前實現的 VACUUM 使用該函數。在寫觸發器來實現
“撤消/重做” 功能時,該函數也是很有用的。
random(*) 返回一個偽隨機數。結果在 -9223372036854775808 與
+9223372036854775807之間。
replace(X,Y,Z) 返回一個將 X 字符串中每一個出現 Y 的位置替換為 Z
后的字符串。它使用二進制對照序列進行比較。
randomblob(N) 返回一個 N 字節長的包含偽隨機字節的 BLOG。 N
應該是正整數。
round(X)
round(X,Y) 對 X 圓整成小數點后 Y 位。或省略 Y ,則默認Y 為
0。
rtrim(X)
rtrim(X,Y) 返回從 X 的右邊去除所有出現在 Y 中字符以后的字符串。如果省略
Y,則去除空格。
soundex(X) 計算字符串 X的讀音編碼。如果參數為 NULL,則返回 "?000"。默認情況下 SQLite
忽略該函數。僅當在編譯時指定 -DSQLITE_SOUNDEX=1 時才有效。
sqlite_version(*) 返回當前運行的 SQLite
庫的版本號。如:"2.8.0"
substr(X,Y,Z)
substr(X,Y) 返回字符串 X 從第 Y 個字符開始,長度為 Z
的字符串。如果省略 Z, 將返回直到字符串結尾的字符串。 X 的第一個字符從 1 開始。如果 Y 是負數,則從右邊開始數。如果 X 是 UTF-8
字符串,那么,下標值將指實際的 UTF-8 characters 字符,而不是字節。如果 X 是一個
BLOB,那么下標就是指字節。
trim(X)
trim(X,Y) 返回從字符串 X 的兩頭去掉所有存在於 Y 中字符后的字符串。如果省略
Y,則去空格。
typeof(X) 返回表達式 X 的類型。只可能是 "null", "integer", "real", "text", 以及
"blob"。 SQLite 的類型處理在 Datatypes in SQLite Version 3 中有說明。
upper(X) 返回字符串
X 被轉換為大寫后的字符串。它使用 C 庫函數 toupper() 實現,對於 UTF-8,某些字符串可能不能正確轉換。
zeroblob(N)
返回一個 N 字節長、全部由 0x00 組成的 BLOB。 SQLite 或以很有效的組織這些 zeroblob。它可以被用於為以后的使用預留空間。以后可以使用
incremental BLOB I/O 來寫入 BLOB 數據。
日期和時間函數
日期和時間函數在 SQLite
Wiki上。
聚集函數
有下列默認可和的聚集函數:可以使用 sqlite3_create_function() API
來增加其它的聚集函數。
任何聚集函數都只有一個參數。其參數前可以有一個 DISTINCT。如果有,重復的元素將會在傳遞給聚集函數前過濾掉。如,函數
"count(distinct X)" 將只返回在 X 列上不重復的行的總數,而不是在該列上所有非空的行的總數
avg(X) 返回 X
列的一組中所有非空值的平均值。字符串或 BLOB 等非數字值將被認為是 0。即使所有輸入都是整數, avg()
的結果也永遠是浮點數。
count(X)
count(*) 第一種形式返回在
X列上的一組中非空的行的總數。第二種(無任何參數)返回一組中所有的行數。
group_concat(X)
group_concat(X,Y)
結果是一個所有非空的 X 連接起來的一個字符串。如果有參數 Y,則它會做為連接 X 時的分隔符。若省略Y ,則默認是逗號(,)。
max(X)
返回一組中的最大值。使用通常的排序順序來確定最大值。
min(X)
返回一組中除非空值以外的最小值。使用通常的排序順序來確實最小值。只有當整個組中所有值均為 NULL 時才會返回
NULL。
sum(X)
total(X) 返回一組中所有非空值的數值總和。如果在輸入中沒有非空值,則 sum() 會返回 NULL 而
total() 會返回 0.0。不僅能在 sum() 沒有對任何行求和時, NULL能給出有幫助的結果,而且 SQL 標准也需要它。而且其它的 SQL
數據庫引擎也是這么實現的。 SQLite 這么做也是為了保持兼容性。我們也提供了一個非標准的 total() 函數,以提供一個方便的途徑來繞過 SQL
語言的這一設計問題。
total() 的結果永遠是浮點數。 如果所有非空的輸入都是整數, sum() 的結果將是整數值。 若任何輸入給 sum()
的值是除整數及 NULL 以外的值, sum() 都將返回浮點數。這可能是最接近標准 sum() 的實現方式吧。
如果輸入全部是整數或
NULL,在結果溢出時 sum() 將會產生一個 "integer overflow" 異常。 而 total() 永遠不會。
限制筆數
select * from film limit 10;
sqlite3 film.db "select * from
film;"
輸出 HTML 表格:
sqlite3 -html film.db "select * from
film;"
將數據庫「倒出來」:
sqlite3 film.db ".dump" >
output.sql
利用輸出的資料,建立一個一模一樣的數據庫(加上以上指令,就是標准的SQL數據庫備份了):
sqlite3
film.db <
output.sql
在大量插入資料時,你可能會需要先打這個指令:
begin;
插入完資料后要記得打這個指令,資料才會寫進數據庫中:
commit;
SQLite內建函數表
算術函數
abs(X)
返回給定數字表達式的絕對值。
max(X,Y[,...]) 返回表達式的最大值。
min(X,Y[,...])
返回表達式的最小值。
random(*) 返回隨機數。
round(X[,Y])
返回數字表達式並四舍五入為指定的長度或精度。
字符處理函數
length(X) 返回給定字符串表達式的字符個數。
lower(X)
將大寫字符數據轉換為小寫字符數據后返回字符表達式。
upper(X)
返回將小寫字符數據轉換為大寫的字符表達式。
substr(X,Y,Z) 返回表達式的一部分。
randstr()
quote(A)
like(A,B) 確定給定的字符串是否與指定的模式匹配。
glob(A,B)
條件判斷函數
coalesce(X,Y[,...])
ifnull(X,Y)
nullif(X,Y)
集合函數
avg(X) 返回組中值的平均值。
count(X) 返回組中項目的數量。
max(X)
返回組中值的最大值。
min(X) 返回組中值的最小值。
sum(X)
返回表達式中所有值的和。
其他函數
typeof(X) 返回數據的類型。
last_insert_rowid()
返回最后插入的數據的ID。
sqlite_version(*) 返回SQLite的版本。
change_count()
返回受上一語句影響的行數。
last_statement_change_count()