sqlite3的命令简单说明
sqlite3: 一个SQLite数据库的命令行接口
原文地址:http://www.sqlite.org/sqlite.html
SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令。本文档提供一个样使用sqlite3的简要说明。
开始
启动sqlite3程序,仅仅需要敲入带有SQLite数据库名字的"sqlite3"命令即可。如果文件不存在,则创建一个新的(数据库)文件。然后sqlite3程序将提示你输入SQL。敲入SQL语句(以分号“;”结束),敲回车键之后,SQL语句就会执行。
例如,创建一个包含一个表"tb11"名字为"ex1"的SQLite数据库,你可以这样做:
$sqlite3ex1
SQLiteversion3.3.17
Enter".help"forinstructions
sqlite>createtabletbl1(onevarchar(10),twosmallint);
sqlite>insertintotbl1values('hello!',10);
sqlite>insertintotbl1values('goodbye',20);
sqlite>select*fromtbl1;
hello!|10
goodbye|20
sqlite>
你可以通过敲你所用系统的文件结束符(通常是Ctrl+D)或者中断字符(通常是Ctrl+C)。来终止sqlite3程序。确定你在每个SQL语句结束敲入分号!sqlite3程序通过查找分号来决定一个SQL语句的结束。如果你省略分号,sqlite3将给你一个连续的命令提示符并等你给当前的SQL命令添加更多的文字。这个特点让你输入多行的多个SQL语句,例如:
sqlite>createtabletbl2(
...>f1varchar(30)primarykey,
...>f2text,
...>f3real
...>);
sqlite>
题外话:查询SQLITE_MASTER表
SQLite数据库的框架被保存在一个名叫"sqlite_master"的特殊的表中。你可以像查询其它表一样通过执行“SELECT”查询这个特殊的表。例如:
$sqlite3ex1
SQlitevresion3.3.10
Enter".help"forinstructions
sqlite>select*fromsqlite_master;
type=table
name=tbl1
tbl_name=tbl1
rootpage=3
sql=createtabletbl1(onevarchar(10),twosmallint)
sqlite>
但你不能在sqlite_master表中执行诸如DROPTABLE,UPDATE,INSERT或者DELETE命令。sqlite_master表在你创建、删除和索引数据库时自动更新这个表。你不能手工更改sqlite_master表。
TEMPORARY表的结构没有存储在"sqlite_master"表中,由于TEMPORARY表对应用是不可见的,而不是应用程序创建这个表。TEMPORARY表结构被存储在另外一个名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是临时表自身。
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_master
WHEREtypeIN('table','view')ANDnameNOTLIKE'sqlite_%'
UNIONALL
SELECTnameFROMsqlite_temp_master
WHEREtypeIN('table','view')
ORDERBY1事实上,你可以查看sqlite3的源代码(可以在源文件树的src/shell.c中),你可找到上面的具体的查询。“.indices”命令作用类似的方式是列出特定表的所有的索引。“.indics”命令须一个参数即所要索引表的表名。最后,但不是至少,是“.schema”命令。不带任何参数,“.schema”命令显示原始的用于创建当前数据库的CREATETABLE和CREATEINDEX语句。如果你给".schema"命令一个表名,它显示原始的创建该表和它所有索引的CREATE语句。我们可以:sqlite>.schemacreatetabletbl1(onevarchar(10),twosmallint)CREATETABLEtbl2(f1varchar(30)primarykey,f2text,f3real)sqlite>.schematbl2CREATETABLEtbl2(f1varchar(30)primarykey,f2text,f3real)sqlite>".schema"命令可以用设置列表然后执行以下查询来实现:
SELECTsqlFROM
(SELECT*FROMsqlite_masterUNIONALL
SELECT*FROMsqlite_temp_master)
WHEREtype!='meta'
ORDERBYtbl_name,typeDESC,name
.databases列出数据库文件名
.tables?PATTERN?列出?PATTERN?匹配的表名
.importFILETABLE将文件中的数据导入的文件中
.dump?TABLE?生成形成数据库表的SQL脚本
.outputFILENAME将输出导入到指定的文件中
.outputstdout将输出打印到屏幕
.modeMODE?TABLE?设置数据输出模式(csv,html,tcl…
.nullvalueSTRING用指定的串代替输出的NULL串
.readFILENAME执行指定文件中的SQL语句
.schema?TABLE?打印创建数据库表的SQL语句
.separatorSTRING用指定的字符串代替字段分隔符
.show打印所有SQLite环境变量的设置
.quit退出命令行接口