0. 前言
数据在实际工作中应用非常广泛,数据库的产品也比较多,oracle、DB2、SQL2000、mySQL;基于嵌入式linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
1. SQLite3安装
如果是基于源码的开发,参看博客Linux下利用c/c++使用sqlite
如果只是应用,则用下面命令安装即可
sudo apt-get install sqlite sqlite3 安装应用程序 sudo apt-get install libsqlite3-dev 安装库+头文件,用代码操作数据库必须安装
安装完成之后,可以看到版本信息
2. SQLite3数据类型
每个存储在 SQLite 数据库中的值都具有以下存储类之一:
数据类型 | 定义 |
NULL | 表示该值为NULL值 |
INTEGER | 无符号整形值 |
REAL | 浮点值 |
TEXT | 文本字符串,存储使用的编码方式为UTF-8/UTF-16BE/UFT-16LE |
BLOB | 存储Blob数据,该类型数据和输入数据完全相同,1表示true,0表示false |
3. 约束
表的每一列都有一些限制属性,比如有的列的数据不能重复,有的则限制数据范围等,约束就是用来进一步描述每一列数据属性的。 SQLite 数据库常用约束如下:
名称 | 定义 |
NOT NULL | - 非空 |
UNIQUE | 唯一 |
PRIMARY KEY | 主键 |
FOREIGN KEY | 外键 |
CHECK | 条件检查 |
DEFAULT | 默认 |
- 非空NOT NULL
有一些字段我们可能一时不知到该填些什么,同时它也没设定默认值, 当添加数据时,我们把这样的字段空着不填,系统认为他是 NULL 值。但是还有另外一类字段,必须被填上数据,如果不填,系统就会报错。 这样的字段被称为 NOT NULL 非空字段,需要在定义表的时候事先声明。 - 唯一 UNIQUE
除了主列以为,还有一些列也不能有重复值。 - 主键 PRIMARY KEY
一般是整数或者字符串,只要保证唯一就行。 在 SQLite 中,主键如果是整数类型,该列的值可以自动增长。 - 外键 FOREIGN KEY
我们的数据库中已经有 Teachers 表了,假如我们再建立一个 Students 表, 要求 Students 表中的每一个学生都对应一个 Teachers 表中的教师。
很简单,只需要在 Students 表中建立一个 TeacherId 字段,保存对应教师的 Id 号, 这样,学生和教师之间就建立了关系。
问题是:我们有可能给学生存入一个不在 Teachers 表中的 TeacherId 值, 而且发现不了这个错误。
这种情况下,可以把 Students 表中 TeacherId 字段声明为一个外键, 让它的值对应到 Teachers 表中的 Id 字段上。
这样,一旦在 Students 表中存入一个不存在的教师 Id ,系统就会报错。 - 默认值 DEFAULT
有一些特别的字段列,在每一条记录中,他的值基本上都是一样的。只是在个别情况下才改为别的值,这样的字段列我们可以给他设一个默认值。 - 条件检查CHECK
某些值必须符合一定的条件才允许存入,这是就需要用到这个 CHECK 约束。
4. shell模式常用命令
下面介绍Shell模式中的各常用命令的使用。
命令 | 功能 |
.help | 可显示shell模式中可使用的所有命令列表 |
.database | 显示数据库信息;包含当前数据库的位置 |
.mode column | 使得SQL语句处理的结果以列对齐的方式显示 |
.mode list | column |
.headers on/off | 打开关闭列标题显示开关,以使得查询结果在屏幕显示时具有列标题 |
.tables | 列出当前打开的数据库中共有多少张表 |
.exit | 退出SQLite环境 |
.schema foods | 显示表foods 创建时的SQL语句 |
.schema | 显示所有表被创建时的语句 |
.nullvalue STRING | 查询时用指定的串代替输出的NULL串 默认为.nullvalue |
'.show | 显示shell模式中定义的与输出相关的一些设置 |
.output file.csv | 设置输出文件格式为CSV,文件名为file.csv |
.separator | ,设置select语句输出的列数据间以“ ,”分隔 |
.output stdout | 恢复输出内容到标准输出设备(屏幕) |
【Note】sqlite的命令都是.开头的,操作语句前面是没有.的。
5. 使用SQLite3操作数据库命令
5.1 创建数据库
1>
sqlite3 test.db
2> 进入sqlite shell之后,直接用.open命令,
sqlite>.open test.db
上面的命令创建了数据库文件 test.db,位于 sqlite3 命令同一目录下。
打开已存在数据库也是用 .open 命令,以上命令如果 test.db 存在则直接会打开,不存在就创建它。
5.2 创建表create
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。其基本语法如下:
CREATE TABLE database_name.table_name( column1 datatype PRIMARY KEY(one or more columns), column2 datatype, column3 datatype, ..... columnN datatype, );
实例
创建了一个 COMPANY 表,ID 作为主键,NOT NULL 的约束表示在表中创建纪录时这些字段不能为 NULL:
sqlite> CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
5.3 删除表drop
SQLite 的 DROP TABLE 语句用来删除表定义及其所有相关数据、索引、触发器、约束和该表的权限规范。其基本语法如下:
DROP TABLE table_name;
实例
确认COMPANY表存在,然后使用drop指令删除表,然后再查看,确认删除成功。
5.4 插入insert
SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行。其基本语法如下:
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN);
在这里,column1, column2,…columnN 是要插入数据的表中的列的名称。
如果要为表中的所有列添加值,您也可以不需要在 SQLite 查询中指定列名称。但要确保值的顺序与列在表中的顺序一致。SQLite 的 INSERT INTO 语法如下:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
实例
假设您已经在 testDB.db 中创建了 COMPANY表,如下所示:
sqlite> CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
插入一条记录
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );
5.5 select
SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。其基本语法如下:
SELECT column1, column2, columnN FROM table_name; • 1
在这里,column1, column2…是表的字段,他们的值即是要获取的。
5.6 where语句
SQLite的 WHERE 子句用于指定从一个表或多个表中获取数据的条件。
使用 WHERE 子句来过滤记录,只获取需要的记录。WHERE 子句不仅可用在 SELECT 语句中,它也可用在 UPDATE、DELETE 语句中,等等。其基本语法如下:
SELECT column1, column2, columnN FROM table_name WHERE [condition]
实例
sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
5.7 修改Update
UPDATE 查询用于修改表中已有的记录。可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新。其基本语法如下:
UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];
实例
假设 COMPANY 表有以下记录:
ID NAME AGE ADDRESS SALARY
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
下面是一个实例,它会更新 ID 为 6 的客户地址:
sqlite> UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;
5.8 删除 delete
SQLite 的 DELETE 查询用于删除表中已有的记录。可以使用带有 WHERE 子句的 DELETE 查询来删除选定行,否则所有的记录都会被删除。其基本语法如下:
DELETE FROM table_name WHERE [condition];
实例
假设 COMPANY 表有以下记录:
ID NAME AGE ADDRESS SALARY
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
下面是一个实例,它会删除 ID 为 7 的客户:
sqlite> DELETE FROM COMPANY WHERE ID = 7;
现在,COMPANY 表有以下记录:
ID NAME AGE ADDRESS SALARY
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
参看链接:
https://www.cnblogs.com/jiayongqiang/p/5300068.html
https://www.runoob.com/sqlite/sqlite-delete.html
https://juejin.cn/post/6876003507976011783#heading-25