一、sqlite简介
sqlite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java等,还有ODBC接口,同样比起MysqL、Postgresql这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
sqlite虽然很小巧,但是支持的sql语句不会逊色于其他开源数据库,它支持的sql包括:
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE
同时它还支持事务处理功能等等。也有人说它象Microsoft的Access,有时候真的觉得有点象,但是事实上它们区别很大。比如sqlite 支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么现在你可以考虑使用sqlite。目前它的最新版本是 3.2.2,它的官方网站是:http://www.sqlite.org或者http://www.sqlite.com.cn,能在上面获得源代码和文档。同时因为数据库结构简单,系统源代码也不是很多,也适合想研究数据库系统开发的专业人士
下面是访问sqlite官方网站: http://www.sqlite.org/ 时第一眼看到关于sqlite的特性.
1. ACID事务
2. 零配置 – 无需安装和管理配置
6. 足够小,大致3万行C代码,250K
8. 简单,轻松的API
9. 包含TCL绑定,同时通过Wrapper支持其他语言的绑定
10. 良好注释的源代码,并且有着90%以上的测试覆盖率
11. 独立: 没有额外依赖
12. Source完全的Open,你可以用于任何用途,包括出售它
13. 支持多种开发语言,C,PHP,Perl,Java,ASP.NET,Python
2、sqlite类型
sqlite的数据类型
首先你会接触到一个让你惊讶的名词: Typelessness(无类型). 对! sqlite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,无论这列声明的数据类型是什么(只有在一种情况下不是,稍后解释). 对于sqlite来说对字段不指定类型是完全有效的. 如:
Create Table ex1(a,b,c);
诚然sqlite允许忽略数据类型,但是仍然建议在你的Create Table语句中指定数据类型. 因为数据类型对于你和其他的程序员交流,或者你准备换掉你的数据库引擎. sqlite支持常见的数据类型,如:
CREATE TABLE ex2(
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5)
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)
);
前面提到在某种情况下,sqlite的字段并不是无类型的. 即在字段类型为”Integer Primary Key”时.
二、sqlite的简单使用
sqlite可以到官方站点下载http://www.sqlite.org/download.html
包括:Linux,Mac OS X,Windows下的已编译文件以及源代码、帮助文档。windows版的下载地址是:http://www.sqlite.org/sqlite-3_6_23_1.zip,下载后解压就可以了。这个文件是工作在命令行下的。双击它,就直接进入命令行了。
打开之后是这样显示的:
sqlite version 3.6.23.1
Enter ".help" for instructions
Enter sql statements terminated with a ";"
sqlite>
1、创建数据库
按理说第一步是创建一个数据库,我是学电子的,对计算机不了解,所以我不知道MysqL是如何存储数据库的。但sqlite将一个数据库存储为一个文件。我们先进下cmd,关掉原来的sqlite3,因为我不只道在sqlite提示符下如何创建数据库,有知道的欢迎告之,不胜感激。
在命令提示符下:
然后就会自动跳到sqlite>命令提示符下。我记得在linux下用时候会在当前目录下出现newsql.db文件。但在我所用版本的windows下没有出现。然后我做了些尝试得到如下结果:
.quit
注意:.quit是在sqlite提示符下输入的,代表退出。看目录下还是没有出现数据库文件。
;
.quit
出现了newsql.db文件。冒号加回车,在sqlite中,代表执行一条语句的意思,虽然我只输入了一个冒号加回车,没有输入任何的语句,但结果已是不同。
2、创建一个表
create table mytable(entry1 varchar(10),entry2 int);
不要忘了加冒号。冒号代表一条语句输入完毕。
mytable是我创建的表名。create 和table都是系统关键字。entry1,entry2是两个表项。
varchar(10) int是类型。根据我读到的内容,sqlite是不区分类型,但是我们还是要在创建表时,给他一个类型,以便于将这些代码移植到其他的数据库里面时更加的方便。
3、向表中插入一条记录
insert into mytable values("hello world",10);
插入完了之后才发现是不是超出定义的大小了?我定义的entry1项是varchar(10)型的,说实在的,我不知这个类型确切来讲是什么意思,我猜应该是10个字符的字符串数组吧。如果那样的话我是一定超出了。但既然sqlite是不区分类型的,我想应该没有问题吧。于是我急于看看是不是这样...
select * from mytable;
执行这条语句,会列出mytable中的所有内容。
结果为:
sqlite> select * from mytable;
hello world|10
可见还是都插入进去了。
sqlite> insert into mytable values("goodbye cruel world",20);
sqlite> select * from mytable;
hello world|10
goodbye cruel world|20
也就是说,第一个条目的字符串完全不受限制。
sqlite> .quit
sqlite version 3.6.23.1
Enter ".help" for instructions
Enter sql statements terminated with a ";"
sqlite> select * from mytable;
hello world|10
goodbye cruel world|20
可见sqlite3 newsql.db这个命令规则为:打开名为newsql.db这个数据库,如果不存在则创建一个。
sqlite数据库中有一个系统建立的表,名为sqlite_master,查询这个表可以得到所有的表。
sqlite> create table my2ndtable(theonlyentry int);
sqlite> insert into my2ndtable values(30);
sqlite> select * from sqlite_master;
table|mytable|mytable|2|CREATE TABLE mytable(entry1 varchar(10),entry2 int)
table|my2ndtable|my2ndtable|3|CREATE TABLE my2ndtable(theonlyentry int)
对于这个表的定义,官方网站的FAQ中给出如下:
CREATE TABLE sqlite_master ( type TEXT,name TEXT,tbl_name TEXT,rootpage INTEGER,sql TEXT );第一个字段类型显然会一直是table,第二个字段是名称分别是mytable和my2ndtable,见上面的结果。第三个字段表名,没弄懂是什么意,想必是所在的表的名字,但是一个表的名字和所在的表名不是一样的吗?第四个字段rootpage,我也不知指什么,这个系统的学过数据库的人应该能知道,有路过的还望告之。第五个字段是创建表的使用的sql语句吧。
默认的输出格式是“列表”。在列表模式下,每条查询结果记录被写在一行中并且每列之间以一个字符串分割符隔开。默认的分隔符是一个管道符号(“|”)。列表符号在当你输出查询结果到另外一个符号处理的程序(如AWK)中去是尤为有用。
sqlite> .mode list
sqlite> select * from mytable;
hello world|10
goodbye cruel world|20
sqlite>
这是正常的模式。
sqlite> .mode csv
sqlite> select * from mytable;
"hello world",10
"goodbye cruel world",20
变化是什么?字符串被加上了引号。
sqlite> .mode column
sqlite> select * from mytable;
hello world 10
goodbye cru 20
哎呀,第二个字符串被截断了。
.mode MODE ?TABLE?__ Set output mode where MODE is one of:
____________ csv___ Comma-separated values
____________ column_ Left-aligned columns._ (See .width)
____________ html__ HTML <table> code
____________ insert_ sql insert statements for TABLE
____________ line__ One value per line
____________ list__ Values delimited by .separator string
____________ tabs__ Tab-separated values
____________ tcl___ TCL list elements
这些来自.help命令的输出结果。
sqlite> .mode html
sqlite> select * from mytable;
<TR><TD>hello world</TD>
<TD>10</TD>
</TR>
<TR><TD>goodbye cruel world</TD>
<TD>20</TD>
</TR>
sqlite> .output output.txt
sqlite> select * from mytable;
sqlite> .exit
原文链接:https://www.f2er.com/sqlite/202401.html