建立数据库档案
用sqlite3建立数据库的方法很简单,只要在shell下键入(以下$符号为shell提示号,请勿键入):
$sqlite3foo.db
如果目录下没有foo.db,sqlite3就会建立这个数据库。sqlite3并没有强制数据库档名要怎么取,如果你喜欢,也可以取个foo.icannameitwhateverilike的档名。
在sqlite3提示列下操作
sqliteversion3.1.3Enter".help"forinstructionssqlite>这时如果使用.help可以取得求助,.quit则是离开(请注意:不是quit)
sql的指令格式
所以的sql指令都是以分号(;)结尾的。如果遇到两个减号(--)则代表注解,sqlite3会略过去。
建立资料表
假设我们要建一个名叫film的资料表,只要键入以下指令就可以了:
createtablefilm(title,length,year,starring);这样我们就建立了一个名叫film的资料表,里面有name、length、year、starring四个字段。
这个createtable指令的语法为:
createtabletable_name(field1,field2,field3,...);table_name是资料表的名称,fieldx则是字段的名字。sqlite3与许多sql数据库软件不同的是,它不在乎字段属于哪一种资料型态:sqlite3的字段可以储存任何东西:文字、数字、大量文字(blub),它会在适时自动转换。
建立索引
如果资料表有相当多的资料,我们便会建立索引来加快速度。好比说:
createindexfilm_title_indexonfilm(title);意思是针对film资料表的name字段,建立一个名叫film_name_index的索引。这个指令的语法为
createindexindex_nameontable_name(field_to_be_indexed);一旦建立了索引,sqlite3会在针对该字段作查询时,自动使用该索引。这一切的操作都是在幕后自动发生的,无须使用者特别指令。
加入一笔资料
接下来我们要加入资料了,加入的方法为使用insertinto指令,语法为:
insertintotable_namevalues(data1,data2,data3,70)">例如我们可以加入
insertintofilmvalues('SilenceoftheLambs,The',118,1991,'JodieFoster');insertintofilmvalues('Contact',153,1997,70)">insertintofilmvalues('CrouchingTiger,HiddenDragon',120,2000,'Yun-FatChow');insertintofilmvalues('Hours,114,2002,'NicoleKidman');如果该字段没有资料,我们可以填NULL。
查询资料
讲到这里,我们终于要开始介绍sql最强大的select指令了。我们首先简单介绍select的基本句型:
selectcolumnsfromtable_namewhereexpression;最常见的用法,当然是倒出所有数据库的内容:
select*fromfilm;如果资料太多了,我们或许会想限制笔数:
select*fromfilmlimit10;或是照着电影年份来排列:
select*fromfilmorderbyyearlimit10;或是年份比较近的电影先列出来:
select*fromfilmorderbyyeardesclimit10;或是我们只想看电影名称跟年份:
selecttitle,yearfromfilmorderbyyeardesclimit10;查所有茱蒂佛斯特演过的电影:
select*fromfilmwherestarring='JodieFoster';查所有演员名字开头叫茱蒂的电影('%'符号便是sql的万用字符):
select*fromfilmwherestarringlike'Jodie%';查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔,只列出电影名称和年份:
有时候我们只想知道数据库一共有多少笔资料:
selectcount(*)fromfilm;有时候我们只想知道1985年以后的电影有几部:
selectcount(*)fromfilmwhereyear>=1985;(进一步的各种组合,要去看sql专书,不过你大概已经知道sql为什么这么流行了:这种语言允许你将各种查询条件组合在一起──而我们还没提到「跨数据库的联合查询」呢!)
如何更改或删除资料
了解select的用法非常重要,因为要在sqlite更改或删除一笔资料,也是靠同样的语法。
例如有一笔资料的名字打错了:
updatefilmsetstarring='JodieFoster'wherestarring='JodeeFoster';就会把主角字段里,被打成'JodeeFoster'的那笔(或多笔)资料,改回成JodieFoster。
deletefromfilmwhereyear<1970;就会删除所有年代早于1970年(不含)的电影了。
其他sqlite的特别用法
sqlite可以在shell底下直接执行命令:
sqlite3film.db"select*fromfilm;"输出HTML表格:
sqlite3-htmlfilm.db"select*fromfilm;"将数据库「倒出来」:
sqlite3film.db".dump">output.sql利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的sql数据库备份了):
sqlite3film.db<output.sql在大量插入资料时,你可能会需要先打这个指令:
begin;插入完资料后要记得打这个指令,资料才会写进数据库中:
commit;
小结
以上我们介绍了sqlite这套数据库系统的用法。事实上OSX也有诸于sqliteManagerX这类的图形接口程序,可以便利数据库的操作。不过万变不离其宗,了解sql指令操作,sqlite与其各家变种就很容易上手了。
至于为什么要写这篇教学呢?除了因为OSXTiger大量使用sqlite之外(例如:Safari的RSSreader,就是把文章存在sqlite数据库里!你可以开开看~/Library/Syndication/Database3这个档案,看看里面有什么料),OpenVanilla从0.7.2开始,也引进了以sqlite为基础的词汇管理工具,以及全字库的注音输入法。因为使用sqlite,这两个模块不管数据库内有多少笔资料,都可以做到「瞬间启动」以及相当快速的查询回应。
将一套方便好用的数据库软件包进OSX中,当然也算是Apple相当相当聪明的选择。再勤劳一点的朋友也许已经开始想拿sqlite来记录各种东西(像我们其中就有一人写了个程序,自动记录电池状态,写进sqlite数据库中再做统计......)了。想像空间可说相当宽广。
目前支援sqlite的程序语言,你能想到的大概都有了。这套数据库2005年还赢得了美国O'ReillyOpenSourceConference的最佳开放源代码软件奖,奖评是「有什么东西能让Perl,Python,PHP,Ruby语言团结一致地支援的?就是sqlite」。由此可见sqlite的地位了。而sqlite程序非常小,更是少数打"gcc-osqlite3*",不需任何特殊设定就能跨平台编译的程序。小而省,小而美,sqlite连网站都不多赘言,直指sql语法精要及API使用方法,原作者大概也可以算是某种程序设计之道(TaoofProgramming)里所说的至人了。
sqlite3的特殊命令
大多数候,sqlite3读入输入行,并把它们传递到sqlite库中去运行。但是如果输入行以一个点(“.”)开始,那么这行将被sqlite3程序自己截取并解释。这些“点命令”通常被用来改变查询输出的格式,或者执行鞭个预封包(预定义prepackaged)的查询语句。
你可以在任何时候输入“.help”,列出可用的点命令。例如
sqlite>.help
.bailON|OFFStopafterhittinganerror.DefaultOFF
.databasesListnamesandfilesofattacheddatabases
.dump?TABLE?...Dumpthedatabaseinansqltextformat
.echoON|OFFTurncommandechoonoroff
.exitExitthisprogram
.explainON|OFFTurnoutputmodesuitableforEXPLAINonoroff.
.header(s)ON|OFFTurndisplayofheadersonoroff
.helpShowthismessage
.importFILETABLEImportdatafromFILEintoTABLE
.indicesTABLEShownamesofallindicesonTABLE
.loadFILE?ENTRY?Loadanextensionlibrary
.modeMODE?TABLE?SetoutputmodewhereMODEisoneof:
csvComma-separatedvalues
columnLeft-alignedcolumns.(See.width)
htmlHTML<table>code
insertsqlinsertstatementsforTABLE
lineOnevalueperline
listValuesdelimitedby.separatorstring
tabsTab-separatedvalues
tclTCLlistelements
.nullvalueSTRINGPrintSTRINGinplaceofNULLvalues
.outputFILENAMESendoutputtoFILENAME
.outputstdoutSendoutputtothescreen
.promptMAINCONTINUEReplacethestandardprompts
.quitExitthisprogram
.readFILENAMEExecutesqlinFILENAME
.schema?TABLE?ShowtheCREATEstatements
.separatorSTRINGChangeseparatorusedbyoutputmodeand.import
.showShowthecurrentvaluesforvarIoUssettings
.tables?PATTERN?ListnamesoftablesmatchingaLIKEpattern
.timeoutMSTryopeninglockedtablesforMSmilliseconds
.widthNUMNUM...Setcolumnwidthsfor"column"mode
sqlite>
改变输出格式
sqlite3程序可以以八种不同的格式显示一个查询的结果:"csv","列","html","插入","行","制表"和"tcl"。你可以用".mode"点命令在这些输出格式之间切换。
默认的输出格式是“列表”。在列表模式下,每条查询结果记录被写在一行中并且每列之间以一个字符串分割符隔开。默认的分隔符是一个管道符号(“|”)。列表符号在当你输出查询结果到另外一个符加处理的程序(如AWK)中去是尤为有用。
sqlite>.modelist
sqlite>select*fromtbl1;
hello|10
goodbye|20
sqlite>
你可以用“.separator”点命令来改变分界符。例如,为了把分割符改为一个逗号和一个空格,你可以这样做:
sqlite>.separator","
sqlite>select*fromtbl1;
hello,10
goodbye,20
sqlite>
在“line"模式下,每一个位于条记录中的列在它自己那行显示。每行由列名、一个等号和列数据组成。下一条记录以一个空行隔开。这是一个行模式输出的例子:
sqlite>.modeline
sqlite>select*fromtbl1;
one=hello
two=10
one=goodbye
two=20
sqlite>
在列模式下,每条记录在一个单独的行中以数据列对齐的方式显示。列如:
sqlite>.modecolumn
sqlite>select*fromtbl1;
onetwo
--------------------
hello10
goodbye20
sqlite>
在默认的情况下,每列至少10个字符宽。太宽的数据将被截取。你可以用“.width”命令来调整列宽。如下所示:
sqlite>.width126
sqlite>select*fromtbl1;
onetwo
------------------
hello10
goodbye20
sqlite>
上面例子中".width"命令设置第一列宽为12第二列宽为6。其它的列宽不变。你可以指定与你查询结果需要的列数一样多的“.width”参数。
如果你指定一列宽为0,那么这个列宽将自动以下面三个数字中的最大值做为列宽:10、表头宽度和最宽的数据列的宽度。这可以让列自动调整宽度。每列的默认设置为自动调整的0值。
出现在输出开头两行的列标示可以用".header"点命令关闭。在上面的例子中,列标示是打开的。可以用下面的方法关闭列标示:
sqlite>.headeroff
sqlite>select*fromtbl1;
hello10
goodbye20
sqlite>
另外一个有用的输出模式是"insert"。在插入模式下,被子格式化为看起来像sqlINSERT语句的样式。你可以用插入模式来产生文件(便于)以后用于不同数据库的输入。
当指定插入模式时,你必须给定一个特定参数就是要插入的表名。例如:
sqlite>.modeinsertnew_table
sqlite>select*fromtbl1;
INSERTINTO'new_table'VALUES('hello',10);
INSERTINTO'new_table'VALUES('goodbye',20);
sqlite>
最新的输出格式是“html”。在这种模式下,sqlite3把查询的结果写做XHTML表。开始的<TABLE>和结束的</TABLE>(标记)没有写出,但有<TR>、<TH>和<TD>等分界符。html输出对CGI来说是相当有用地。
把结果写到文件中
默认情况下,sqlte3把结送到标准输出。你可以用“.output”命令改变它。只须把输出文件名做为.output命令的输出参数然后所有后续查询结果将被写到那个文件中。用“.outputstdout”再一次改为标准输出。例如:
sqlite>.modelist
sqlite>.separator|
sqlite>.outputtest_file_1.txt
sqlite>select*fromtbl1;
sqlite>.exit
$cattest_file_1.txt
hello|10
goodbye|20
$
sqlite3程序提供几个有用的用于查询数据库结构的快捷命令。这些不是不可以用别的方式来实现。这些命令仅仅是一个快捷方式而已。
例如,为了查看数据库的表列表,你可以敲入“.tables”。
sqlite>.tables
tbl1
tbl2
sqlite>
“.tables”命令相似于设置列表模式然后执行接下来的查询:
SELECTnameFROMsqlite_masterWHEREtypeIN('table','view')ANDnameNOTLIKE'sqlite_%'UNIONALLSELECTnameFROMsqlite_temp_masterWHEREtypeIN('table','view')ORDERBY1
事实上,你可以查看sqlite3的源代码(可以在源文件树的src/shell.c中),你可找到上面的具体的查询。
“.indices”命令作用类似的方式是列出特定表的所有的索引。“.indics”命令须一个参数即所要索引表的表名。最后,但不是至少,是“.schema”命令。不带任何参数,“.schema”命令显示原始的用于创建当前数据库的CREATETABLE和CREATEINDEX语句。如果你给".schema"命令一个表名,它显示原始的创建该表和它所有索引的CREATE语句。我们可以:
sqlite>.schema
createtabletbl1(onevarchar(10),twosmallint)
CREATETABLEtbl2(
f1varchar(30)primarykey,
f2text,
f3real
)
sqlite>.schematbl2
CREATETABLEtbl2(
f1varchar(30)primarykey,
f3real
)
sqlite>
".schema"命令可以用设置列表然后执行以下查询来实现:
SELECTsqlFROM(SELECT*FROMsqlite_masterUNIONALLSELECT*FROMsqlite_temp_master)WHEREtype!='Meta'ORDERBYtbl_name,typeDESC,name
或者,如果你给".schema"命令一个参数,由于你只想得到一个表的结构,查询可以是这样:
SELECTsqlFROM(SELECT*FROMsqlite_masterUNIONALLSELECT*FROMsqlite_temp_master)WHEREtype!='Meta'ANDsqlNOTNULLANDnameNOTLIKE'sqlite_%'ORDERBYsubstr(type,2,1),name
你可以担供一个参数给.schema命令。如果这橛,查询可以是这样的:
SELECTsqlFROM(SELECT*FROMsqlite_masterUNIONALLSELECT*FROMsqlite_temp_master)WHEREtbl_nameLIKE'%s'ANDtype!='Meta'ANDsqlNOTNULLANDnameNOTLIKE'sqlite_%'ORDERBYsubstr(type,name
在查询中“%S“为你的参数所取代。这使你可以询数据库结构的某个子集。
sqlite>.schema%abc%
与这些一起,“.table”命令也接受一个模式作为他的参数。如果你给“.table”一个参数,“%”将被前后扩展并且一个LIKE子句被附加到查询上。这让你可以列出只与特定模式相匹配的的表。
“.datebaSAE”命令显示所有当前连接打开的数据库的一个列表。将允许一次到少两个。第一个是“main”,最初打开的那个数据库。第二个是"temp",用于临时表的数据库。对于用ATTACH语句附加的数据也许有附加数据库列表。输出的第一列与之相联的数据库名,第二列是外部文件名。
sqlite>.databases
".dump"命令成一个单一的ASCII文本文件。这个文件可以被用作管道传递给sqlite3命令来转换回数据库。
一个最好的制作一个数据库档案拷贝的命令是:
$echo'.dump'|sqlite3ex1|gzip-c>ex1.dump.gz
它产生一个一个名为ex1.dump.gz的文件,它包含了你以后或在其它机器上重构数据库的所有的信息。要重构数据库,只须敲入:
$zcatex1.dump.gz|sqlite3ex2
这个文本格式是纯粹的sql语句所以你可以用.dump命令来导出一个sqlite数据库到另一个常用的sql数据库引擎。比如:
$createdbex2
其它的点命令
".explain"命令可以被用来设置输出格式为“column”并设置列宽为EXPLAIN命令看起来比较合理的宽度。EXPLAIN命令是sqlite特有的sql扩展,它是对调试有用。如果任何常规的sql被EXPLAIN执行,那么sql命令被分解并分析但并不执行。取而代之的是,虚拟机指令序列将被用于执行sql命令并返回一个类似的查询结果。如:
sqlite>.explain
sqlite>explaindeletefromtbl1wheretwo<20;
addropcodep1p2p3
---------------------------------------------------------------
0ListOpen00
1Open01tbl1
2Next09
3Field01
4Integer200
5Ge02
6Key00
7ListWrite00
8Goto02
9Noop00
10ListRewind00
11ListRead014
12Delete00
13Goto011
14ListClose00
“.timeout”命令设置sqlite3等待一个试图存储文件锁定请除直到错误返回的总时间。默认的超时值是0因此如果任何需要的数据库表或序列列被锁定时它将立即返回一个错误。
最后,我们提到“.exit”命令它交导致sqlite3退出。
在命令和脚本中使用sqlite3
一个在脚本命令中使用sqlite3的方式是用“echo”或“cat”来产生一个命令序列在一个文件中,然后当从一个产生的命令行中重定向输入时调用sqlite3。它有用并且适应许多环境。但作为一附加的便利是,sqlite3允许一个单一的sql语句在命令行中作为数据库名后的第二个参数输入。当sqlite3程序带着两个参数启动时,第二个参数被传递给sqlite库处理,查询以列表模式打印到标准输出,然后程序退出。这个机制被设计用于让sqlite3容易于用于连接诸如"AWK"的程序。例如:
$sqlite3ex1'select*fromtbl1'|
>awk'{printf"<tr><td>%s<td>%s\n",$1,$2}'
<tr><td>hello<td>10
<tr><td>goodbye<td>20
$
结束命令行命令
sqlite命令通常以一个分号结束。在一个命令行中你也可以用“GO”单词(大小写敏感)或者一个“/”斜线在它所在好行结束一个命令。这常被sqlServer和Oracle使用。这些将不在sqlite3_exec()中有用,因为命令行在传递它们到函数之前把这些翻译为分号。
sqlite3程序当你编译sqlite库时自动被建立。只须取得一个源文件树的拷贝,运行“configure"然后"make"即可。
原文链接:https://www.f2er.com/sqlite/201517.html