共计 3334 个字符,预计需要花费 9 分钟才能阅读完成。
SQLite 浅析
SQLite 是一个非常轻量级自包含 (lightweight and self-contained) 的 DBMS,它可移植性好,很容易使用,很小,高效而且可靠。SQLite 嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个 RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。
嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。
下面将介绍 SQLite 的使用:
一、创建 SQLite 数据库
- 手工创建
使用 sqlite3 工具,通过手工输入 SQL 命令完成数据库创建,用户在 Linux 的命令行界面中输入 sqlite3 可启动 sqlite3 工具。
- 代码创建
在代码中动态创建数据库。
在程序执行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序会自动建立数据库,然后打开数据库。
二、SQLite 常用命令介绍
1. sqlite3 基本指令(通常以 . 开头)
a. 创建或打开一个数据库文件
sqlite3 < *.db >
在终端下运行 sqlite3 < *.db > 指令:
JonathandeMacBook-Pro:test jonathan$ sqlite3 message.db | |
SQLite version 3.24.0 2018-06-04 14:10:15 | |
Enter ".help" for usage hints. | |
sqlite> |
<*.db> 是要打开的数据库文件。若该文件不存在,则自动创建。
b. 显示当前打开的数据库文件
sqlite > .database
sqlite> .database | |
main: /Users/jonathan/test/message.db | |
sqlite> |
可以看到当前打开的数据库文件正是刚刚建立的 message.db 文件;
c. 显示数据库中所有表名
sqlite > .tables
sqlite> .table | |
user | |
sqlite> |
可以看到当前用户下有一个名为 user 的表;
d. 查看表的结构
sqlite > .schema <table_name>
sqlite> .schema user | |
CREATE TABLE user(id integer, name, passwd interger); | |
sqlite> |
其实这里显示的正是我们创建新表时输入的命令;
e. 显示所有命令
sqlite > .help
sqlite> .help | |
.auth ON|OFF Show authorizer callbacks | |
.backup ?DB? FILE Backup DB (default "main") to FILE | |
Add "--append" to open using appendvfs. | |
.bail on|off Stop after hitting an error. Default OFF | |
.binary on|off Turn binary output on or off. Default OFF | |
.cd DIRECTORY Change the working directory to DIRECTORY | |
.changes on|off Show number of rows changed by SQL | |
.check GLOB Fail if output since .testcase does not match | |
.clone NEWDB Clone data into NEWDB from the existing database | |
.databases List names and files of attached databases | |
.dbconfig ?op? ?val? List or change sqlite3_db_config() options | |
.dbinfo ?DB? Show status information about the database | |
.dump ?TABLE? ... Dump the database in an SQL text format | |
If TABLE specified, only dump tables matching | |
LIKE pattern TABLE. | |
... ... |
f. 退出 sqlite3
sqlite > .quit
sqlite> .quit | |
JonathandeMacBook-Pro:test jonathan$ |
2. SQL 表操作命令
每个命令以;结束
a. 创建新表
sqlite > create table <table_name> (f1 type1, f2 type2,…);
sqlite> CREATE TABLE user(id integer, name, passwd interger); | |
sqlite> |
type 为数据类型:
NULL
INTEGER
REAL
TEXT
BLOB
注意:若未指定类型,默认是字符串,向表中添加新纪录时要加“”;
b. 删除表
sqlite > drop table <table_name>;
sqlite> .tables | |
user | |
sqlite> DROP TABLE user; | |
sqlite> .tables | |
sqlite> |
可以看到原来有两个表 user 与 user2,使用 drop table user2 后可以看到 只剩下 user;
c. 查询表中所有记录
sqlite >select * from <table_name>;
sqlite> SELECT * FROM user ; | |
1|zhangsan|1 | |
sqlite> |
d. 按指定条件查询表中记录
sqlite >select * from <table_name> where <expression>;
sqlite> SELECT * FROM user where id < 3; | |
1|zhangsan|1 | |
sqlite> |
这里的条件是 id < 2,可以看到 id < 3 的数据被挑选出来;
e. 向表中添加新纪录
sqlite >insert into <table_name> values(value1,value2,…);
sqlite> INSERT INTO user VALUES(1,"zhangsan",1) VALUES(2,"lisi",2); | |
Error: near "VALUES": syntax error | |
sqlite> INSERT INTO user VALUES(1,"zhangsan",1); | |
sqlite> SELECT * FROM user; | |
1|zhangsan|1 | |
sqlite> |
可以看到最新的记录被添加进去;
f. 按指定的条件删除表中记录
sqlite >delete from <table_name> where <expression>;
sqlite> SELECT * FROM user ; | |
1|zhangsan|1 | |
sqlite> DELETE FROM user WHERE id=1; | |
sqlite> SELECT * FROM user ; | |
sqlite> |
可以看到 passwd=1 的被删除;
g. 更新表中记录
sqlite > updata <table_name> set <f1=value1>,<f2=value2>… where <expression>;
sqlite> SELECT * FROM user ; | |
1|zhangsan|1 | |
2|lisi|2 | |
sqlite> UPDATE user SET name="xiaowang",passwd=3 WHERE id=1; | |
sqlite> SELECT * FROM user ; | |
1|xiaowang|3 | |
2|lisi|2 | |
sqlite> |
可以看到 id=3 的数据被更新。再次提醒,未定义类型的记录默认是字符串,添加时一定要用“”;
h. 在表中添加字段
sqlite > alter table <table> add column <field><type> defalut…;
sqlite> SELECT * FROM user ; | |
1|xiaowang|3 | |
2|lisi|2 | |
sqlite> ALTER TABLE user add COLUMN age integer; | |
sqlite> .schema user | |
CREATE TABLE user(id integer, name, passwd interger, age integer); | |
sqlite> |
可以看到 age 被添加进去;