sqlite3

http://www.cnblogs.com/songsh96/archive/2011/10/14/2211079.htmlhtml

一.創建數據庫

sqlite3.exe test.dbsql

 

二.雙擊sqlite-3_6_16目錄下的程序sqlite3.exe,便可運行

三.退出

.exitshell

或者數據庫

.quitexpress

四.SQLite支持以下5種數據類型

1.NULL:空值。
2.INTEGER:帶符號的整型,具體取決有存入數字的範圍大小。
3.REAL:浮點數字,存儲爲8-byte IEEE浮點數。
4.TEXT:字符串文本。
5.BLOB:二進制對象。服務器

 

五.聯繫人表格結構以下

create table contact(id integer primary key autoincrement,網絡

lastname varchar(20),firstname varchar(20),併發

mobile varchar(30), telephone varchar(20),dom

email  varchar(30), company varchar(50),函數

department varchar(16),address varchar(80),

id1 interger,id2 integer, updatetime datetime);

 

六.查看數據庫有哪些數據表

命令是:.tables

七.如何插入一條記錄

insert into contact(lastname,firstname,mobile,telephone,updatetime) values('劉','暢','13910128132','010-81749136','2009-07-22');

八.查看數據表的結構

 

 

針對整個數據庫

.schema

針對僅僅是contact聯繫人該表

.schema  contact 注意沒有分號

 

九.如何打開一個已經建立的數據庫

 

sqlite3  test.db

十.如何解決以下問題

SQL error: near "sqlite3": syntax error

 

SQL指令都是以分號(;)結尾的。若是遇到兩個減號(--)則表明註解,sqlite3會略過去

 

十一.如何創建索引

create index index_name on table_name(field_to_be_indexed);

十二.如何刪除一張數據表

drop table contact;

 

十三.查看當前的數據庫

.database

 

十四.如何刪除一個數據表的數據

delete from contact;

十五.如何導入一個文件到某個表中

.import  文件路徑  表名

注意這是非SQL語句,因此不加分號

十六.如何設置文件字段的分隔符

.separator   「,」

.import e:/contact.txt contact

十七.如何查看當前sqllite字段的分隔符是什麼?

.show

 

十八.如何將查詢結果導出到一個文件

 

第一步:.output a.txt

第二步:執行要導出的SQL語句

第三步:.output stdout

十九.SQL查詢語句

select * from film order by year limit 10;

select * from film order by year desc limit 10;

select count(*) from film;

select * from film where starring like 'Jodie%';

 

select * from film where starring='Jodie Foster';

select title, year from film order by year desc limit 10;

select columns from table_name where expression;

 

最多見的用法,固然是倒出全部數據庫的內容:

 

select * from film;

 

若是資料太多了,咱們或許會想限制筆數:

 

select * from film limit 10;

 

或是照着電影年份來排列:

 

select * from film order by year limit 10;

 

或是年份比較近的電影先列出來:

 

select * from film order by year desc limit 10;

 

或是咱們只想看電影名稱跟年份:

 

select title, year from film order by year desc limit 10;

 

查全部茱蒂佛斯特演過的電影:

 

select * from film where starring='Jodie Foster';

 

查全部演員名字開頭叫茱蒂的電影('%' 符號即是 SQL 的萬用字符):

 

select * from film where starring like 'Jodie%';

 

查全部演員名字以茱蒂開頭、年份晚於1985年、年份晚的優先列出、最多十筆,只列出電影名稱和年份:

 

select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10;

 

有時候咱們只想知道數據庫一共有多少筆資料:

 

select count(*) from film;

 

有時候咱們只想知道1985年之後的電影有幾部:

 

select count(*) from film where year >= 1985;

 

(進一步的各類組合,要去看SQL專書,不過你大概已經知道SQL爲何這麼流行了:這種語言容許你將各類查詢條件組合在一塊兒──而咱們還沒提到「跨數據庫的聯合查詢」呢!)

 

 

如何更改或刪除資料

瞭解select的用法很是重要,由於要在sqlite更改或刪除一筆資料,也是靠一樣的語法。

 

例若有一筆資料的名字打錯了:

update film set starring='Jodie Foster' where starring='Jodee Foster';

就會把主角字段裏,被打成'Jodee Foster'的那筆(或多筆)資料,改回成Jodie Foster。

delete from film where year < 1970;

就會刪除全部年代早於1970年(不含)的電影了。

其餘sqlite的特別用法

sqlite能夠在shell底下直接執行命令:

sqlite3 film.db "select * from film;"

輸出 HTML 表格:

sqlite3 -html film.db "select * from film;"

將數據庫「倒出來」:

sqlite3 film.db ".dump" > output.sql

利用輸出的資料,創建一個如出一轍的數據庫(加上以上指令,就是標準的SQL數據庫備份了):

sqlite3 film.db < output.sql

在大量插入資料時,你可能會須要先打這個指令:

 

begin;

插入完資料後要記得打這個指令,資料纔會寫進數據庫中:

commit;

 

建立數據庫文件: 
   >SQLite3 d:/test.db 回車
   就生成了一個test.db在d盤。
   這樣同時也SQLite3掛上了這個test.db
   2) 
   用.help能夠看看有什麼命令 
   >.help 回車便可
   3)能夠在這裏直接輸入SQL語句建立表格 用;結束 ,而後回車就能夠看到了
   4)看看有建立了多少表 
   >.tables 
   5)看錶結構
   >.schema 表名
   6)看看目前的數據庫 
   >.database
   7)若是要把查詢輸出到文件 
   >.output 文件名
   > 查詢語句;
   查詢結果就輸出到了文件c:/query.txt

   把查詢結果用屏幕輸出
   >.output stdout

   8)把表結構輸出,同時索引也會輸出
     .dump 表名
   9)退出 
   >.exit 或者.quit

2。從http://sqlite.phxsoftware.com/ 下載Ado.net驅動。
   下載了安裝,在安裝目錄中存在System.Data.SQLite.dll
    咱們只須要拷貝這個文件到引用目錄,並添加引用便可對SQLite數據庫操做了
   全部的Ado.net對象都是以SQLite開頭的,好比SQLiteConnection
   鏈接串只須要以下方式
   Data Source=d:/test.db 或者DataSource=test.db--應用在和應用程序或者.net可以自動找到的目錄
   剩下的就很簡單了~~

3。SQL語法 
   因爲之前用SQLServer或者ISeries,因此DDL的語法很汗顏
   1)建立一個單個Primary Key的table
   CREATE TABLE  [Admin] (
 [UserName] [nvarchar] (20)   PRIMARY KEY NOT NULL ,
 [Password] [nvarchar] (50)   NOT NULL ,
 [Rank] [smallint] NOT NULL ,
 [MailServer] [nvarchar] (50)   NOT NULL ,
 [MailUser] [nvarchar] (50)   NOT NULL ,
 [MailPassword] [nvarchar] (50)   NOT NULL ,
 [Mail] [nvarchar] (50)   NOT NULL 
   ) ;
   2)建立一個多個Primary Key的table 
   CREATE TABLE  [CodeDetail] (
 [CdType] [nvarchar] (10)  NOT NULL ,
 [CdCode] [nvarchar] (20)  NOT NULL ,
 [CdString1] [ntext]   NOT NULL ,
 [CdString2] [ntext]   NOT NULL ,
 [CdString3] [ntext]   NOT NULL,
  PRIMARY KEY (CdType,CdCode)
         
   ) ;
   3)建立索引 
   CREATE  INDEX [IX_Account] ON  [Account]([IsCheck], [UserName]);
   
   還能夠視圖等等。
4.還有頗有用的SQL
  Select * from Sqlite_master 
  Select datetime('now')
  Select date('now')
  Select time('now')
 

SQLite 內建函數表

算術函數

abs(X)

返回給定數字表達式的絕對值。

max(X,Y[,...])

返回表達式的最大值。

min(X,Y[,...])

返回表達式的最小值。

random(*)

返回隨機數。

round(X[,Y])

返回數字表達式並四捨五入爲指定的長度或精度。

字符處理函數

length(X)

返回給定字符串表達式的字符個數。

lower(X)

將大寫字符數據轉換爲小寫字符數據後返回字符表達式。

upper(X)

返回將小寫字符數據轉換爲大寫的字符表達式。

substr(X,Y,Z)

返回表達式的一部分。

randstr()

 

quote(A)

 

like(A,B)

肯定給定的字符串是否與指定的模式匹配。

glob(A,B)

 

條件判斷函數

coalesce(X,Y[,...])

 

ifnull(X,Y)

 

nullif(X,Y)

 

集合函數

avg(X)

返回組中值的平均值。

count(X)

返回組中項目的數量。

max(X)

返回組中值的最大值。

min(X)

返回組中值的最小值。

sum(X)

返回表達式中全部值的和。

其餘函數

typeof(X)

返回數據的類型。

last_insert_rowid()

返回最後插入的數據的 ID 。

sqlite_version(*)

返回 SQLite 的版本。

change_count()

返回受上一語句影響的行數。

last_statement_change_count()

 


oh,還有就是看到有人說,好像成批插入的時候,啓動事務,比不啓動事務快n倍
還有就是儘可能使用參數化的SQL,估計和商用DB同樣可以自動Prepare.

===========

sqlite能夠在shell/dos command底下直接執行命令:

sqlite3 film.db "select * from film;"

輸出 HTML 表格: 

sqlite3 -html film.db "select * from film;"

將數據庫「倒出來」:

sqlite3 film.db ".dump" > output.sql

利用輸出的資料,創建一個如出一轍的數據庫(加上以上指令,就是標準的SQL數據庫備份了):

sqlite3 film.db < output.sql

在大量插入資料時,你可能會須要先打這個指令:

begin;

插入完資料後要記得打這個指令,資料纔會寫進數據庫中:

commit;

SQLITE深刻------常見問題

如何創建自動增加字段?

簡短回答:聲明爲 INTEGER PRIMARY KEY 的列將會自動增加 。

長一點的答案: 若是你聲明表的一列爲 INTEGER PRIMARY KEY,那麼, 每當你在該列上插入一NULL值時, NULL自動被轉換爲一個比該列中最大值大1的一個整數,若是表是空的, 將會是1。 (若是是最大可能的主鍵9223372036854775807,那個,將鍵值將是隨機未使用的數。) 如,有下列表:

CREATE TABLE t1(
a INTEGER PRIMARY KEY,
b INTEGER
);
在該表上,下列語句

INSERT INTO t1 VALUES(NULL,123);
在邏輯上等價於:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);
有一個新的API叫作 sqlite3_last_insert_rowid(), 它將返回最近插入的整數值。 注 意該整數會比表中該列上的插入以前的最大值大1。 該鍵值在當前的表中是惟一的。但有可能與已從表中刪除的值重疊。要想創建在整個表的生命週期中惟一的鍵值,須要在 INTEGER PRIMARY KEY 上增長AUTOINCREMENT聲明。那麼,新的鍵值將會比該表中曾能存在過的最大值大1。若是最大可能的整數值在數據表中曾經存在 過,INSERT將會失敗, 並返回SQLITE_FULL錯誤代碼。

多個應用程序或一個應用程序的多個實例能夠同時訪問同一個數據庫文件嗎?

多個進程可同時打開同一個數據庫。多個進程能夠同時進行SELECT 操做,但在任一時刻,只能有一個進程對數據庫進行更改。

SQLite使用讀、寫鎖控制對數據庫的訪問。(在Win95/98 /ME等不支持讀、寫鎖的系統下,使用一個機率性的模擬來代替。)但使用時要注意: 若是數據庫文件存放於一個NFS文件系統上,這種鎖機制可能不能正常工做。 這是由於fcntl() 文件鎖在不少NFS上沒有正確的實現。 在可能有多個進程同時訪問數據庫的時候,應該避免將數據庫文件放到NFS上。在Windows上,Microsoft的文檔中說:若是使用 FAT 文件 系統而沒有運行 share.exe 守護進程,那麼鎖多是不能正常使用的。那些在Windows上有不少經驗的人告訴我:對於網絡文件,文件鎖的實現 有好多Bug,是靠不住的。若是他們說的是對的,那麼在兩臺或多臺Windows機器間共享數據庫可能會引發不指望的問題。

咱們意識到,沒有其它嵌入式的 SQL 數據庫引擎能 象 SQLite 這樣處理如此多的併發。SQLite容許多個進程同時打開一個數據庫,同時讀一個數據庫。當有任何進程想要寫時,它必須在更新過程當中鎖 住數據庫文件。但那一般只是幾毫秒的時間。其它進程只需等待寫進程幹完活結束。典型地,其它嵌入式的SQL數據庫引擎同時只容許一個進程鏈接到數據庫。

可是,Client/Server數據庫引擎 (如 PostgreSQL, MySQL, 或 Oracle)一般支持更高級別的併發,而且容許多個進程同時寫同一個數據庫。這種機制在Client/Server結構的數據庫上是 可能的,由於老是有一個單一的服務器進程很好地控制、協調對數據庫的訪問。若是你的應用程序須要不少的併發,那麼你應該考慮使用一個 Client/Server 結構的數據庫。但經驗代表,不少應用程序須要的併發,每每比其設計者所想象的少得多。

當SQLite試圖訪問一個被其它進程鎖住的文件時,缺省的行爲是返回 SQLITE_BUSY。 能夠在C代碼中使用sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函數調整這一行爲。

在SQLite數據庫中如何列出全部的表和索引?

若是你運行 sqlite3 命令行來訪問你的數據庫,能夠鍵入 「.tables」來得到全部表的列表。或者,你能夠輸入「.schema」 來看整個數據庫模式,包括全部的表的索引。輸入這些命令,後面跟一個LIKE模式匹配能夠限制顯示的表。

在一個 C/C++ 程序中(或者腳本語言使用 Tcl/Ruby /Perl/Python 等) 你能夠在一個特殊的名叫 SQLITE_MASTER 上執行一個SELECT查詢以得到全部 表的索引。每個 SQLite 數據庫都有一個叫 SQLITE_MASTER 的表, 它定義數據庫的模式。 SQLITE_MASTER 表看起來以下:

CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
對於表來講,type 字段永遠是 'table',name 字段永遠是表的名字。因此,要得到數據庫中全部表的列表,使用下列SELECT語句:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
對 於索引,type 等於 'index', name 則是索引的名字,tbl_name 是該索引所屬的表的名字。無論是表仍是索引,sql字段是原先用 CREATE TABLE 或 CREATE INDEX 語句建立它們時的命令文本。對於自動建立的索引(用來實現 PRIMARY KEY 或 UNIQUE 約束),sql字段爲NULL。

SQLITE_MASTER 表是隻讀的。不能對它使用 UPDATE、INSERT 或 DELETE。 它會被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自動更新。

臨時表不會出如今 SQLITE_MASTER 表中。臨時表及其索引和 觸發器存放在另一個叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不 多,但它只是對於建立那些臨時表的應用可見。若是要得到全部表的列表, 無論是永久的仍是臨時的,可使用相似下面的命令:

SELECT name FROM 
   (SELECT * FROM sqlite_master UNION ALL
    SELECT * FROM sqlite_temp_master)
WHERE type='table'
ORDER BY name

在SQLite中,VARCHAR字段最長是多少?

SQLite 不強制 VARCHAR 的長度。 你能夠在 SQLITE 中聲明一個 VARCHAR(10),SQLite仍是能夠很高興地容許你放入500個字符。 而且這500個字符是原封不動的,它永遠不會被截斷。

SQLite支持二進制大對象嗎?

SQLite 3.0 及之後版本容許你在任何列中存儲 BLOB 數據。 即便該列被聲明爲其它類型也能夠。

在SQLite中,如何在一個表上添加或刪除一列?

SQLite 有有限地 ALTER TABLE 支持。你可使用它來在表的末尾增長一列,可更改表的名稱。 若是須要對錶結構作更復雜的改變,則必須從新建表。重建時能夠先將已存在的數據放到一個臨時表中,刪除原表, 建立新表,而後將數據從臨時表中複製回來。

如,假設有一個 t1 表,其中有 "a", "b", "c" 三列, 若是要刪除列 c ,如下過程描述如何作:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

在數據庫中刪除了不少數據,但數據庫文件沒有變小,是Bug嗎?

不是。當你從SQLite數據庫中刪除數據時, 未用的磁盤空間將會加入一個內部的「自由列表」中。 當你下次插入數據時,這部分空間能夠重用。磁盤空間不會丟失,但也不會返還給操做系統。

若是刪除了大量數據,而又想縮小數據庫文件佔用的空間,執 行 VACUUM 命令。 VACUUM 將會從頭從新組織數據庫。這將會使用數據庫有一個空的「自由鏈表」, 數據庫文件也會最小。但要注意的是,VACUUM 的執行會須要一些時間(在SQLite開發時,在Linux上,大約每M字節須要半秒種),而且, 執行過程當中須要原數據庫文件至多兩倍的臨時磁盤空間。

對於 SQLite 3.1版本,一個 auto-vacumm 模式能夠替代 VACUUM 命令。 可使用 auto_vacuum pragma 打開。

SQLITE_SCHEMA error是什麼錯誤?爲何會出現該錯誤?

當一個準備好的(prepared)SQL語句再也不有效或者沒法執行時, 將返回一個 SQLITE_SCHEMA 錯誤。發生該錯誤時,SQL語句必須使用 sqlite3_prepare() API來從新編譯. 在 SQLite 3 中, 一個 SQLITE_SCHEMA 錯誤只會發生在用 sqlite3_prepare()/sqlite3_step() /sqlite3_finalize() API 執行 SQL 時。而不會發生在使用sqlite3_exec()時。 在版本2中不是這樣。

準備好的語句失效的最一般緣由是:在語句準備好後, 數據庫的模式又被修改了。另外的緣由會發生在:

數據庫離線:DETACHed. 
數據庫被 VACUUMed 
一個用戶存儲過程定義被刪除或改變。 
一個 collation 序列定義被刪除或改變。 
認證函數被改變。 
在 全部狀況下,解決方法是從新編譯並執行該SQL語句。 由於一個已準備好的語句能夠因爲其它進程改變數據庫模式而失效,全部使用 sqlite3_prepare()/sqlite3_step() /sqlite3_finalize() API 的代碼都應準備處理 SQLITE_SCHEMA錯誤。下面給出一個例子:


    int rc;
    sqlite3_stmt *pStmt;
    char zSql[] = "SELECT .....";

    do {
      /* Compile the statement from SQL. Assume success. */
      sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);

      while( SQLITE_ROW==sqlite3_step(pStmt) ){
        /* Do something with the row of available data */
      }

      /* Finalize the statement. If an SQLITE_SCHEMA error has
      ** occured, then the above call to sqlite3_step() will have
      ** returned SQLITE_ERROR. sqlite3_finalize() will return
      ** SQLITE_SCHEMA. In this case the loop will execute again.
      */
      rc = sqlite3_finalize(pStmt);
    } while( rc==SQLITE_SCHEMA );

 

如何在字符串中使用單引號(')?

SQL 標準規定,在字符串中,單引號須要使用逃逸字符,即在一行中使用兩個單引號。在這方面 SQL 用起來相似Pascal 語言。 SQLite 尊循標準。如:

    INSERT INTO xyz VALUES('5 O''clock');


Sqlite中如何返回本地化當前時間?
在 作ClinicOS的時候遇到一個問題,在保存病歷登記時間時,我使用了「CURRENT_TIMESTAMP」,但這有個問題,它返回的是UTC Time,這對咱們中國人沒啥用,一直但願能想辦法將它轉爲localtime。今天恰好有空,因此去查了查Sqlite的Mail List,果真也有人遇到了這個問題,我從一篇名爲《translate time comparison statement》(http://www.mail-archive.com/sqlite-users@sqlite.org /msg12350.html)中看到這樣的回覆:

二十.如何更新表中數據

update contact set lastname=’江南七怪’where id = 1028

 

update contact set lastname='江南七怪', mobile='13912345678' where id=1028;

二十一.如何一次插入多個數據

Insert into SAMPLE(PRJNUM, PRJNAME, EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE)
values(100001, 'TPMS', 200001, 'Johnson', 'A', 2000), (100001, 'TPMS', 200002,
'Christine', 'B', 3000), (100001, 'TPMS', 200003, 'Kevin', 'C', 4000), (100002,
'TCT', 200001, 'Johnson', 'A', 2000), (100002, 'TCT', 200004, 'Apple', 'B',
3000);
相關文章
相關標籤/搜索