From:http://blog.chinaunix.net/uid-24439730-id-1745159.html
SELECT
sql-statement ::= | SELECT [ALL | DISTINCT] result [FROM table-list] [WHERE expr] [GROUP BY expr-list] [HAVING expr] [compound-op select]* [ORDER BY sort-expr-list] [LIMIT integer [( OFFSET | , ) integer]] |
result ::= | result-column [, result-column]* |
result-column ::= | * | table-name . * | expr [ [AS] string ] |
table-list ::= | table [join-op table join-args]* |
table ::= | table-name [AS alias] | ( select ) [AS alias] |
join-op ::= | , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN |
join-args ::= | [ON expr] [USING ( id-list )] |
sort-expr-list ::= | expr [sort-order] [, expr [sort-order]]* |
sort-order ::= | [ COLLATE collation-name ] [ ASC | DESC ] |
compound_op ::= | UNION | UNION ALL | INTERSECT | EXCEPT |
SELECT語句用于查詢數據庫。一條SELECT命令的返回結果是零或多行每行有固定字段數的數據。字段的數目由在SELECT和FROM之間的表達式列表定義。任意的表達式都可以被用作結果。若表達式是 *則表示所有表的所有字段。若表達式是表的名字后接.*則結果為該表中的所有字段。
DISTINCT關鍵字的使用會使返回的結果是原結果的一個不含相同行的子集。NULL值被認為是相同的。缺省行為是返回所有的行,為清楚起見可以使用關鍵字ALL。
查詢對FROM之后定義的一個或多個表進行。若多個表用逗號連接,則查詢針對它們的交叉連接。所有的SQL-92連接語法均可以用于定義連接。圓括號中的副查詢可能被FROM子句中的任意表名替代。當結果中僅有一行包含表達式列表中的結果的行時,整個的FROM子句會被忽略。
WHERE子句可以限定查詢操作的行數目。
GROUP BY子句將一行或多行結果合成單行輸出。當結果有聚集函數時這將尤其有用。GROUP BY子句的表達式不須是出現在結果中的表達式。HAVING子句與WHERE相似,只是HAVING用于過濾分組創建的行。HAVING子句可能包含值,甚至是不出現在結果中的聚集函數。
ORDER BY子句對所得結果根據表達式排序。表達式無須是簡單SELECT的結果,但在復合SELECT中每個表達式必須精確對應一個結果字段。每個表達式可能跟隨一個可選的COLLATE關鍵字以及用于排序文本的比較函數名稱和/或關鍵字ASC或DESC,用于說明排序規則。
LIMIT子句限定行數的最大值。負的LIMIT表示無上限。后跟可選的OFFSET說明跳過結果集中的前多少行。在一個復合查詢中,LIMIT子句只允許出現在最終SELECT語句中。限定對于所有的查詢均適用,而不僅僅是添加了LIMIT子句的那一行。注意OFFSET關鍵字用于LIMIT子句中,則限制值是第一個數字,而偏移量(offset)是第二個數字。若用逗號替代OFFSET關鍵字,則偏移量是第一個數字而限制值是第二個數字。這是為了加強對遺留的SQL數據庫的兼容而有意造成的矛盾。
復合的SELECT由兩個或更多簡單SELECT經由UNION, UNION ALL, INTERSECT, EXCEPT中的一個運算符連接而成。在一個復合SELECT中,各個SELECT需指定相同個數的結果字段。僅允許一個ORDER BY子句出現在SELECT的末尾。UNION和UNION ALL運算符從左至右將所有SELECT的結果合成一個大的表。二者的區別在于UNION的所有結果行是不相同的而 UNION ALL允許重復行。INTERSECT運算符取左右兩個SELECT結果的交。EXCEPT從左邊SELECT的結果中除掉右邊SELECT的結果。三個或更多SELECT復合時,它們從左至右結合。
UPDATEsql-statement ::= | UPDATE [ OR conflict-algorithm ] [database-name .] table-name SET assignment [, assignment]* [WHERE expr] |
assignment ::= | column-name = expr |
UPDATE語句用于改變表中所選行的字段值。每個UPDATE的賦值的等號左邊為字段名而右邊為任意表達式。表達式可以使用其它字段的值。所有的表達式將在賦值之前求出結果??梢允褂肳HERE子句限定需要改變的行。
在使用這一命令時,利用可選的ON CONFLICT子句可以定義替代的約束沖突判定算法。更多信息,參見 ON CONFLICT。
REPLACEsql-statement ::= | REPLACE INTO [database-name .] table-name [( column-list )] VALUES ( value-list ) | REPLACE INTO [database-name .] table-name [( column-list )] select-statement |
REPLACE命令用于替代INSERT的"INSERT OR REPLACE"變體,以更好的兼容MySQL。查看 INSERT命令文檔獲取更多信息。
INSERTsql-statement::= | INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] VALUES(value-list) | INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement |
INSERT語句有兩種基本形式。一種帶有"VALUES"關鍵字,在已有表中插入一個新的行。若不定義字段列表,那么值的數目將與表中的字段數目相同。否則值的數目須與字段列表中的字段數目相同。不在字段列表中的字段被賦予缺省值或NULL(當未定義缺省值)。
INSERT的第二種形式從SELECT語句中獲取數據。若未定義字段列表,則從SELECT得到的字段的數目必須與表中的字段數目相同,否則應與定義的字段列表中的字段數目相同。SELECT的每一行結果在表中插入一個新的條目。SELECT可以是簡單的或者復合的。如果SELECT語句帶有ORDER BY子句,ORDER BY會被忽略。
在使用這一命令時,利用可選的ON CONFLICT子句可以定義替代的約束沖突判定算法。更多信息,參見 ON CONFLICT 。為了兼容MySQL,可以使用REPLACE代替"INSERT OR REPLACE".
DELETEsql-statement ::= | DELETE FROM [database-name .] table-name [WHERE expr] |
DELETE命令用于從表中刪除記錄。命令包含"DELETE FROM"關鍵字以及需要刪除的記錄所在的表名。
若不使用WHERE子句,表中的所有行將全部被刪除。否則僅刪除符合條件的行。
表達式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 ) |
like-op ::= | LIKE | GLOB | REGEXP |
這一節與其它的各節有所不同。我們討論的不是一個單一的SQL命令,而是作為其他大部分命令的一部分的表達式。
SQLite支持如下的二元運算符,按優先級由高至低排列:
|| * / % + - << >> & | < <= > >= = == != <> IN AND OR
所支持的一元運算符:
- + ! ~
注意等號和“不等”號的兩個變種。等號可以是 =或==. “不等”號可以是!=或<>. ||為“連接符”——它將兩個字符串連接起來。 %輸出左邊部分以右邊部分為模取模得到的余數。
二元運算符的結果均為數字,除了||連接符,它給出字符串結果。
文本值(literal value)是一個整數或浮點數??梢允褂每茖W計數法。"."符號總是被當作小數點即使本地設定中用","來表示小數點 ——用","表示小數點會造成歧義。字符串常量由字符串加單引號(')構成。字符串內部的單引號可像Pascal 中一樣用兩個單引號來表示。C風格的加反斜線的表示法由于不是標準SQL而不被支持。 BLOB文本是以"x"或"X"開頭的含有十六進制文本信息的文本值 For example:
X'53514697465'
文本值同樣可以為"NULL".
表達式中插入文本值占位符的參數可以使用 sqlite3_bind API函數在運行時插入。參數可以是如下幾種形式:
?NNN | 問號跟隨數字NNN為第NNN個參數占位。NNN需介于1和999之間。 |
? | 不加數字的問號為下一個參數占位。 |
:AAAA | 冒號帶一個標識符名稱為一個名為AAAA的參數占位。命名的參數同樣可以使用序號占位,被賦予的參數序號為下一個尚未被使用的序號。建議不要混合使用命名代表的參數和序號代表的參數以免引起混淆。 |
$AAAA | $符號帶一個標識符名稱也可以為一個名為AAAA的參數占位。在這一情況下標識符名稱可以包括一個或更多的"::" 以及包含任何文本的"(...)"后綴。該語法是Tcl編程語言中的一個可變形式。 |
不使用sqlite3_bind賦值的參數被視為NULL.
LIKE運算符進行模式匹配比較。運算符右邊為進行匹配的模式而左邊為需進行匹配的字符串。 模式中的百分號%匹配結果中的零或任意多個字符。下劃線 _匹配任意單個字符。其他的任意字符匹配本身或等同的大/小寫字符。 (即不區分大小寫的匹配)。 (一個bug: SQLite僅對7-bit拉丁字符支持不區分大小寫匹配。這是由于 LIKE運算符對8-bit iso8859字符或UTF-8字符是大小寫敏感的。例如,表達式'a' LIKE 'A' 的值為真而'?' LIKE '?'為假)。
如果使用可選的ESCAPE子句,則跟隨ESCAPE關鍵字的必須是一個有一個字符的字符串。這一字符(逃逸字符)可用于LIKE模式中,以代替百分號或下劃線。逃逸字符后跟百分號,下劃線或它本身代表字符串中的百分號,下劃線或逃逸字符。插入的LIKE運算符功能通過調用用戶函數like(X,Y)來實現。
當使用可選的ESCAPE子句,它對函數給出第三個參數,LIKE的功能可以通過重載SQL函數like()進行改變。
GLOB運算符與LIKE相似,但它使用Unix文件 globbing 語法作為通配符。還有一點不同是GLOB對大小寫敏感。 GLOB和LIKE都可以前綴NOT關鍵字構成相反的意思。插入的GLOB運算符功能通過調用用戶函數 glob(X,Y) 可以通過重載函數改變GLOB的功能。
REGEXP運算符是用戶函數regexp()的一個特殊的代表符號。缺省情況下regexp()函數不被定義,所以使用REGEXP運算符會報錯。當運行時存在用戶定義的"regexp"函數的定義,則調用該函數以實現REGEXP運算符功能。
字段名可以是CREATE TABLE語句定義的任何名字或如下幾個特殊標識符之一"ROWID", "OID", 以及"_ROWID_".這些特殊標識符均代表每個表每一行關聯的那個唯一隨機整數鍵("row key")。僅僅在CREATE TABLE語句沒有對這些特殊標識符的真實字段予以定義的情況下,它們才代表"row key"。它們與只讀字段類似,可以像任何正常字段一樣使用,除了在UPDATE或INSERT語句中(即是說你不能添加或更改row key)。 "SELECT * ..."不返回row key.
SELECT語句可以在表達式中出現,作為IN運算符的右邊運算量,作為一個純量,或作為EXISTS運算符的運算量。當作純量或IN的運算量時,SELECT語句的結果僅允許有一個字段,可以使用復合的SELECT(用UNION或 EXCEPT等關鍵字連接)。作為EXISTS運算符的運算量時,SELECT結果中的字段被忽略,在結果為空時表達式為假,反之為真。若SELECT表達式代表的查詢中不含有引用值的部分,則它將在處理其它事務之前被計算,并且結果在必要時會被重復使用。若SELECT表達式含從其它查詢中得到的變量,在每一次使用時該表達式均被重新計算。
當SELECT作為IN運算符的右運算量,在左邊的運算量是SELECT產生的任意一個值時,表達式返回TRUE。IN運算符前可以加NOT 構成相反的意思。
當SELECT與表達式一同出現且不在IN的右邊,則SELECT結果的第一行作為表達式中使用的值。SELECT返回的結果在第一行以后的部分被忽略。返回結果為空時SELECT語句的值為NULL.
CAST表達式將的數據類型改為聲明的類型。 可以是CREATE TABLE語句字段定義部分定義的對該字段有效的任意非空數據類型。
表達式支持簡單函數和聚集函數。簡單函數直接從輸入獲得結果,可用于任何表達式中。聚集函數使用結果集中的所有行計算結果,僅用于SELECT語句中。
T下面這些函數是缺省可用的。可以使用C語言寫出其它的函數然后使用sqlite3_create_function() API函數添加到數據庫引擎中。
注意同時重載like()的兩參數和三參數版本,否則在使用/不使用 ESCAPE子句時,LIKE運算符的實現可能使用的是不同的代碼。abs(X) | 返回參數X的絕對值。 |
coalesce(X,Y,...) | 返回第一個非空參數的副本。若所有的參數均為NULL,返回NULL。至少2個參數。 |
glob(X,Y) | 用于實現SQLite的 "X GLOB Y"語法。可使用 sqlite3_create_function() 重載該函數從而改變GLOB運算符的功能。 |
ifnull(X,Y) | 返回第一個非空參數的副本。 若兩個參數均為NULL,返回NULL。與上面的 coalesce()類似。 |
last_insert_rowid() | 返回當前數據庫連接最后插入行的ROWID。sqlite_last_insert_rowid() API函數同樣可用于得到該值。 |
length(X) | 返回X的長度,以字符計。如果SQLite被配置為支持UTF-8,則返回UTF-8字符數而不是字節數。 |
like(X,Y [,Z]) | 用于實現SQL語法"X LIKE Y [ESCAPE Z]".若使用可選的ESCAPE子句,則函數被賦予三個參數,否則只有兩個??墒褂?a style="word-wrap: break-word; text-decoration: none; color: #565656;" href="http://localhost/Htmleditor.asp#" target="_blank">sqlite3_create_function() 重載該函數從而改變LIKE運算符的功能。 |
lower(X) | 返回X字符串的所有字符小寫化版本。這一轉換使用C語言庫的tolower()函數,對UTF-8字符不能提供好的支持。 |
max(X,Y,...) | 返回最大值。參數可以不僅僅為數字,可以為字符串。大小順序由常用的排序法則決定。注意,max()在有2個或更多參數時為簡單函數,但當僅給出一個參數時它變為聚集函數。 |
min(X,Y,...) | 返回最小值。與max()類似。 |
nullif(X,Y) | 當兩參數不同時返回X,否則返回NULL. |
quote(X) | 返回參數的適于插入其它SQL語句中的值。字符串會被添加單引號,在內部的引號前會加入逃逸符號。 BLOB被編碼為十六進制文本。當前的VACUUM使用這一函數實現。在使用觸發器實現撤銷/重做功能時這一函數也很有用。 |
random(*) | 返回介于-2147483648和 +2147483647之間的隨機整數。 |
round(X) round(X,Y) | 將X四舍五入,保留小數點后Y位。若忽略Y參數,則默認其為0。 |
soundex(X) | 計算字符串X的soundex編碼。參數為NULL時返回字符串"?000".缺省的SQLite是不支持該函數的,當編譯時選項 -DSQLITE_SOUNDEX=1 時該函數才可用。 |
sqlite_version(*) | 返回所運行的SQLite庫的版本號字符串。如 "2.8.0"。 |
substr(X,Y,Z) | 返回輸入字符串X中以第Y個字符開始,Z個字符長的子串。 X最左端的字符序號為1。若Y為負,則從右至左數起。若SQLite配置支持UTF-8,則“字符”代表的是UTF-8字符而非字節。 |
typeof(X) | 返回表達式X的類型。返回值可能為"null", "integer", "real", "text", 以及 "blob". SQLite的類型處理參見SQLite3的數據類型. |
upper(X) | 返回X字符串的所有字符大寫化版本。這一轉換使用C語言庫的toupper()函數,對UTF-8字符不能提供好的支持。 |
以下是缺省可用的聚集函數列表??梢允褂肅語言寫出其它的聚集函數然后使用sqlite3_create_function() API函數添加到數據庫引擎中。
在單參數聚集函數中,參數可以加前綴DISTINCT。這時重復參數會被過濾掉,然后才穿入到函數中。例如,函數"count(distinct X)"返回字段X的不重復非空值的個數,而不是字段X的全部非空值。
avg(X) | 返回一組中非空的X的平均值。非數字值作0處理。avg()的結果總是一個浮點數,即使所有的輸入變量都是整數。 |
count(X) count(*) | 返回一組中X是非空值的次數的第一種形式。第二種形式(不帶參數)返回該組中的行數。 |
max(X) | 返回一組中的最大值。大小由常用排序法決定。 |
min(X) | 返回一組中最小的非空值。大小由常用排序法決定。僅在所有值為空時返回NULL。 |
sum(X) total(X) | 返回一組中所有非空值的數字和。若沒有非空行,sum()返回NULL而total()返回0.0. NULL通常情況下并不是對于“沒有行”的和的一個有意義的結果,但SQL標準如此要求,且大部分其它SQL數據庫引擎這樣定義sum(),所以SQLite 也如此定義以保證兼容。我們提供非標準的total()函數作為解決該SQL語言設計問題的一個簡易方法。 total()的返回值式中為浮點數。sum()可以為整數,當所有非空輸入均為整數時,和是精確的。 若sum()的任意一個輸入既非整數也非NULL或計算中產生整數類型的溢出時,sum()返回接近真和的浮點數。 |