建立資料庫
在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;