SQLite使用小結1

一、SQLite簡介  

  SQLite是一款輕型的數據庫,是遵守ACID的關聯式數據庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如TclPHPJava等,還有ODBC接口,同樣比起MysqlPostgreSQL這兩款開源世界著名的數據庫管理系統來講,它的處理速度比他們都快。

  SQLite雖然很小巧,但是支持的SQL語句不會遜色於其他開源數據庫,它支持的SQL包括:

  ATTACH DATABASE

  BEGIN TRANSACTION

  comment

  COMMIT TRANSACTION

  COPY

  CREATE INDEX

  CREATE TABLE

  CREATE TRIGGER

  CREATE VIEW

  DELETE

  DETACH DATABASE

  DROP INDEX

  DROP TABLE

  DROP TRIGGER

  DROP VIEW

  END TRANSACTION

  EXPLAIN

  expression

  INSERT

  ON CONFLICT clause

  PRAGMA

  REPLACE

  ROLLBACK TRANSACTION

  SELECT

  UPDATE

  同時它還支持事務處理功能等等。也有人說它象MicrosoftAccess,有時候真的覺得有點象,但是事實上它們區別很大。比如SQLite 支持跨平臺,操作簡單,能夠使用很多語言直接創建數據庫,而不象Access一樣需要Office的支持。如果你是個很小型的應用,或者你想做嵌入式開發,沒有合適的數據庫系統,那麼現在你可以考慮使用SQLite。目前它的最新版本是 3.2.2,它的官方網站是:http://www.sqlite.org或者http://www.sqlite.com.cn,能在上面獲得源代碼和文檔。同時因爲數據庫結構簡單,系統源代碼也不是很多,也適合想研究數據庫系統開發的專業人士

  下面是訪問SQLite官方網站: http://www.sqlite.org/ 時第一眼看到關於SQLite的特性.

  1. ACID事務

  2. 零配置 無需安裝和管理配置

  3. 儲存在單一磁盤文件中的一個完整的數據庫

  4. 數據庫文件可以在不同字節順序的機器間自由的共享

  5. 支持數據庫大小至2TB

  6. 足夠小, 大致3萬行C代碼, 250K

  7. 比一些流行的數據庫在大部分普通數據庫操作要快

  8. 簡單, 輕鬆的API

  9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定

  10. 良好註釋的源代碼, 並且有着90%以上的測試覆蓋率

  11. 獨立: 沒有額外依賴

  12. Source完全的Open, 你可以用於任何用途, 包括出售它

  13. 支持多種開發語言,C, PHP, Perl, Java, ASP.NET,Python

  2SQLite類型

  SQLite的數據類型

  首先你會接觸到一個讓你驚訝的名詞: Typelessness(無類型). ! SQLite是無類型的. 這意味着你可以保存任何類型的數據到你所想要保存的任何表的任何列中, 無論這列聲明的數據類型是什麼(只有在一種情況下不是, 稍後解釋). 對於SQLite來說對字段不指定類型是完全有效的. :

  Create Table ex1(a, b, c);

  誠然SQLite允許忽略數據類型, 但是仍然建議在你的Create Table語句中指定數據類型. 因爲數據類型對於你和其他的程序員交流, 或者你準備換掉你的數據庫引擎. SQLite支持常見的數據類型, :

  CREATE TABLE ex2(

  a VARCHAR(10),

  b NVARCHAR(15),

  c TEXT,

  d INTEGER,

  e FLOAT,

  f BOOLEAN,

  g CLOB,

  h BLOB,

  i TIMESTAMP,

  j NUMERIC(10,5)

  k VARYING CHARACTER (24),

  l NATIONAL VARYING CHARACTER(16)

  );

  前面提到在某種情況下, SQLite的字段並不是無類型的. 即在字段類型爲”Integer Primary Key”時.

 

 

SQLite的簡單使用

SQLite可以到官方站點下載http://www.sqlite.org/download.html
包括:Linux,Mac OS X, Windows下的已編譯文件以及源代碼、幫助文檔。windows版的下載地址是:http://www.sqlite.org/sqlite-3_6_23_1.zip,下載後解壓就可以了。這個文件是工作在命令行下的。雙擊它,就直接進入命令行了。

打開之後是這樣顯示的:

SQLite version 3.6.23.1

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite>

 

1、創建數據庫

按理說第一步是創建一個數據庫,我是學電子的,對計算機不瞭解,所以我不知道mysql是如何存儲數據庫的。但sqlite將一個數據庫存儲爲一個文件。我們先進下cmd,關掉原來的sqlite3,因爲我不只道在sqlite提示符下如何創建數據庫,有知道的歡迎告之,不勝感激。

在命令提示符下:

sqlite3 newsql.db

然後就會自動跳到sqlite>命令提示符下。我記得在linux下用時候會在當前目錄下出現newsql.db文件。但在我所用版本的windows下沒有出現。然後我做了些嘗試得到如下結果:

sqlite3 newsql.db

.quit

注意:.quit是在sqlite提示符下輸入的,代表退出。看目錄下還是沒有出現數據庫文件。

sqlite3 newsql.db

;

.quit

出現了newsql.db文件。冒號加回車,在sqlite中,代表執行一條語句的意思,雖然我只輸入了一個冒號加回車,沒有輸入任何的語句,但結果已是不同。

2、創建一個表

create table mytable(entry1 varchar(10),entry2 int);

不要忘了加冒號。冒號代表一條語句輸入完畢。

mytable是我創建的表名。create table都是系統關鍵字。entry1,entry2是兩個表項。

varchar(10) int是類型。根據我讀到的內容,sqlite是不區分類型,但是我們還是要在創建表時,給他一個類型,以便於將這些代碼移植到其他的數據庫裏面時更加的方便。

3、向表中插入一條記錄

insert into mytable values("hello world",10);

插入完了之後才發現是不是超出定義的大小了?我定義的entry1項是varchar(10)型的,說實在的,我不知這個類型確切來講是什麼意思,我猜應該是10個字符的字符串數組吧。如果那樣的話我是一定超出了。但既然sqlite是不區分類型的,我想應該沒有問題吧。於是我急於看看是不是這樣...

4、查詢表中內容

select * from mytable;

執行這條語句,會列出mytable中的所有內容。

結果爲:

sqlite> select * from mytable;

hello world|10

可見還是都插入進去了。

sqlite> insert into mytable values("goodbye cruel world",20);

sqlite> select * from mytable;

hello world|10

goodbye cruel world|20

也就是說,第一個條目的字符串完全不受限制。

5sqlite3 newsql.db的規則

我們現在退出,然後重新打開數據庫:

sqlite> .quit

F:\sqlite>sqlite3 newsql.db

SQLite version 3.6.23.1

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> select * from mytable;

hello world|10

goodbye cruel world|20

可見sqlite3 newsql.db這個命令規則爲:打開名爲newsql.db這個數據庫,如果不存在則創建一個。

6、查詢一個數據庫中所有的表名

sqlite數據庫中有一個系統建立的表,名爲sqlite_master,查詢這個表可以得到所有的表。

sqlite> create table my2ndtable(theonlyentry int);

sqlite> insert into my2ndtable values(30);

sqlite> select * from sqlite_master;

table|mytable|mytable|2|CREATE TABLE mytable(entry1 varchar(10),entry2 int)

table|my2ndtable|my2ndtable|3|CREATE TABLE my2ndtable(theonlyentry int)

對於這個表的定義,官方網站的FAQ中給出如下:

CREATE TABLE sqlite_master ( type TEXT, name TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT );第一個字段類型顯然會一直是table,第二個字段是名稱分別是mytablemy2ndtable,見上面的結果。第三個字段表名,沒弄懂是什麼意,想必是所在的表的名字,但是一個表的名字和所在的表名不是一樣的嗎?第四個字段rootpage,我也不知指什麼,這個系統的學過數據庫的人應該能知道,有路過的還望告之。第五個字段是創建表的使用的sql語句吧。

7sqlite的輸出模式

 默認的輸出格式是列表。在列表模式下,每條查詢結果記錄被寫在一行中並且每列之間以一個字符串分割符隔開。默認的分隔符是一個管道符號(“|”)。列表符號在當你輸出查詢結果到另外一個符號處理的程序(如AWK)中去是尤爲有用。

sqlite> .mode list

sqlite> select * from mytable;

hello world|10

goodbye cruel world|20

sqlite>

這是正常的模式。

sqlite> .mode csv

sqlite> select * from mytable;

"hello world",10

"goodbye cruel world",20

變化是什麼?字符串被加上了引號。

sqlite> .mode column

sqlite> select * from mytable;

hello world  10

goodbye cru  20

哎呀,第二個字符串被截斷了。

.mode MODE ?TABLE?__  Set output mode where MODE is one of:

____________  csv___ Comma-separated values

____________  column_  Left-aligned columns._ (See .width)

____________  html__  HTML <table> code

____________  insert_  SQL insert statements for TABLE

____________  line__  One value per line

____________  list__  Values delimited by .separator string

____________  tabs__  Tab-separated values

____________  tcl___ TCL list elements

這些來自.help命令的輸出結果。

sqlite> .mode html

sqlite> select * from mytable;

<TR><TD>hello world</TD>

<TD>10</TD>

</TR>

<TR><TD>goodbye cruel world</TD>

<TD>20</TD>

</TR>

.mode html是一種較新的輸出方法。

另外,我們也可以把輸出結果輸出到文件:

sqlite> .output output.txt

sqlite> select * from mytable;

sqlite> .exit


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