SQLite 是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布。SQLite可移植性好,很容易使用,很小,高效而且可靠。SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部 看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。
SQLite是一个内嵌式的数据库。
数据库服务器就在你的程序中,其好处是不需要网络配置和管理。数据库的服务器和客户端运行在同一个进程中。这样可以减少网络访问的消耗,简化数据库管理,使你的程序部署起来更容易。所有需要你做的都已经和你的程序一起编译好了。
一个Perl脚本、一个标准C/C++程序和一个使用PHP编写的Apache进程都使用SQLite。
它们都需要访问C API。尽管它们每个进程中都有独立的数据库服务器,但它们可以操作相同的数据库文件。SQLite利用操作系统功能来完成数据的同步和加锁。
体系结构
SQLite拥有一个精致的、模块化的体系结构,并引进了一些独特的方法进行关系型数据库的管理。它由被组织在3个子系统中的8个独立的模块组成,
在体系结构栈的顶部编译查询语句,在中部执行它,在底部处理操作系统的存储和接口。
接口(Interface)
接口由SQLite C API组成,也就是说不管是程序、脚本语言还是库文件,最终都是通过它与SQLite交互的;我们经常使用的ODBC/JDBC最后也会转化为相应C API的调用;
编译器(Compiler)
编译过程从分词器(Tokenizer)和分析器(Parser)开始。它们协作处理文本形式的结构化查询(Structured Query Language, SQL)语句,分析其语法有效性,转化为底层能更方便处理的层次数据结构——语法树,然后把语法树传给代码生成器(code generator)进行处理。SQLite分词器的代码是手工编写的,分析器代码是由SQLite定制的分析器生成器(称为Lemon)生成
一旦SQL语句被分解为串值并组织到语法树中,分析器就将该树下传给代码生成器进行处理。而代码生成器根据它生成一种SQLite专用的汇编代码,最后由虚拟机(Virtual Machine)执行
虚拟机(Virtual Machine)
架构中最核心的部分是虚拟机,或者叫做虚拟数据库引擎(Virtual DataBase Engine,VDBE)。它和Java虚拟机相似,解释执行字节代码。VDBE的字节代码(称为虚拟机语言)由128个操作码(opcodes)构成,主要是进行数据库操作。它的每一条指令或者用来完成特定的数据库操作(比如打开一个表的游标、开始一个事务等),或者为完成这些操作做准备。总之,所有的这些指令都是为了满足SQL命令的要求。VDBE的指令集能满足任何复杂SQL命令的要求。
后端(Back-end)
后端由B-tree、页缓冲(page cache,pager)和操作系统接口(即系统调用)构成。B-tree和page cache共同对数据进行管理。它们操作的是数据库页,这些页具有相同的大小,就像集装箱。页里面的“货物”是表示信息的大量bit,这些信息包括记录、字段和索引入口等。B-tree和pager都不知道信息的具体内容,它们只负责“运输”这些页,页不关心这些“集装箱”里面是什么。
SQLite的优势:
内存占用量小
事务操作是原子,一致,孤立,并且持久的(ACID),即使在系统崩溃和电源故障之后。
ACID兼容(原子性,一致性,独立性,可持久性),支持视图,子查询,触发器
单个库文件中包含数据库引擎与接口,且其运行不依赖其它库
可以将数据放进单个文件
为C/C++, PHP等应用提供了接口
允许为SQL命令集动态添加自定义函数(简单函数及聚集函数),而无需重编SQLite库
改进的B-树。对于表采用B+树,大大提高查询效率
SQL功能
数据定义(DDL):用户定义、删除和修改数据模式
数据查询(DQL):用于查询数据
数据操纵(DML):用于增、删、改数据
数据控制(DCL):用于控制数据访问权限
SQL的语法很像自然语言。每个语句都是一个祈使句,以动词开头,表示所要做的动作。
SQL由命令组成,每个命令以分号(;)结束。如下面是2个独立的命令:
SELECT id, name FROM foods;
INSERT INTO foods VALUES (NULL, 'Whataburger');
常量:也称为Literals,表示确切的值,有3种:字符串常量、数据常量和二进制常量。
字符串常量如:'Jerry' 'Newman' 'JujyFruit'
数据常量:数字常量有整数、十进制数和科学记数法表示的数,如:-1 3.142 6.0221415E23
二进制值用如x'0000'的表示法,其中每个数据是一个16进制数。二进制值必须由两个两个的16进制数(8 bits)组成,如:x'01' X'0fff'x'0F0EFF'
保留字:由SQL保留用做特殊的用途,如SELECT UPDATE、INSERT、CREATE、DROP和BEGIN等。标识符指明数据库里的具体对象,如表或索引。保留字预定义,不能用做标识符。SQL不区分大小写,下面是相同的语句:
SELECT * from foo;
select * from foo;
创建表
在SQL中,创建和删除数据库对象的语句一般被称为数据定义语言(data definition language,DDL),操作这些对象中数据的语句称为数据操作语言(data manipulation language,DML)。创建表的语句属于DDL,用CREATE TABLE命令,如下定义:
创建数据库:
1.数据库文件格式:test.db
sqlite> sqlite3 test.db
sqlite> create table test (id integer primary key, value text);
名为id的主键列:该列默认具备自动增长的属性;
名为value的简单文本域;
存储数据的类型:
空:这个值为空值
整数:值被标识为整数,依据值的大小可以依次被存储1,2,3,4,5,6,7,8.
实数:所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
文本:值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据,如何输入就如何存储,不改变格式.
SELECT:是SQL命令中最大最复杂的命令。SELECT的很多操作都来源于关系代数。
SQL查询语句的基本结构
简单查询
多表连接查询
合并多个结果集
SELECT INTO
使用TOP限制结果集
子查询
插入操作:
sqlite> insert into test (id,value)values(1,’zhang’);
sqlite> insert into test (id,value)values(2,’wang’);
sqlite> insert into test (value) values(‘liang’);
sqlite> insert into test (value) values(‘liang’);
查看数据:
sqlite> select * from test;
退出:
sqlite> .exit