android sqlite3 adb命令學習

創建數據庫
在cmd下面調用sqlite3.exe,創建數據命令如下:
sqlite3 db_name.xx;
數據庫名稱任意,創建後直接進入數據庫;如果文件存在,則直接打開;

SQL的指令格式
所有的SQL的指令都是以分號(;)結尾的,爲增加可讀性,允許一個指令多行編輯,直到遇到分號結束指令;
sqlite3中兩個減號(--)代表註釋,sqlite會忽略。

創建表
鍵入以下指令即可創建一個tab_name表:
create table tab_name (field1, field2, field3...);
sqlite3對字段沒有嚴格要求,字段可以存儲任何類型數據,它會適時的自動轉換,當然,你也可以創建表的時候對數據類型進行定義。

數據類型
NULL
INTEGER
REAL
TEXT
BLOB
但實際上,sqlite3也接受如下的數據類型:
smallint 16 位元的整數。
interger 32 位元的整數。
decimal(p,s) p 精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值,s是指小數點後有幾位數。如果沒有特別指定,則系

統會設爲 p=5; s=0 。
float   32位元的實數。
double   64位元的實數。
char(n)   n 長度的字串,n不能超過 254。
varchar(n) 長度不固定且其最大長度爲 n 的字串,n不能超過 4000。
graphic(n) 和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是爲了支援兩個字元長度的字體,例如中文字。
vargraphic(n) 可變長度且其最大長度爲 n 的雙字元字串,n不能超過 2000
date   包含了 年份、月份、日期。
time   包含了 小時、分鐘、秒。
timestamp 包含了 年、月、日、時、分、秒、千分之一秒。


查看
.database 顯示數據庫信息;
.tables 顯示錶名稱;(好像.table也可以)
.schema 命令可以查看創建數據表時的SQL命令;
.schema table_name 查看創建表table_name時的SQL的命令;

插入記錄
insert into table_name values (field1, field2, field3...);

查詢
select * from table_name;查看table_name表中所有記錄;
select * from table_name where field1='xxxxx'; 查詢符合指定條件的記錄;

刪除
drop table_name;     刪除表;
drop index_name;     刪除索引;

改變輸出格式

.mode list|column|insert|line|tabs|tcl|csv
.separator "X" 更改分界符號爲X

更改輸出
.output file_name|stdout
輸出到文件或者標準輸出(默認終端)


.databases               列出數據庫文件名
.tables ?PATTERN?        列出?PATTERN?匹配的表名
.import FILE TABLE       將文件中的數據導入的文件中
.dump ?TABLE?            生成形成數據庫表的SQL腳本
.output FILENAME         將輸出導入到指定的文件中
.output stdout           將輸出打印到屏幕
.mode MODE ?TABLE?       設置數據輸出模式(csv,html,tcl…
.nullvalue STRING        用指定的串代替輸出的NULL串
.read FILENAME           執行指定文件中的SQL語句
.schema ?TABLE?          打印創建數據庫表的SQL語句
.separator STRING        用指定的字符串代替字段分隔符
.show                    打印所有SQLite環境變量的設置
.quit                    退出命令行接口


1.存儲類別

第二版把所有列的值都存儲成ASCII文本格式。第三版則可以把數據存儲成整數和實數,還可以存儲BLOB數據.

Each value stored in an SQLite數據庫中存儲的每個值都有一個屬性,都屬於下面所列類中的一種,(被數據庫引擎所控制)

NULL: 這個值爲空值
INTEGER: 值被標識爲整數,依據值的大小可以依次被存儲爲1,2,3,4,5,6,7,8.
REAL: 所有值都是浮動的數值,被存儲爲8字節的IEEE浮動標記序號.
TEXT: 文本. 值爲文本字符串,使用數據庫編碼存儲(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB數據,如何輸入就如何存儲,不改變格式.

像SQLite2.0版一樣,在3.0版中,除了INTEGER PRIMARY KEY,數據庫中的任何列都可以存儲任何類型的數據. 這一規則也有例外,在下面的"嚴格相似

模式"中將描述.

輸入SQLite的所有值,不管它是嵌入 SQL語句中的文字還是提前編譯好的綁定在SQL語句中的值, 在SQL語句執行前都被存儲爲一個類.在下面所描述

的情況下,數據庫引擎將在執行時檢查並把值 在數字存儲類(整數和實數)和文本類間轉換.

存儲的類別最初被分類爲如下:

具體的值比如SQL語句部分的帶雙引號或單引號的文字被定義爲文本,如果文字沒帶引號並沒有小數點或指數則被定義爲整數,如果文字沒帶引號但有

小數點或指數則被定義爲實數, 如果值是空則被定義爲空值.BLOB數據使用符號X'ABCD'來標識.

Values supplied using the 被輸入的值使用sqlite3_bind_* APIs的被分類一個存儲等級, 這等級是和原來的類基本相一致的. (比如

qlite3_bind_blob()綁定一個BLOB的值).

值的分類是SQL分等級操作的結果,決定於最遠的操作表達式.用戶定義的功能也許會把值返回任意的類.在編譯的時候來確定表達式的存儲類基本是

不可能的.

2. 列之間的親和性

在SQLite3.0版中,值被定義爲什麼類型只和值自身有關,和列沒有關係,和變量也沒有關係. (這有時被稱作 弱類型.)所有其它的我們所使用的數據

庫引擎都受靜態類型系統的限制, 其中的所有值的類是由其所屬列的屬性決定的,而和值無關.

爲了最大限度的增加SQLite數據庫和其他數據庫的兼容性,SQLite支持列的"類型親和性".
列的親和性是爲該列所存儲的數據建議一個類型.我們要注意是建議而不是強迫. 在理論上來講,任何列依然是可以存儲任何類型的數據的. 只是針

對某些列,如果給建議類型的話,數據庫將按所建議的類型存儲.這個被優先使用的數據類型則被稱爲"親和類型".

在SQLite3.0版中,數據庫中的每一列都被定義爲以下親和類型中的一種:

TEXT
NUMERIC
INTEGER
REAL
NONE

一個具有類型親和性的列按照無類型,文本,或BLOB存儲所有的數據.如果數字數據被插入一個 具有文本類型親和性的列,在存儲之前數字將被轉換成

文本.

一個具有數字類型親和性的列也許使用所有的五個存儲類型存儲值.當文本數據被插入一個數字列時, 在存儲之前,數據庫將嘗試着把文本轉換成整

數或實數.如果能成功轉換的話,值將按證書活實數的類型被存儲. 如果不能成功轉換的話,值則只能按文本類型存儲了,而不會被轉換成無類型或

BLOB類型來存儲.

一個具有整數親和力的列在轉換方面和具有數字親和力的列是一樣的,但也有些區別 , 比如沒有浮動量的實值(文本值轉換的值)被插入具有整數親

和力的列時,它將被轉換成整數並按整數類型存儲.

一個具有無類型親和力的列不會優先選擇使用哪個類型.在數據被輸入前它不會強迫數據轉換類型.

2.1 列的親和性的決定

一個列的親和類型是由該列所宣稱的類型決定的.遵守以下規則:

a. 如果數據類型包括字符串"INT"那麼它被定義成具有整數親和性.
b. 如果列中的數據類型包括以下任何的字符串 "CHAR", "CLOB", or "TEXT" 那麼這個列則具有文本親和性.要注意VARCHAR類型包括字符串"CHAR"

因此也具有文本類型親和性.
c. 如果一個列的數據類型包括字符串"BLOB"或者如果數據類型被具體化了,
   那麼這個列具有無類型親和性.
d. 否則就具有數字類型親和性.

如果表格使用If "CREATE TABLE AS SELECT..."語句生成的,那麼所有的列則都沒有具體的數據類型,則沒有類型親和性.

2.2 列的親和性的例子

    CREATE TABLE t1(
        t TEXT,
        nu NUMERIC,
        i INTEGER,
        no BLOB
    );

    -- Storage classes for the following row:
    -- TEXT, REAL, INTEGER, TEXT
    INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0');

    -- Storage classes for the following row:
    -- TEXT, REAL, INTEGER, REAL
    INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0);

3. 比較表達式

像SQLite2.0版一樣,3.0版的一個特性是二進制比較符'=', '<', '<=', '>=' and '!=', 一個操作'IN'可以測試固定的成員資格, 三重的比較操作

符'BETWEEN'.
比較的結果決定於被比較的兩個值的存儲類型。遵循以下規則:

一個具有空存儲類型的值被認爲小於任何值(包括另外一個具有空存儲類型的值)。
一個整數值或實數值小於任何文本值和BLOB值。 當一個整數或實數和另一個整數或實數相比較的時候,則按照實際數值來比較。
一個文本值小於BLOB值。當兩個文本值相比較的時候,則用C語言類庫中的memcmp()函數來比較。 然而,有時候也不是這樣的,比如在下面所描述

的“用戶定義的整理順序”情況下。
當兩個BLOB文本被比較的時候,結果決定於memcmp()函數。
在開始比較前,SQLite嘗試着把值在數字存儲級(整數和實數)和文本之間相互轉換。下面列舉了關於如何比較二進制值的例子。在着重號below中

使用的表達式可以表示SQL標量表達式或是文本但不是一個列值。

當一個列值被比擬爲表達式結果的時候,在比較開始前,列的親和性將被應用在表達結果中。
當兩個列值比較的時候,如果一個列有整數或數字親和性的時候,而另外一列卻沒有, 那麼數字親和性適用於從非數字列提取的任何具有文本存儲

類型的值. P>
當比較兩個表達式的結果時,不發生任何轉換,直接比較結果.如果一個字符串和一個數字比較, 數字總是小於字符串.
在SQLite中, 表達式"a BETWEEN b AND c"等於表達式 "a >= b AND a <= c",在比較表達式時,a可以是具有任何親和性.

表達式 "a IN (SELECT b ....)" 在比較時遵循上面所提到的三條規則,是二進制比較.(例如, 在一個相似的樣式 "a = b"). 例如,如果'b'是一個

列值, 'a' 是一個表達式,那麼,在開始比較前,'b'的親和性就被轉換爲'a'的親和性了.

SQLite把表達式 "a IN (x, y, z)" 和 "a = z OR a = y OR a = z"視爲相等.

3.1 比較例子

    CREATE TABLE t1(
        a TEXT,
        b NUMERIC,
        c BLOB
    );

    -- Storage classes for the following row:
    -- TEXT, REAL, TEXT
    INSERT INTO t1 VALUES('500', '500', '500');

    -- 60 and 40 are converted to '60' and '40' and values are compared as TEX
T.
    SELECT a < 60, a < 40 FROM t1;
    1|0

    -- Comparisons are numeric. No conversions are required.
    SELECT b < 60, b < 600 FROM t1;
    0|1

    -- Both 60 and 600 (storage class NUMERIC) are less than '500'
    -- (storage class TEXT).
    SELECT c < 60, c < 600 FROM t1;
    0|0

4. 運算符

所有的數學運算符(所有的運算符而不是連鎖作用標記符"||")運算對象首先具有數字親和性, 如果一個或是兩個都不能被轉換爲數字那麼操作的結

果將是空值。
對於連接作用操作符,所有操作符將首先具有文本親和性。如果其中任何一個操作符不能被轉換爲文本 (因爲它是空值或是BLOB)連接作用操作符

將是空值。

5. 分類,排序,混合挑選

當用子句ORDER挑選值時,空值首先被挑選出來, 然後是整數和實數按順序被挑選出來, 然後是文本值按memcmp()順序被挑選出來, 最後是BLOB值按

memcmp()順序被挑選出來. 在挑選之前, 沒有存儲類型的值都被轉換了.
When grouping values with the 當用GROUP BY子句給值分組時,具有不同存儲類型的值被認爲是不同的, 但也有例外, 比如,一個整數值和一個實

數值從數字角度來說是相等的,那麼它們則是相等的. 用GROUP by 子句比較完後,值不具有任何親和性.

混合挑選操作符UNION, INTERSECT and EXCEPT 在值之間實行絕對的比較,同樣的親和性將被應用於所有的值, 這些值將被存儲在一個單獨的具有混

合SELECT的結果組的列中. 被賦予的親和性是該列的親和性, 這個親和性是由剩下的大部分的混合SELECTS返回的,這些混合SELECTS在那個位置上有

列值(而不是其它類型的表達式). 如果一個給定的混合SELECT列沒有SELECTS的量, 那麼在比較前,該列的值將不具有任何親和性.

6. 其它親和性模式

以上的部分所描述的都是數據庫引擎在正常親和性模式下所進行的操作, SQLite將描述其它兩種親和性模式,如下:

嚴格親和性模式.在這種模式下,如果需要值之間相互轉換數據存儲類型的話,數據庫引擎將發送錯誤報告,當前語句也將會重新運行.
無親和性模式.在這種模式下,值的數據存儲類型不發生轉換.具有不同存儲類型的值之間不能比較,但整數和實數之間可以比較.
7.用戶定義的校對順序
By default, when 當SQLite比較兩個文本值的時候,通過系統設定,不管字符串的編碼是什麼,用memcmp()來比較. SQLite第三版允許用戶提供任意

的函數來代替memcmp(),也就是用戶定義的比較順序.
除了系統預設的BINARY比較順序,它是用memcmp()函數比較,SQLite還包含了兩個額外的內置比較順序函數, NOCASE和REVERSE:


BINARY -使用memcmp()比較字符串數據, 不考慮文本編碼.
NOCASE - 和二進制一樣,但在比較之前,26位的大寫字母盤要被摺合成相應的小寫字母盤.

7.1 分配比較順序
每個表格中的每個列都有一個預設的比較類型.如果一個比較類型不是二進制所要求的, 比較的子句將被具體化爲 列的定義 來定義該列.
當用SQLite比較兩個文本值時,比較順序將按照以下的規則來決定比較的結果. 文檔的第三部分和第五部分描述在何種場合下發生這種比較.

對於二進制比較符(=, <, >, <= and >=),如果每個操作數是一列的話, 那麼該列的默認比較類型決定於所使用的比較順序. 如果兩個操作數都是列

的話,那麼左邊的操作數的比較類
型決定了所要使用的比較順序.如果兩個操作數都不是一列, 將使用二進制來比較.

表達式"x BETWEEN y and z"和 "x >= y AND x <= z"是相同的. 表達式"x IN (SELECT y ...)" 和表達式 "x = y" 使用同樣的方法來操作,這是爲

了決定所要使用的比較順序.如果X是一列或者二進制的,則"x IN (y, z ...)" 形式的表達式所使用的比較順序是X的默認的比較類型.

ORDER BY clause that is part of a SELECT statement may be assigned a collation sequence to be used for the sort operation

explicitly. In this case the explicit collation sequence is always used. Otherwise, if the expression sorted by an ORDER BY

clause is a column, then the default collation type of the column is used to determine sort order. If the expression is not a

column, then the BINARY collation sequence is used.

7.2 比較順序的例子

下面的例子介紹了The examples below identify the collation sequences that would be used to determine the results of text

comparisons that may be performed by various SQL statements. Note that a text comparison may not be required, and no collation

sequence used, in the case of numeric, blob or NULL values.

    CREATE TABLE t1(
        a,                 -- default collation type BINARY
        b COLLATE BINARY, -- default collation type BINARY
        c COLLATE REVERSE, -- default collation type REVERSE
        d COLLATE NOCASE   -- default collation type NOCASE
    );

    -- Text comparison is performed using the BINARY collation sequence.
    SELECT (a = b) FROM t1;

    -- Text comparison is performed using the NOCASE collation sequence.
    SELECT (d = a) FROM t1;

    -- Text comparison is performed using the BINARY collation sequence.
    SELECT (a = d) FROM t1;

    -- Text comparison is performed using the REVERSE collation sequence.
    SELECT ('abc' = c) FROM t1;

    -- Text comparison is performed using the REVERSE collation sequence.
    SELECT (c = 'abc') FROM t1;

    -- Grouping is performed using the NOCASE collation sequence (i.e. values

    -- 'abc' and 'ABC' are placed in the same group).
    SELECT count(*) GROUP BY d FROM t1;

    -- Grouping is performed using the BINARY collation sequence.
    SELECT count(*) GROUP BY (d || '') FROM t1;

    -- Sorting is performed using the REVERSE collation sequence.
    SELECT * FROM t1 ORDER BY c;

    -- Sorting is performed using the BINARY collation sequence.
    SELECT * FROM t1 ORDER BY (c || '');

    -- Sorting is performed using the NOCASE collation sequence.
    SELECT * FROM t1 ORDER BY c COLLATE NOCASE;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章