嵌入式数据库 --- sqlite3的基本操作

Posted Overboom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式数据库 --- sqlite3的基本操作相关的知识,希望对你有一定的参考价值。

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 listcolumn
.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;

在这里,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

以上是关于嵌入式数据库 --- sqlite3的基本操作的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用 SQLite3 ,打开指定数据库,执行插入操作后会啥会写到磁盘?不是对内存进行操作吗?

python sqlite3 数据库操作

Linux下sqlite3常用命令!!!

SQLITE3

SQLite3下载与安装

MFC中,如何连接sqlite3的数据库,并对此数据库操作??