`
tomhibolu
  • 浏览: 1386468 次
文章分类
社区版块
存档分类
最新评论

SQLite数据库的基本操作指令集合

 
阅读更多

SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令。本文档提供一个样使用sqlite3的简要说明。

开始

启动sqlite3程序,仅仅需要敲入带有SQLite数据库名字的"sqlite3"命令即可。如果文件不存在,则创建一个新的(数据库)文件。然后sqlite3程序将提示你输入SQL。敲入SQL语句(以分号“;”结束),敲回车键之后,SQL语句就会执行。

例如,创建一个包含一个表"tb11"名字为"ex1"的SQLite数据库,你可以这样做:

$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>

你可以通过敲你所用系统的文件结束符(通常是Ctrl + D)或者中断字符(通常是Ctrl + C)。来终止sqlite3程序。确定你在每个SQL语句结束敲入分号!sqlite3程序通过查找分号来决定一个SQL语句的结束。如果你省略分号,sqlite3将给你一个连续的命令提示符并等你给当前的SQL命令添加更多的文字。这个特点让你输入多行的多个SQL语句,例如:

sqlite> create table tbl2(
...> f1 varchar(30) primary key,
...> f2 text,
...> f3 real
...> );
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表中执行诸如DROP TABLE, 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"。在插入模式下,被子格式化为看起来像SQL INSERT语句的样式。你可以用插入模式来产生文件(便于)以后用于不同数据库的输入。

当指定插入模式时,你必须给定一个特定参数就是要插入的表名。例如:

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命令的输出参数然后所有后续查询结果将被写到那个文件中。用“.output stdout”再一次改为标准输出。例如:

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”命令相似于设置列表模式然后执行接下来的查询:

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,
f2text,
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,2,1), name
    在查询中“%S“为你的参数所取代。这使你可以询数据库结构的某个子集。
sqlite>.schema%abc%
    与这些一起,“.table”命令也接受一个模式作为他的参数。如果你给“.table”一个参数,“%”将被前后扩展并且一个LIKE子句被附加到查询上。这让你可以列出只与特定模式相匹配的的表。
    “.datebasae”命令显示所有当前连接打开的数据库的一个列表。将允许一次到少两个。第一个是“main”,最初打开的那个数据库。第二个是"temp",用于临时表的数据库。对于用ATTACH语句附加的数据也许有附加数据库列表。输出的第一列与之相联的数据库名,第二列是外部文件名。
sqlite>.databases
    将整个数据库转换为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命令并返回一个类似的查询结果。如:

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”单词(大小写敏感)或者一个“/”斜线在它所在好行结束一个命令。这常被SQL Server和Oracle使用。这些将不在sqlite3_exec()中有用,因为命令行在传递它们到函数之前把这些翻译为分号。
从源文件中编译sqlite3
    sqlite3程序当你编译SQLite库时自动被建立。只须取得一个源文件树的拷贝,运行“configure"然后"make"即可。
分享到:
评论

相关推荐

    SQLite 数据库教程集合

    SQLite数据库相关教程、命令解释,精妙语言集合、SQLIte PPT教程等

    sqlitemongo:将sqlite3数据库迁移到mongodb

    它将所有表从sqlite3复制到指定数据库下的mongo集合中。 例如,如果您有一个带表: table1和table2的sqlite3数据库文件db.sqlite3 ,则此工具将db.sqlite3具有collections table1和table2的mongo数据库中。 CLI用法 ...

    CHATGPT实战【基于CHATGPT查询本地数据库,并将查询结果以table形式显示在聊天界面中】 可直接运行

    database 为数据库操作文件 通过对话查询本地SQLITE库数据,并以表格方式显示在聊天界面 需要安装的python包,至少包括以下: streamlit openai sqlite 启动命令,在文件目录下运行: streamlit run queryDBchatui....

    初识SQLITE3数据库

    数据库DataBase,我们都没有接触过数据库,那么数据库是什么?  它是一个有结构的、集成的、可共享的统一管理的数据集合! 所谓有结构的,指的是数据是按一定的模型组织起来的。  简单的说,拿个箱子,用隔板把它...

    python学习MongoDB.txt

    缺点: 数据库往往需要指令或语句操作,相对复杂 几个概念 数据 :能够输入到计算机中并被识别处理的信息的集合 数据结构 :组成一个数据集合的数据之间的关系 数据库 :按照一定的数据结构,存储数据的仓库。...

    【最新版】navicat150_premium_en.dmg navicat-premium: 15.0.14【亲测可用】最好的MySQL数据库开发工具

    Navicat Premium是一个数据库开发工具,可让您从单个应用程序同时连接到MySQL,MariaDB,MongoDB,SQL Server,Oracle,PostgreSQL和SQLite数据库。与Amazon RDS,Amazon Aurora,Amazon Redshift,Microsoft Azure...

    sqlite3迁移mysql可能遇到的问题集合

    sqlite3数据迁移到mysql会遇到许多语法问题,想要一下列出所有问题会力所不及,本文会尽量多的列出可能会遇到的问题,因为每个人遇到的问题都不一样。读者根据此文可以提前预知是否有自己会面临到的问题,做到心中...

    数据处理:处理数据的工具和笔记本的集合

    剧本orders-exporter.py 将订单从JSON格式导出到CSV以及可选地导出到SQLite数据库。 它需要在输入中输入API密钥: $ &gt; python orders-exporter.pyusage: orders-exporter.py [-h] -k KEY [-l LOCALE] [-d] -p PATH -...

    红鳍带回家

    Redfin带回家-REST API项目seed文件夹以JSON文件( data.json )... npm install其次,播种SQLite数据库。 npm run seed最后,启动应用程序。 npm start要测试Express服务器,请浏览至URL 。 请使用邮递员测试该项目。

    VB6-SirkMini_2019.02.20 (1).rar

     4、包含常用类库,编写程序更容易、更强大:VB6 原版完整控件、vbRichClient(支持多线程、dll免注册、高速2d绘图、物理引擎、sqlite数据库、有序字典、数组列表、高级集合、JSON、常见加密解密、压缩解压缩、...

    pivot-tables-samples:用于在SQL中创建数据透视表的样本集合

    数据透视表样本用于在SQL中创建数据透视表的示例集合这些示例使用Perl模块名称DBIx :: SQLCrosstab。 如何使用这些示例: 您需要安装 。 安装目录样本数据库中可用的样本数据库之一cd交叉表生成更改processor.pl中的...

    1345个易语言模块

    1345个易语言模块,易语言模块大集合,够你用的啦 1亦思验证码识别1.5免费版.ec 24位转单色位图模块.ec 32张发牌.ec 3D引擎支持库-eOgre.ec 69msn.ec ACCESS 到高级表格.ec Access操作.ec Access数据库压缩修复新建....

    2020易语言模块大全持续更新3.zip

    数据库操作模块.ec 数据库查找.ec 数据库管理器模块.ec 数据打包解包.ec 数据摘要模块(MD5算法实现) 飞扬工作室.ec 数据源按钮.ec 整点半点报时模块.ec 文件关联.ec 文件压缩专家.ec 文件压缩模块.ec 文件压缩解压....

    asp.net知识库

    最详细的SQL注入相关的命令整理 Oracle Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的...

    LiteDB:LiteDB-单个数据文件中的.NET NoSQL文档存储-https:www.litedb.org

    LiteDB是一个小型,快速,轻量的.NET NoSQL嵌入式数据库。 无服务器NoSQL文档存储 简单的API,类似于MongoDB 单个DLL(小于450kb)中的.NET 4.5 / NETStandard 1.3 / 2.0的100%C#代码 线程安全 具有完整交易...

    Java学习笔记-个人整理的

    {13.3}连接Oracle数据库及操作}{192}{section.13.3} {13.4}批处理模式}{195}{section.13.4} {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {...

    Python Cookbook

    第1章 文本 1 引言 1 1.1 每次处理一个字符 6 1.2 字符和字符值之间的转换 7 1.3 测试一个对象是否是类字符串 8 1.4 字符串对齐 10 ...18.9 在Python模拟三元操作符 637 18.10 计算素数 640 18.11 将...

Global site tag (gtag.js) - Google Analytics