<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    海上月明

    editer by sun
    posts - 162, comments - 51, trackbacks - 0, articles - 8
       :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

    [轉]SQLite SQL語法詳解

    Posted on 2013-06-09 17:05 pts 閱讀(733) 評論(0)  編輯  收藏

    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復合時,它們從左至右結合。

    UPDATE

    sql-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。

    REPLACE

    sql-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命令文檔獲取更多信息。

    INSERT

    sql-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".

    DELETE

    sql-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()返回接近真和的浮點數。


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 水蜜桃视频在线观看免费播放高清| 国产特黄一级一片免费| 免费很黄很色裸乳在线观看| 成人免费一区二区三区| 亚洲国产福利精品一区二区| 国产免费久久精品久久久| eeuss影院ss奇兵免费com| 亚洲天堂在线播放| 韩国日本好看电影免费看| 免费无码又爽又刺激一高潮| 亚洲AV男人的天堂在线观看| 国产亚洲视频在线播放| 男女做羞羞的事视频免费观看无遮挡 | 女人张腿给男人桶视频免费版| 一个人看的www视频免费在线观看| 亚洲精品在线视频观看| 免费一级特黄特色大片在线| 91制片厂制作传媒免费版樱花| 无忧传媒视频免费观看入口| 亚洲精品人成电影网| 亚洲一区二区三区在线播放 | 妞干网免费视频在线观看| 99久久免费国产精品热| 亚洲Av永久无码精品黑人| 亚洲伊人久久大香线蕉苏妲己| 亚洲av麻豆aⅴ无码电影| 国产卡一卡二卡三免费入口| 中文字幕乱理片免费完整的| 亚洲精品9999久久久久无码| 91大神亚洲影视在线| 国产亚洲av片在线观看18女人| 韩国日本好看电影免费看| 3344免费播放观看视频| 中文在线观看国语高清免费| 亚洲a无码综合a国产av中文| 亚洲天堂电影在线观看| 久久精品夜色国产亚洲av| 中文字幕亚洲无线码a| 国产裸模视频免费区无码| 成人免费一区二区无码视频| 久久久久久毛片免费播放|