sqlite3 命令行简易教程
SQLite庫(kù)包含一個(gè)名字叫做sqlite3的命令行,它可以讓用戶(hù)手工輸入并執(zhí)行面向SQLite數(shù)據(jù)庫(kù)的SQL命令。本文檔提供一個(gè)樣使用sqlite3的簡(jiǎn)要說(shuō)明。
開(kāi)始
????? 啟動(dòng)sqlite3程序,僅僅需要敲入帶有SQLite數(shù)據(jù)庫(kù)名字的"sqlite3"命令即可。如果文件不存在,則創(chuàng)建一個(gè)新的(數(shù)據(jù)庫(kù))文件。然后sqlite3程序?qū)⑻崾灸爿斎隨QL。敲入SQL語(yǔ)句(以分號(hào)“;”結(jié)束),敲回車(chē)鍵之后,SQL語(yǔ)句就會(huì)執(zhí)行。
??????? 例如,創(chuàng)建一個(gè)包含一個(gè)表"tb11"名字為"ex1"的SQLite數(shù)據(jù)庫(kù),你可以這樣做:
$sqlite3 ex1
SQLite version 3.3.17
Enter ".help" for instructions
sqlite> create table tbl1(one varchar(10), two smallint);
sqlite> insert into tbl1 values('hello!', 10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>
??????? 你可以通過(guò)敲你所用系統(tǒng)的文件結(jié)束符(通常是Ctrl + D)或者中斷字符(通常是Ctrl + C)。來(lái)終止sqlite3程序。確定你在每個(gè)SQL語(yǔ)句結(jié)束敲入分號(hào)!sqlite3程序通過(guò)查找分號(hào)來(lái)決定一個(gè)SQL語(yǔ)句的結(jié)束。如果你省略分號(hào),sqlite3將給你一個(gè)連續(xù)的命令提示符并等你給當(dāng)前的SQL命令添加更多的文字。這個(gè)特點(diǎn)讓你輸入多行的多個(gè)SQL語(yǔ)句,例如:
sqlite> create table tbl2(
?? ...> f1 varchar(30) primary key,
?? ...> f2 text,
?? ...> f3 real
?? ...> );
sqlite>
題外話(huà):查詢(xún)SQLITE_MASTER表
??? SQLite數(shù)據(jù)庫(kù)的框架被保存在一個(gè)名叫"sqlite_master"的特殊的表中。你可以像查詢(xún)其它表一樣通過(guò)執(zhí)行“SELECT”查詢(xún)這個(gè)特殊的表。例如:
$?sqlite3?ex1
SQlite?vresion?3.3.10
Enter?".help"?for?instructions
sqlite>?select?*?from?sqlite_master;
????type?=?table
????name?=?tbl1
tbl_name?=?tbl1
rootpage?=?3
?????sql?=?create?table?tbl1(one?varchar(10),?two?smallint)
sqlite>
??? 但你不能在sqlite_master表中執(zhí)行諸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你創(chuàng)建、刪除和索引數(shù)據(jù)庫(kù)時(shí)自動(dòng)更新這個(gè)表。你不能手工更改sqlite_master表。
??? TEMPORARY表的結(jié)構(gòu)沒(méi)有存儲(chǔ)在"sqlite_master"表中,由于TEMPORARY表對(duì)應(yīng)用是不可見(jiàn)的,而不是應(yīng)用程序創(chuàng)建這個(gè)表。TEMPORARY表結(jié)構(gòu)被存儲(chǔ)在另外一個(gè)名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨時(shí)表自身。
sqlite3的特殊命令
?? 大多數(shù)候,sqlite3讀入輸入行,并把它們傳遞到SQLite庫(kù)中去運(yùn)行。但是如果輸入行以一個(gè)點(diǎn)(“.”)開(kāi)始,那么這行將被sqlite3程序自己截取并解釋。這些“點(diǎn)命令”通常被用來(lái)改變查詢(xún)輸出的格式,或者執(zhí)行鞭個(gè)預(yù)封包(預(yù)定義prepackaged)的查詢(xún)語(yǔ)句。
你可以在任何時(shí)候輸入“.help”,列出可用的點(diǎn)命令。例如
sqlite>?.help
.bail?ON|OFF???????????Stop?after?hitting?an?error.??Default?OFF
.databases?????????????List?names?and?files?of?attached?databases
.dump??TABLE??...??????Dump?the?database?in?an?SQL?text?format
.echo?ON|OFF???????????Turn?command?echo?on?or?off
.exit??????????????????Exit?this?program
.explain?ON|OFF????????Turn?output?mode?suitable?for?EXPLAIN?on?or?off.
.header(s)?ON|OFF??????Turn?display?of?headers?on?or?off
.help??????????????????Show?this?message
.import?FILE?TABLE?????Import?data?from?FILE?into?TABLE
.indices?TABLE?????????Show?names?of?all?indices?on?TABLE
.load?FILE??ENTRY??????Load?an?extension?library
.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
.nullvalue?STRING??????Print?STRING?in?place?of?NULL?values
.output?FILENAME???????Send?output?to?FILENAME
.output?stdout?????????Send?output?to?the?screen
.prompt?MAIN?CONTINUE??Replace?the?standard?prompts
.quit??????????????????Exit?this?program
.read?FILENAME?????????Execute?SQL?in?FILENAME
.schema??TABLE?????????Show?the?CREATE?statements
.separator?STRING??????Change?separator?used?by?output?mode?and?.import
.show??????????????????Show?the?current?values?for?various?settings
.tables??PATTERN???????List?names?of?tables?matching?a?LIKE?pattern
.timeout?MS????????????Try?opening?locked?tables?for?MS?milliseconds
.width?NUM?NUM?...?????Set?column?widths?for?"column"?mode
sqlite>
改變輸出格式
??? sqlite3程序可以以八種不同的格式顯示一個(gè)查詢(xún)的結(jié)果:"csv", "列", "html", "插入", "行", "制表"和"tcl"。你可以用".mode"點(diǎn)命令在這些輸出格式之間切換。
??? 默認(rèn)的輸出格式是“列表”。在列表模式下,每條查詢(xún)結(jié)果記錄被寫(xiě)在一行中并且每列之間以一個(gè)字符串分割符隔開(kāi)。默認(rèn)的分隔符是一個(gè)管道符號(hào)(“|”)。列表符號(hào)在當(dāng)你輸出查詢(xún)結(jié)果到另外一個(gè)符加處理的程序(如AWK)中去是尤為有用。
sqlite>?.mode?list
sqlite>?select?*?from?tbl1;
hello|10
goodbye|20
sqlite>
??? 你可以用“.separator”點(diǎn)命令來(lái)改變分界符。例如,為了把分割符改為一個(gè)逗號(hào)和一個(gè)空格,你可以這樣做:
sqlite>?.separator?",?"
sqlite>?select?*?from?tbl1;
hello,?10
goodbye,?20
sqlite>
??? 在“l(fā)ine"模式下,每一個(gè)位于條記錄中的列在它自己那行顯示。每行由列名、一個(gè)等號(hào)和列數(shù)據(jù)組成。下一條記錄以一個(gè)空行隔開(kāi)。這是一個(gè)行模式輸出的例子:
sqlite>?.mode?line
sqlite>?select?*?from?tbl1;
one?=?hello
two?=?10
one?=?goodbye
two?=?20
sqlite>
??? 在列模式下,每條記錄在一個(gè)單獨(dú)的行中以數(shù)據(jù)列對(duì)齊的方式顯示。列如:
sqlite>?.mode?column
sqlite>?select?*?from?tbl1;
one?????????two???????
----------??----------
hello???????10????????
goodbye?????20????????
sqlite>
??????? 在默認(rèn)的情況下,每列至少10個(gè)字符寬。太寬的數(shù)據(jù)將被截取。你可以用“.width”命令來(lái)調(diào)整列寬。如下所示:
?
sqlite>?.width?12?6
sqlite>?select?*?from?tbl1;
one???????????two???
------------??------
hello?????????10????
goodbye???????20????
sqlite>
?
????上面例子中".width"命令設(shè)置第一列寬為12第二列寬為6。其它的列寬不變。你可以指定與你查詢(xún)結(jié)果需要的列數(shù)一樣多的“.width”參數(shù)。
??? 如果你指定一列寬為0,那么這個(gè)列寬將自動(dòng)以下面三個(gè)數(shù)字中的最大值做為列寬:10、表頭寬度和最寬的數(shù)據(jù)列的寬度。這可以讓列自動(dòng)調(diào)整寬度。每列的默認(rèn)設(shè)置為自動(dòng)調(diào)整的0值。
??? 出現(xiàn)在輸出開(kāi)頭兩行的列標(biāo)示可以用".header"點(diǎn)命令關(guān)閉。在上面的例子中,列標(biāo)示是打開(kāi)的。可以用下面的方法關(guān)閉列標(biāo)示:
?
sqlite>?.header?off
sqlite>?select?*?from?tbl1;
hello?????????10????
goodbye???????20????
sqlite>
?
??? 另外一個(gè)有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來(lái)像SQL INSERT語(yǔ)句的樣式。你可以用插入模式來(lái)產(chǎn)生文件(便于)以后用于不同數(shù)據(jù)庫(kù)的輸入。
??? 當(dāng)指定插入模式時(shí),你必須給定一個(gè)特定參數(shù)就是要插入的表名。例如:
?
sqlite>?.mode?insert?new_table
sqlite>?select?*?from?tbl1;
INSERT?INTO?'new_table'?VALUES('hello',10);
INSERT?INTO?'new_table'?VALUES('goodbye',20);
sqlite>
?
??? 最新的輸出格式是“html”。在這種模式下,sqlite3把查詢(xún)的結(jié)果寫(xiě)做XHTML表。開(kāi)始的<TABLE>和結(jié)束的</TABLE>(標(biāo)記)沒(méi)有寫(xiě)出,但有<TR>、<TH>和<TD>等分界符。html輸出對(duì)CGI來(lái)說(shuō)是相當(dāng)有用地。
把結(jié)果寫(xiě)到文件中
??? 默認(rèn)情況下,sqlte3把結(jié)送到標(biāo)準(zhǔn)輸出。你可以用“.output”命令改變它。只須把輸出文件名做為.output命令的輸出參數(shù)然后所有后續(xù)查詢(xún)結(jié)果將被寫(xiě)到那個(gè)文件中。用“.output stdout”再一次改為標(biāo)準(zhǔn)輸出。例如:
?
sqlite>?.mode?list
sqlite>?.separator?|
sqlite>?.output?test_file_1.txt
sqlite>?select?*?from?tbl1;
sqlite>?.exit
$?cat?test_file_1.txt
hello|10
goodbye|20
$
?
查詢(xún)數(shù)據(jù)庫(kù)結(jié)構(gòu)
????sqlite3程序提供幾個(gè)有用的用于查詢(xún)數(shù)據(jù)庫(kù)結(jié)構(gòu)的快捷命令。這些不是不可以用別的方式來(lái)實(shí)現(xiàn)。這些命令僅僅是一個(gè)快捷方式而已。
??? 例如,為了查看數(shù)據(jù)庫(kù)的表列表,你可以敲入“.tables”。
?
sqlite>?.tables
tbl1
tbl2
sqlite>
?
??? “.tables”命令相似于設(shè)置列表模式然后執(zhí)行接下來(lái)的查詢(xún):
?
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN ('table','view') ORDER BY 1
?
事實(shí)上,你可以查看sqlite3的源代碼(可以在源文件樹(shù)的src/shell.c中),你可找到上面的具體的查詢(xún)。
“.indices”命令作用類(lèi)似的方式是列出特定表的所有的索引。“.indics”命令須一個(gè)參數(shù)即所要索引表的表名。最后,但不是至少,是“.schema”命令。不帶任何參數(shù),“.schema”命令顯示原始的用于創(chuàng)建當(dāng)前數(shù)據(jù)庫(kù)的CREATE TABLE和CREATE INDEX語(yǔ)句。如果你給".schema"命令一個(gè)表名,它顯示原始的創(chuàng)建該表和它所有索引的CREATE語(yǔ)句。我們可以:
?
sqlite>?.schema
create?table?tbl1(one?varchar(10),?two?smallint)
CREATE?TABLE?tbl2?(
??f1?varchar(30)?primary?key,
??f2?text,
??f3?real
)
sqlite>?.schema?tbl2
CREATE?TABLE?tbl2?(
??f1?varchar(30)?primary?key,
??f2?text,
??f3?real
)
sqlite>
?
".schema"命令可以用設(shè)置列表然后執(zhí)行以下查詢(xún)來(lái)實(shí)現(xiàn):
?
?
SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type!='meta'ORDER BY tbl_name, type DESC, name
?
?
或者,如果你給".schema"命令一個(gè)參數(shù),由于你只想得到一個(gè)表的結(jié)構(gòu),查詢(xún)可以是這樣:
?
SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'ORDER BY substr(type,2,1), name
?
你可以擔(dān)供一個(gè)參數(shù)給.schema命令。如果這橛,查詢(xún)可以是這樣的:
?
SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE tbl_name LIKE '%s' AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'ORDER BY substr(type,2,1), name
?
在查詢(xún)中“%S“為你的參數(shù)所取代。這使你可以詢(xún)數(shù)據(jù)庫(kù)結(jié)構(gòu)的某個(gè)子集。
?
sqlite>?.schema?%abc%
?
與這些一起,“.table”命令也接受一個(gè)模式作為他的參數(shù)。如果你給“.table”一個(gè)參數(shù),“%”將被前后擴(kuò)展并且一個(gè)LIKE子句被附加到查詢(xún)上。這讓你可以列出只與特定模式相匹配的的表。
“.datebasae”命令顯示所有當(dāng)前連接打開(kāi)的數(shù)據(jù)庫(kù)的一個(gè)列表。將允許一次到少兩個(gè)。第一個(gè)是“main”,最初打開(kāi)的那個(gè)數(shù)據(jù)庫(kù)。第二個(gè)是"temp",用于臨時(shí)表的數(shù)據(jù)庫(kù)。對(duì)于用ATTACH語(yǔ)句附加的數(shù)據(jù)也許有附加數(shù)據(jù)庫(kù)列表。輸出的第一列與之相聯(lián)的數(shù)據(jù)庫(kù)名,第二列是外部文件名。
?
sqlite>?.databases
?
將整個(gè)數(shù)據(jù)庫(kù)轉(zhuǎn)換為ASCII文本文件
".dump"命令成一個(gè)單一的ASCII文本文件。這個(gè)文件可以被用作管道傳遞給sqlite3命令來(lái)轉(zhuǎn)換回?cái)?shù)據(jù)庫(kù)。
一個(gè)最好的制作一個(gè)數(shù)據(jù)庫(kù)檔案拷貝的命令是:
?
$?echo?'.dump'?|?sqlite3?ex1?|?gzip?-c?>ex1.dump.gz
?
它產(chǎn)生一個(gè)一個(gè)名為ex1.dump.gz的文件,它包含了你以后或在其它機(jī)器上重構(gòu)數(shù)據(jù)庫(kù)的所有的信息。要重構(gòu)數(shù)據(jù)庫(kù),只須敲入:
?
$?zcat?ex1.dump.gz?|?sqlite3?ex2
?
這個(gè)文本格式是純粹的SQL語(yǔ)句所以你可以用.dump命令來(lái)導(dǎo)出一個(gè)SQLite數(shù)據(jù)庫(kù)到另一個(gè)常用的SQL數(shù)據(jù)庫(kù)引擎。比如:
?
$?createdb?ex2
$?sqlite3?ex1?.dump?|?psql?ex2
?
其它的點(diǎn)命令
".explain"命令可以被用來(lái)設(shè)置輸出格式為“column”?并設(shè)置列寬為EXPLAIN命令看起來(lái)比較合理的寬度。EXPLAIN命令是SQLite特有的SQL擴(kuò)展,它是對(duì)調(diào)試有用。如果任何常規(guī)的SQL被EXPLAIN執(zhí)行,那么SQL命令被分解并分析但并不執(zhí)行。取而代之的是,虛擬機(jī)指令序列將被用于執(zhí)行SQL命令并返回一個(gè)類(lèi)似的查詢(xún)結(jié)果。如:
?
?
sqlite>?.explain
sqlite>?explain?delete?from?tbl1?where?two<20;
addr??opcode????????p1?????p2?????p3??????????
----??------------??-----??-----??-------------------------------------???
0?????ListOpen??????0??????0??????????????????
1?????Open??????????0??????1??????tbl1????????
2?????Next??????????0??????9??????????????????
3?????Field?????????0??????1??????????????????
4?????Integer???????20?????0??????????????????
5?????Ge????????????0??????2??????????????????
6?????Key???????????0??????0??????????????????
7?????ListWrite?????0??????0??????????????????
8?????Goto??????????0??????2??????????????????
9?????Noop??????????0??????0??????????????????
10????ListRewind????0??????0??????????????????
11????ListRead??????0??????14?????????????????
12????Delete????????0??????0??????????????????
13????Goto??????????0??????11?????????????????
14????ListClose?????0??????0
?
“.timeout”命令設(shè)置sqlite3等待一個(gè)試圖存儲(chǔ)文件鎖定請(qǐng)除直到錯(cuò)誤返回的總時(shí)間。默認(rèn)的超時(shí)值是0因此如果任何需要的數(shù)據(jù)庫(kù)表或序列列被鎖定時(shí)它將立即返回一個(gè)錯(cuò)誤。
最后,我們提到“.exit”命令它交導(dǎo)致sqlite3退出。
在命令和腳本中使用sqlite3
一個(gè)在腳本命令中使用sqlite3的方式是用“echo”或“cat”來(lái)產(chǎn)生一個(gè)命令序列在一個(gè)文件中,然后當(dāng)從一個(gè)產(chǎn)生的命令行中重定向輸入時(shí)調(diào)用sqlite3。它有用并且適應(yīng)許多環(huán)境。但作為一附加的便利是,sqlite3允許一個(gè)單一的SQL語(yǔ)句在命令行中作為數(shù)據(jù)庫(kù)名后的第二個(gè)參數(shù)輸入。當(dāng)sqlite3程序帶著兩個(gè)參數(shù)啟動(dòng)時(shí),第二個(gè)參數(shù)被傳遞給SQLite庫(kù)處理,查詢(xún)以列表模式打印到標(biāo)準(zhǔn)輸出,然后程序退出。這個(gè)機(jī)制被設(shè)計(jì)用于讓sqlite3容易于用于連接諸如"AWK"的程序。例如:
?
$?sqlite3?ex1?'select?*?from?tbl1'?|
>??awk?'{printf?"<tr><td>%s<td>%s/n",$1,$2?}'
<tr><td>hello<td>10
<tr><td>goodbye<td>20
$
?
結(jié)束命令行命令
SQLite命令通常以一個(gè)分號(hào)結(jié)束。在一個(gè)命令行中你也可以用“GO”單詞(大小寫(xiě)敏感)或者一個(gè)“/”斜線在它所在好行結(jié)束一個(gè)命令。這常被SQL Server和Oracle使用。這些將不在sqlite3_exec()中有用,因?yàn)槊钚性趥鬟f它們到函數(shù)之前把這些翻譯為分號(hào)。
從源文件中編譯sqlite3
sqlite3程序當(dāng)你編譯SQLite庫(kù)時(shí)自動(dòng)被建立。只須取得一個(gè)源文件樹(shù)的拷貝,運(yùn)行“configure"然后"make"即可。
轉(zhuǎn)自:http://flywindwyy.blog.163.com/blog/static/1725508532010928113417337/
總結(jié)
以上是生活随笔為你收集整理的sqlite3 命令行简易教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux进程状态解析
- 下一篇: sql server 2008 远程连接