没有合适的资源?快使用搜索试试~ 我知道了~
首页SQLite学习手册(带目录)
SQLite学习手册(带目录)
需积分: 31 20 下载量 150 浏览量
更新于2023-06-06
评论
收藏 611KB PDF 举报
增加目录,方便查询 SQLite学习手册(开篇) 一、简介 二、SQLite的主要优点 三、和RDBMS相比SQLite的一些劣势 四、个性化特征 SQLite学习手册(C/C++接口简介) 一、概述 二、核心对象和接口 三、参数绑定 SQLite学习手册(数据表和视图) 一、创建数据表 二、表的修改 三、表的删除 四、创建视图 五、删除视图 SQLite学习手册(内置函数) 一、聚合函数 二、核心函数 三、日期和时间函数 SQLite学习手册(索引和数据分析/清理) 一、创建索引 二、删除索引 三、重建索引 四、数据分析 五、数据清理 SQLite学习手册(数据库和事物) 一、Attach数据库 二、Detach数据库 三、事物 SQLite学习手册(表达式) 一、常用表达式 二、条件表达式 三、转换表达式 SQLite学习手册(数据类型) 一、存储种类和数据类型 二、类型亲缘性 三、比较表达式 四、操作符 SQLite学习手册(命令行工具) SQLite学习手册(在线备份) 一、常用备份 二、在线备份APIs简介 三、高级应用技巧 SQLite学习手册(内存数据库) 一、内存数据库 二、临时数据库 SQLite学习手册(临时文件) 一、简介 二、具体说明 三、相关的编译时参数和指令 四、其它优化策略 SQLite学习手册(锁和并发控制) 一、概述 二、文件锁 三、回滚日志 四、数据写入 五、SQL级别的事物控制 SQLite学习手册(实例代码<一>) 一、获取表的Schema信息 二、常规数据插入 SQLite学习手册(实例代码<二>) 三、高效的批量数据插入 四、数据查询
资源详情
资源评论
资源推荐
SQLite学习手册 by @_Nicky
SQLite学习手册
内容收集自网络
整理:
zhoushuangsheng@gmail.com
新浪微博:@_Nicky
开篇
一、简介:
SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如
BerkeleyDB、MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,
如标准SQL语法、事务、数据表和索引等。事实上,尽管SQLite拥有诸多关系型数据库的基
本特征,然而由于应用场景的不同,它们之间并没有更多的可比性。
下面我们将列举一下SQLite的主要特征:
1. 管理简单,甚至可以认为无需管理。
2. 操作方便,SQLite生成的数据库文件可以在各个平台无缝移植。
3. 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。
4. 易于维护。
综上所述,SQLite的主要优势在于灵巧、快速和可靠性高。SQLite的设计者们为了达到这一
目标,在功能上作出了很多关键性的取舍,与此同时,也失去了一些对RDBMS关键性功能的
支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL语句
等。正是因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。
二、SQLite的主要优点:
1. 一致性的文件格式:
在SQLite的官方文档中是这样解释的,我们不要将SQLite与Oracle或PostgreSQL去比较,而
是应该将它看做fopen和fwrite。与我们自定义格式的数据文件相比,SQLite不仅提供了很好的
移植性,如大端小端、32/64位等平台相关问题,而且还提供了数据访问的高效性,如基于某
些信息建立索引,从而提高访问或排序该类数据的性能,SQLite提供的事务功能,也是在操
作普通文件时无法有效保证的。
2. 在嵌入式或移动设备上的应用:
由于SQLite在运行时占用的资源较少,而且无需任何管理开销,因此对于PDA、智能手机等
移动设备来说,SQLite的优势毋庸置疑。
1
SQLite学习手册 by @_Nicky
3. 内部数据库:
在有些应用场景中,我们需要为插入到数据库服务器中的数据进行数据过滤或数据清理,以保
证最终插入到数据库服务器中的数据有效性。有的时候,数据是否有效,不能通过单一一条记
录来进行判断,而是需要和之前一小段时间的历史数据进行特殊的计算,再通过计算的结果判
断当前的数据是否合法。在这种应用中,我们可以用SQLite缓冲这部分历史数据。还有一种
简单的场景也适用于SQLite,即统计数据的预计算。比如我们正在运行数据实时采集的服务
程序,我们可能需要将每10秒的数据汇总后,形成每小时的统计数据,该统计数据可以极大
的减少用户查询时的数据量,从而大幅提高前端程序的查询效率。在这种应用中,我们可以将
1小时内的采集数据均缓存在SQLite中,在达到整点时,计算缓存数据后清空该数据。
4. 数据分析:
可以充分利用SQLite提供SQL特征,完成简单的数据统计分析的功能。这一点是CSV文件无
法比拟的。
5. 产品Demo和测试:
在需要给客户进行Demo时,可以使用SQLite作为我们的后台数据库,和其他关系型数据库相
比,使用SQLite减少了大量的系统部署时间。对于产品的功能性测试而言,SQLite也可以起
到相同的作用。
三、和RDBMS相比SQLite的一些劣势:
1. C/S应用:
如果你有多个客户端需要同时访问数据库中的数据,特别是他们之间的数据操作是需要通过网
络传输来完成的。在这种情况下,不应该选择SQLite。由于SQLite的数据管理机制更多的依
赖于OS的文件系统,因此在这种操作下其效率较低。
2. 数据量较大:
受限于操作系统的文件系统,在处理大数据量时,其效率较低。对于超大数据量的存储,甚至
不能提供支持。
3. 高并发:
由于SQLite仅仅提供了粒度很粗的数据锁,如读写锁,因此在每次加锁操作中都会有大量的
数据被锁住,即使仅有极小部分的数据会被访问。换句话说,我们可以认为SQLite只是提供
了表级锁,没有提供行级锁。在这种同步机制下,并发性能很难高效。
四、个性化特征:
1. 零配置:
SQLite本身并不需要任何初始化配置文件,也没有安装和卸载的过程。当然也不存在服务器
实例的启动和停止。在使用的过程中,也无需创建用户和划分权限。在系统出现灾难时,如电
源问题、主机问题等,对于SQLite而言,不需要做任何操作。
2. 没有独立的服务器:
和其他关系型数据库不同的是,SQLite没有单独的服务器进程,以供客户端程序访问并提供
相关的服务。SQLite作为一种嵌入式数据库,其运行环境与主程序位于同一进程空间,因此
它们之间的通信完全是进程内通信,而相比于进程间通信,其效率更高。然而需要特别指出的
是,该种结构在实际运行时确实存在保护性较差的问题,比如此时,应用程序出现问题导致进
程崩溃,由于SQLite与其所依赖的进程位于同一进程空间,那么此时SQLite也将随之退出。
但是对于独立的服务器进程,则不会有此问题,它们将在密闭性更好的环境下完成它们的工
2
SQLite学习手册 by @_Nicky
作。
3. 单一磁盘文件:
SQLite的数据库被存放在文件系统的单一磁盘文件内,只要有权限便可随意访问和拷贝,这
样带来的主要好处是便于携带和共享。其他的数据库引擎,基本都会将数据库存放在一个磁盘
目录下,然后由该目录下的一组文件构成该数据库的数据文件。尽管我们可以直接访问这些文
件,但是我们的程序却无法操作它们,只有数据库实例进程才可以做到。这样的好处是带来了
更高的安全性和更好的性能,但是也付出了安装和维护复杂的代价。
4. 平台无关性:
这一点在前面已经解释过了。和SQLite相比,很多数据库引擎在备份数据时不能通过该方式
直接备份,只能通过数据库系统提供的各种dump和restore工具,将数据库中的数据先导出到
本地文件中,之后在load到目标数据库中。这种方式存在显而易见的效率问题,首先需要导出
到另外一个文件,如果数据量较大,导出的过程将会比较耗时。然而这只是该操作的一小部
分,因为数据导入往往需要更多的时间。数据在导入时需要很多的验证过程,在存储时,也并
非简简单单的顺序存储,而是需要按照一定的数据结构、算法和策略存放在不同的文件位置。
因此和直接拷贝数据库文件相比,其性能是非常拙劣的。
5. 弱类型:
和大多数支持静态类型的数据库不同的是,SQLite中的数据类型被视为数值的一个属性。因
此对于一个数据表列而言,即便在声明该表时给出了该列的类型,我们在插入数据时仍然可
以插入任意类型,比如Integer的列被存入字符串'hello'。针对该特征唯一的例外是整型的主键
列,对于此种情况,我们只能在该列中存储整型数据。
6. SQL语句编译成虚拟机代码:
很多数据库产品会将SQL语句解析成复杂的,相互嵌套的数据结构,之后再交予执行器遍历该
数据结构完成指定的操作。相比于此,SQLite会将SQL语句先编译成字节码,之后再交由其
自带的虚拟机去执行。该方式提供了更好的性能和更出色的调试能力。
C/C++接口简介
一、概述:
在SQLite提供的C/C++接口中,其中5个APIs属于核心接口。在这篇博客中我们将主
要介绍它们的用法,以及它们所涉及到的核心SQLite对象,如database_connection和
prepared_statement。相比于其它数据库引擎提供的APIs,如OCI、MySQL API等,
SQLite提供的接口还是非常易于理解和掌握的。
二、核心对象和接口:
1. 核心对象:
在SQLite中最主要的两个对象是,database_connection和prepared_statement。
database_connection对象是由sqlite3_open()接口函数创建并返回的,在应用程序使用任何其
他SQLite接口函数之前,必须先调用该函数以便获得database_connnection对象,在随后的
其他APIs调用中,都需要该对象作为输入参数以完成相应的工作。至于prepare_statement,
我们可以简单的将它视为编译后的SQL语句,因此,所有和SQL语句执行相关的函数也都需要
该对象作为输入参数以完成指定的SQL操作。
3
SQLite学习手册 by @_Nicky
2. 核心接口:
1). sqlite3_open
上面已经提到过这个函数了,它是操作SQLite数据库的入口函数。该函数返回的
database_connection对象是很多其他SQLite APIs的句柄参数。注意,我们通过该函
数既可以打开已经存在的数据库文件,也可以创建新的数据库文件。对于该函数返回
的database_connection对象,我们可以在多个线程之间共享该对象的指针,以便完成
和数据库相关的任意操作。然而在多线程情况下,我们更为推荐的使用方式是,为每
个线程创建独立的database_connection对象。对于该函数还有一点也需要额外说明,
我们没有必要为了访问多个数据库而创建多个数据库连接对象,因为通过SQLite自带
的ATTACH命令可以在一个连接中方便的访问多个数据库。
2). sqlite3_prepare
该函数将SQL文本转换为prepared_statement对象,并在函数执行后返回该对象的指
针。事实上,该函数并不会评估参数指定SQL语句,它仅仅是将SQL文本初始化为待
执行的状态。最后需要指出的,对于新的应用程序我们可以使用sqlite3_prepare_v2接
口函数来替代该函数以完成相同的工作。
3). sqlite3_step
该函数用于评估sqlite3_prepare函数返回的prepared_statement对象,在执行完该函
数之后,prepared_statement对象的内部指针将指向其返回的结果集的第一行。如果
打算进一步迭代其后的数据行,就需要不断的调用该函数,直到所有的数据行都遍历
完毕。然而对于INSERT、UPDATE和DELETE等DML语句,该函数执行一次即可完
成。
4). sqlite3_column
该函数用于获取当前行指定列的数据,然而严格意义上讲,此函数在SQLite的接口函
数中并不存在,而是由一组相关的接口函数来完成该功能,其中每个函数都返回不同
类型的数据,如:
sqlite3_column_blob
sqlite3_column_bytes
sqlite3_column_bytes16
sqlite3_column_double
sqlite3_column_int
sqlite3_column_int64
sqlite3_column_text
sqlite3_column_text16
sqlite3_column_type
sqlite3_column_value
sqlite3_column_count
其中sqlite3_column_count函数用于获取当前结果集中的字段数据。下面是使用
sqlite3_step和sqlite3_column函数迭代结果集中每行数据的伪代码,注意这里作为示
例代码简化了对字段类型的判断:
int fieldCount = sqlite3_column_count(...);
while (sqlite3_step(...) <> EOF) {
for (int i = 0; i < fieldCount; ++i) {
int v = sqlite3_column_int(...,i);
}
}
4
SQLite学习手册 by @_Nicky
5). sqlite3_finalize
该函数用于销毁prepared statement对象,否则将会造成内存泄露。
6). sqlite3_close
该函数用于关闭之前打开的database_connection对象,其中所有和该对象相关的
prepared_statements对象都必须在此之前先被销毁。
三、参数绑定:
和大多数关系型数据库一样,SQLite的SQL文本也支持变量绑定,以便减少SQL语句被动态
解析的次数,从而提高数据查询和数据操作的效率。要完成该操作,我们需要使用SQLite提
供的另外两个接口APIs,sqlite3_reset和sqlite3_bind。
见如下示例:
void test_parameter_binding() {
//1. 不带参数绑定的情况下插入多条数据。
char strSQL[128];
for (int i = 0; i < MAX_ROWS; ++i) {
sprintf(strSQL,"insert into testtable values(%d)",i);
sqlite3_prepare_v2(..., strSQL);
sqlite3_step(prepared_stmt);
sqlite3_finalize(prepared_stmt);
}
//2. 参数绑定的情况下插入多条数据。
string strSQLWithParameter = "insert into testtable values(?)";
sqlite3_prepare_v2(..., strSQL);
for (int i = 0; i < MAX_ROWS; ++i) {
sqlite3_bind(...,i);
sqlite3_step(prepared_stmt);
sqlite3_reset(prepared_stmt);
}
sqlite3_finalize(prepared_stmt);
}
这里首先需要说明的是,SQL语句"insert into testtable values(?)"中的问号(?)表示参数变量的
占位符,该规则在很多关系型数据库中都是一致的,因此这对于数据库移植操作还是比较方便
的。
通过上面的示例代码可以显而易见的看出,参数绑定写法的执行效率要高于每次生成不同的
SQL语句的写法,即2)在效率上要明显优于1),下面是针对这两种写法的具体比较:
1. 单单从程序表面来看,前者在for循环中执行了更多的任务,比如字符串的填充、SQL语句
的prepare,以及prepared_statement对象的释放。
2. 在SQLite的官方文档中明确的指出,sqlite3_prepare_v2的执行效率往往要低于
sqlite3_step的效率。
3. 当插入的数据量较大时,后者带来的效率提升还是相当可观的。
数据表和视图
一、创建数据表:
5
剩余45页未读,继续阅读
wolftrace
- 粉丝: 7
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0