1、数据库的概念
数据库(Database)既是存储和管理数据的仓库,它按照一定的数据结构来组织、存储和管理数据,以便用户可以通过数据库管理系统(Database Management System, DBMS)等软件进行数据的增、删、改、查等操作。数据库是现代信息系统中非常重要的组成部分,广泛应用于各种领域,如企业管理、电子商务、银行金融、科学研究、医疗健康等。
根据数据模型的不同,数据库可以分为关系数据库、非关系数据库(如NoSQL数据库)等,目前我们常用的数据库一般属于关系数据库,而关系数据库(RDBMS)又拥有如下一些特点:
此外又可根据根据其大小不同,又可分为大型数据库、中型数据库和小型数据库。
而我们今天的主角SQLite 便是一个小型的关系型数据库,体型非常小,支持ACID事务。
由于嵌入式方向的产品一般都要低功耗、小内存、使得市面上主流的数据库无法很好的支持,因此,像SQLite这类基于嵌入式linux方向的数据库便出现了,SQLite, Firebird, Berkeley DB, eXtremeDB,都属于嵌入式linux方向的数据库,它们各自都有各自的特点,Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等 、Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中、eXtremeDB是内存数据库,运行效率高、SQLite关系型数据库最大的优点便是体积小,非常契合嵌入式linux方向的需求。(注意:SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中)。
2、什么是SQLite
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 可以直接访问其存储文件,效率非常高。
3、使用SQLite的理由
不需要一个单独的服务器进程或操作的系统(无服务器的)。
SQLite 不需要配置,这意味着不需要安装或管理。
一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
SQLite 是自给自足的,这意味着不需要任何外部的依赖。
SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
4、学习SQLite
4-1、先要安装sqlite3
4-2、使用SQL语句
4-2-1 sqlite3平台下的点命令
首先要进入到sqlite3平台下,命令行输入sqlite3 进入sqlite3环境。
(1).open 打开数据库
使用格式:.table / .tables
(3).schema 查看表单中的字段格式
使用格式:.schema 表名
(4).head on 带字段名称显示数据
使用格式:.head on
(5).mode column 列对齐方式显示数据
(6) .databases 显示用户当前所在数据库的位置
使用格式:.databases
4-2-2 sqlite3数据库数据类型
4-2-3 sqlite3数据库的约束
约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。
sqlite3中的常用约束:
NOT NULL 约束:确保某列不能有 NULL 值。
DEFAULT 约束:当某列没有指定值时,为该列提供默认值。
UNIQUE 约束:确保某列中的所有值是不同的。
PRIMARY Key 约束:唯一标识数据库表中的各行记录,
CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。
4-2-4 SQL语句
(1)建表语句
格式: create table if not exists 表名(字段名1 类型 约束, 字段名1 类型 约束...);
注意:当表已存在,还试图创建时,会直接报错,添加[if not exists]来解决 。
格式2:部分字段插入 insert into (字段名1,字段名2...) values (字段值1,字段值2...);
(3)查询语句
搭配select查询时的使用字句:
where子句 (带条件。。。 where u_id > 2 )
limit 子句 (限制打印的数据条目数 limit 2 从当前位置连续打印2个条目数(记录信息))
offset子句 (偏移量 offset 3 从当前位置往后偏移3即第四个位置)
like 子句(模糊查找 %匹配1个或者多个字符 _只匹配一个字符)
order by子句 (ASC升序 DESC降序)
(4)修改语句
格式: update 表名 set 字段名1 = 新值1, 字段名2 = 新值2... where 条件;
注意:update后面不跟where子句,则导致表中所有用户的信息指定的字段改为默认值。
(5)删除语句
格式: delete from 表名 where 条件;
删除指定条件行的数据。
(6)删除表
格式: drop table 表名
删除所指定的表。
4-3:使用API操作数据库
4-3-1:打开数据库
int sqlite3_open(char *path, sqlite3 **db);
功能:打开sqlite数据库
path: 数据库文件路径
db: 指向sqlite句柄的指针
返回值:成功返回0(SQLITE_OK),失败返回错误码(非零值)
4-3-2:执行SQL操作
int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
功能:执行SQL操作
db:数据库句柄
sql:SQL语句
callback:回调函数
void *这里代表传递给回调函数的第一个参数。
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码
回调函数的原型如下:
typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name); //指向返回值类型为int 函数参数分别为(void *, int, char **, char**)的函数
功能:每找到一条记录自动执行一次回调函数。
para:传递给回调函数的参数
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组
f_name:包含每个字段名称的指针数组
返回值:成功返回0,失败返回-1
4-3-3:非回调方式的数据库访问
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp,int*nrow, int *ncolumn, char **errmsg);
功能:执行SQL操作
db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码
4-3-4:释放内存
void sqlite3_free_table(char **result);
功能:释放函数sqlite3_get_table返回的结果内存
4-3-5:关闭数据库
int sqlite3_close(sqlite3 *db);
功能:关闭sqlite数据库
返回值:成功返回0,失败返回错误码
4-3-6:打印错误信息
const char *sqlite3_errmsg(sqlite3 *db);
参数:操作数据库的句柄
返回值:导致操作出错的信息,将其返回值直接使用%s打印输出即可