转自:http://www.cnblogs.com/caizhimin816/articles/1885349.html
Sqlite shell http://www.sqlite.org/download.html页面 Precompiled Binaries for Windows
SQLITE_MASTER 表
一个SQLite数据库的数据结构是存贮在 "sqlite_master" 表中。你可以像其他数据表一样对 sqlite_master 表执行 “SELECT” 语句,例如:
#sqlite3 ex1 SQlite vresion 3.3.10 Enter ".help" for instructions sqlite> select * from sqlite_master; type = table tbl_name = tbl1
name = tbl1 rootpage = 3 sql = create table tbl1(one varchar(10),two smallint) sqlite>
将结果写到文件
默认情况下,sqlite3会将结果发送到标准输出,你可以使用 ".output" 来改变,只是将输出到的文件名作为参数传递给 .output,所有后面的查询结果都会写到文件里。开头使用 ".output stdout" 会再次写到标准输出,例如:
sqlite> .mode list 显示模式 sqlite> .separator | 字段直接间隔 sqlite> .output test_file_1.txt 输出到那个文件 sqlite> select * from tb1; 查询数据 sqlite> .exit 退出 #cat test_file_1.txt hello|10 goodbye|20
改变输出格式
sqlite3程序可以以八种不同的格式显示一个查询的结果:"csv","列","html","插入","行","制表"和"tcl"。你可以用".mode"点命令在这些输出格式之间切换。
默认的输出格式是“列表”。在列表模式下,每条查询结果记录被写在一行中并且每列之间以一个字符串分割符隔开。默认的分隔符是一个管道符号(“|”)。列表符号在当你输出查询结果到另外一个符加处理的程序(如AWK)中去是尤为有用。
sqlite>.modelist sqlite>select*fromtb1; hello|10 goodbye|20 sqlite>
你可以用“.separator”点命令来改变分界符。例如,为了把分割符改为一个逗号和一个空格,你可以这样做:
sqlite>.separator"," sqlite>select*fromtb1; hello,10 goodbye,20 sqlite>
在“line"模式下,每一个位于条记录中的列在它自己那行显示。每行由列名、一个等号和列数据组成。下一条记录以一个空行隔开。这是一个行模式输出的例子:
sqlite>.modeline sqlite>select*fromtb1; 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*fromtb1; hello10 goodbye20 sqlite>
.headeron可以打开列标示;
另外一个有用的输出模式是"insert"。在插入模式下,被子格式化为看起来像SQL INSERT语句的样式。你可以用插入模式来产生文件(便于)以后用于不同数据库的输入。
当指定插入模式时,你必须给定一个特定参数就是要插入的表名。例如:
sqlite>.modeinsertnew_table sqlite>select*fromtb1; INSERTINTO'new_table'VALUES('hello',10); INSERTINTO'new_table'VALUES('goodbye',20); sqlite>
最新的输出格式是“html”。在这种模式下,sqlite3把查询的结果写做XHTML表。开始的<TABLE>和结束的</TABLE>(标记)没有写出,但有<TR>、<TH>和<TD>等分界符。html输出对CGI来说是相当有用地。
sqlite> .mode html sqlite> select * from tb1; <TR><TD>hello!</TD> <TD>10</TD> </TR> <TR><TD>hello!</TD> <TD>10</TD> </TR> <TR><TD>hello!</TD> <TD>10</TD> </TR> <TR><TD>hello!</TD> <TD>10</TD> </TR> <TR><TD>goodbye</TD> <TD>20</TD> </TR>
查询数据库结构
sqlite3程序提供几个有用的用于查询数据库结构的快捷命令。这些不是不可以用别的方式来实现。这些命令仅仅是一个快捷方式而已。
例如,为了查看数据库的表列表,你可以敲入“.tables”。
sqlite>.tables tbl1 tbl2 sqlite>
“.tables”命令相似于设置列表模式然后执行接下来的查询:
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
事实上,你可以查看sqlite3的源代码(可以在源文件树的src/shell.c中),你可找到上面的具体的查询。
“.indices”命令作用类似的方式是列出特定表的所有的索引。“.indics”命令须一个参数即所要索引表的表名。最后,但不是至少,是“.schema”命令。不带任何参数,“.schema”命令显示原始的用于创建当前数据库的CREATE TABLE和CREATE INDEX语句。如果你给".schema"命令一个表名,它显示原始的创建该表和它所有索引的CREATE语句。我们可以:
sqlite>.schema
createtabletbl1(onevarchar(10),twosmallint)
CREATETABLEtbl2(
f1varchar(30)primarykey,f2text,f3real
)
sqlite>.schematbl2
CREATETABLEtbl2(
f1varchar(30)primarykey,f3real
)
sqlite>
".schema"命令可以用设置列表然后执行以下查询来实现:
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"命令一个参数,由于你只想得到一个表的结构,查询可以是这样:
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
你可以担供一个参数给.schema命令。如果这橛,查询可以是这样的:
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,name
在查询中“%S“为你的参数所取代。这使你可以询数据库结构的某个子集。
sqlite>.schema%abc%
与这些一起,“.table”命令也接受一个模式作为他的参数。如果你给“.table”一个参数,“%”将被前后扩展并且一个LIKE子句被附加到查询上。这让你可以列出只与特定模式相匹配的的表。
“.datebasae”命令显示所有当前连接打开的数据库的一个列表。将允许一次到少两个。第一个是“main”,最初打开的那个数据库。第二个是"temp",用于临时表的数据库。对于用ATTACH语句附加的数据也许有附加数据库列表。输出的第一列与之相联的数据库名,第二列是外部文件名。
sqlite>.databases
sqlite> .databases
seq name file
--- --------------- ----------------------------------------------------------
0 main //ex1
1 temp /tmp/etilqs_SAmtUWMcNv0tqMn
将整个数据库转换为ASCII文本文件
".dump"命令成一个单一的ASCII文本文件。这个文件可以被用作管道传递给sqlite3命令来转换回数据库。
一个最好的制作一个数据库档案拷贝的命令是:
$echo'.dump'|sqlite3ex1|gzip-c>ex1.dump.gz
它产生一个一个名为ex1.dump.gz的文件,它包含了你以后或在其它机器上重构数据库的所有的信息。要重构数据库,只须敲入:
$zcatex1.dump.gz|sqlite3ex2
这个文本格式是纯粹的SQL语句所以你可以用.dump命令来导出一个SQLite数据库到另一个常用的SQL数据库引擎。比如:
$createdbex2
$sqlite3ex1.dump|psqlex2
其它的点命令
".explain"命令可以被用来设置输出格式为“column”并设置列宽为EXPLAIN命令看起来比较合理的宽度。EXPLAIN命令是SQLite特有的SQL扩展,它是对调试有用。如果任何常规的SQL被EXPLAIN执行,那么SQL命令被分解并分析但并不执行。取而代之的是,虚拟机指令序列将被用于执行SQL命令并返回一个类似的查询结果。如:
“.timeout”命令设置sqlite3等待一个试图存储文件锁定请除直到错误返回的总时间。默认的超时值是0因此如果任何需要的数据库表或序列列被锁定时它将立即返回一个错误。
sqlite>.explain sqlite>explaindeletefromtbl1wheretwo<20; addropcodep1p2p3 --------------------------------------------------------------- 0ListOpen00 1Open01tbl1 2Next09 3Field01 4Integer200 5Ge0 |