思维导图

数据库安装
SQLITE的存储结构:B树(了解就行)
1.测试数据库是否安装(查看版本)
sqlite3 -version
2.数据库安装命令
链接: https://pan.baidu.com/s/1KbVdvj7fmkYiDYcS_d5Mdw 提取码: 3528
(1)下载文件:通过网盘分享的文件:sqlite-autoconf-3460000.tar.gz
(2)(先把解压包ctrlc+v复制到虚拟机内任意位置)解压源码包:tar xf sqlite-autoconf-3460000.tar.gz
(3) 进入解压目录:cd sqlite-autoconf-3460000
(4) 配置编译选项:./configure
(5) 编译源代码:make
(6)安装到系统目录 :sudo make install
3.图形化工具的安装
sudo apt-get install sqlitebrowser
数据库的概念
数据库是"按照数据结构来组织、存储和管理数据的仓库"。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。
常用的数据库
大型数据库 :Oracle
中型数据库 :Server是微软开发的数据库产品,主要支持windows平台
小型数据库 : MySQL是一个小型关系型数据库管理系统。开放源码 (嵌入式不需要存储太多数据)
MySQL 与SQLite 区别:
MySQL和SQLite是两种不同的数据库管理系统,它们在多个方面有所不同。
性能和规模:MySQL通常用于大型应用程序和网站,它可以处理大量数据和高并发访问。SQLite则更适合于小型应用程序或移动设备,因为它是一个轻量级的数据库引擎,不需要独立的服务器进程,可以直接访问本地文件。
部署和配置:MySQL需要单独的服务器进程来运行,需要配置和管理数据库服务器。而SQLite是一个嵌入式数据库,可以直接嵌入到应用程序中,不需要单独的服务器进程。
功能和特性:MySQL提供了更多的功能和高级特性,比如存储过程、触发器、复制和集群支持等。SQLite则是一个轻量级的数据库引擎,功能相对较少,但对于简单的数据存储和检索已经足够。
跨平台支持:SQLite在各种操作系统上都能够运行,而MySQL需要在特定的操作系统上安装和配置数据库服务器。
总之,MySQL适用于大型应用程序和网站,需要处理大量数据和高并发访问,而SQLite适用于小型应用程序或移动设备,对性能和规模要求没有那么高。
SQLite概念
SQLite 是一个开源的嵌入式关系型数据库引擎 ,以其零配置、无服务器、单文件存储 的特性成为全球部署最广泛的数据库系统。SQLite的源代码是C,其源代码完全开放。它是一个轻量级的嵌入式数据库。
特性:
1.直接文件访问 :数据库就是一个磁盘文件(
.db
或.sqlite
)2.零配置:无需安装、配置或管理数据库服务
3.跨平台:支持所有主流操作系统(包括嵌入式系统)
4.类型亲和性 :声明类型到存储类型的映射(如
VARCHAR(255)
实际存储为 TEXT),数据库文件可以在不同字节顺序的机器间自由共享;5..支持数据库大小至2TB(1024G = 1TB);//嵌入式足够
6.内存足够小,全部源码大致3万行c代码,250KB;
7.比目前流行的大多数数据库对数据的操作要快;
SQLite使用
1.在终端使用
系统命令:
以"."开头,是系统命令。
(1)创建一个数据库文件(格式:文件名.db)
sqlite3 数据库文件名(2).help //查看所有支持的命令
.quit //退出
.tables //查看有哪些表(刚开始没表不显示)
.schema stu //查看表结构SQL命令
SQLite内置命令,对表增删改查。
1.创建一个表
create table stu(id int,name char,score float);
create table stu1(id int primary key, name char, score float);
2.删除一个表
drop table <table_name>
3.向表里面插入数据
insert into <table_name> values(value1, value2,...);
insert into stu values(1,'xiaomingx',99.9);
//只插入部分字段 id name score
insert into stu(id,name) values(4,'xiaoming')
4.查找数据
(1).查询表中所有记录
select * from <table_name>;
(*表示查询所有的值)
(2)按指定条件查询表中记录
select * from <table_name> where <expression>;
select * from stu where id=2;
select * from stu where id=2 and name='lisi';
select * from stu where id=1 or name='zhangsan';select score from stu where name='LiSi' or id=3; //满足条件的某列
select * from stu limit 5; //只查询前n条记录
select * from stu order by id desc; //按id从大到小进行排序5.修改(更新)数据
update <table_name> set <f1=value1>, <f2=value2>... where <expression>;
update stu set id=10 where id=1;
6.增加字段
alter table <table> add column <field> <type> default ...;
alter table stu add column class int default 1; (表示添加了一列class,默认值为1)
7.删除字段
在数据库当中其实不支持直接删除一个字段(及一列),如果就想删除一列,那么需要三步骤)
(1)创建一个student表,从stu表当中复制id,name,score
create table student as select id,name,score from stu;
(2)删除原有的stu表drop table stu;
(3)重命名
alter table student rename to stu;
最后一列为1的被删除掉了。8.删除一行
delete from stu where score=99.9;
2.使用图形化界面
做完以上操作,我们可以取图形化界面查看数据库,也可以在图形化界面上修改东西。为什么我们一开始不用,因为我们是程序员,能用代码解决的就用代码,这是锻炼我们的能力,所以该学会的必须学会。
打开图形化界面:sqlitebrowser stu.db

数据库结构一栏右边可以浏览数据

双击表格可以修改相应内容

也可以打开别的数据库,可以使用命令,也可以点击第二行第二列下面的 打开数据库。这个很简单,自行探索就好。
3. sqlile3编程(代码实现)
函数接口:
int sqlite3_open(char *path, sqlite3 **db);
**功能:**打开sqlite数据库,如果数据库不存在则创建它
**参数:**path: 数据库文件路径
db: 指向sqlite句柄的指针
**返回值:**成功返回SQLITE_OK(0),失败返回错误码(非零值)
char *sqlite3_errmsg(sqlite3 *db);功能: 获取错误信息
**返回值:**返回错误信息
使用: fprintf(stderr,"sqlite3_open failed %s\n",sqlite3_errmsg(db));
fprintf可以打印错误信息
int sqlite3_close(sqlite3 *db);**功能:**关闭sqlite数据库
**返回值:**成功返回SQLITE_OK,失败返回错误码
int sqlite3_exec(
sqlite3 *db, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *arg, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);(这是一个函数,只是参数比较复杂分开好看)
**功能:**执行SQL操作
**参数:**db:数据库句柄
sql:要执行SQL语句
callback:回调函数(满足一次条件,调用一次函数,用于查询)
再调用查询sql语句的时候使用回调函数打印查询到的数据
arg:传递给回调函数的参数
errmsg:错误信息指针的地址
返回值: 成功返回SQLITE_OK
失败返回错误码
回调函数:
typedef int (*sqlite3_callback)(void *para, int f_num,char **f_value, char **f_name);
**功能:**select:每找到一条记录自动执行一次回调函数
参数: para:传递给回调函数的参数(由 sqlite3_exec() 的第四个参数传递而来)
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组(列值)
f_name:包含每个字段名称的指针数组(列名)
**返回值:**成功返回SQLITE_OK,
失败返回-1,每次回调必须返回0后才能继续下次回调
不使用回调函数执行SQL语句(只用于查询 )
int sqlite3_get_table(sqlite3 *db, const char *sql,char ***resultp, int *nrow, int *ncolumn, char **errmsg);
**功能:**执行SQL操作
**参数:**db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目(但是不包含字段名(表头 id name score))
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址
**返回值:**成功返回SQLITE_OK
失败返回错误码
练习:
实现数据库增删改查。
cs
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
int flag = 0;
//回调函数,打印数据,
int callback(void *buf,int num,char **value,char **name){
if(flag < 1){
for(int i = 0 ; i < num ; i++){
printf("%s ",name[i]);
}
flag ++;
putchar(10);
}
for(int i = 0 ; i < num ; i++)
printf("%s ",value[i]);
putchar(10);
return 0;
}
int main(int argc, const char *argv[])
{
sqlite3 *db;
char *errmsg = NULL;
//打开数据表
if(sqlite3_open("stu.db",&db) != SQLITE_OK){
fprintf(stderr,"sqlite3_open err:%s\n",sqlite3_errmsg(db));
return -1;
}
//创建表
if(sqlite3_exec(db,"create table if not exists student(id int primary key,name string,score float)",NULL,NULL,&errmsg) != SQLITE_OK){
fprintf(stderr,"creare table err:%s\n",errmsg);
return -1;
}
//对数据表导入数据
int num;
char sql[64] = "";
int id;
char name[32] = "";
float score;
printf("请输入你想导入学生的个数:");
scanf("%d",&num);
for(int i = 0 ; i < num ; i++){ //循环输入学生信息
printf("请输入学生信息:");
scanf("%d %s %f",&id,name,&score);
sprintf(sql,"insert into student values(%d,'%s',%f)",id,name,score); //使用sprintf拼接字符串sql
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK){
fprintf(stderr,"insert err:%s\n",errmsg);
return -1;
}
}
//查询表的内容(使用sqlite3_exec()),当函数成功执行才会去执行callback函数,这就是回调函数的意义。
if(sqlite3_exec(db,"select * from student",callback,"long",&errmsg) != SQLITE_OK){
fprintf(stderr,"insert err:%s\n",errmsg);
return -1;
}
//查询表的内容(使用sqlite3_get_table())
char **resultp = NULL;
int row,column;
if(sqlite3_get_table(db,"select * from student",&resultp,&row,&column,&errmsg) != SQLITE_OK){
fprintf(stderr,"sqlite3_get_table:%s",errmsg);
return -1;
}
int a = 0;
printf("###################\n");
for(int i = 0 ; i <= row ; i++){
for(int j = 0 ; j < column ; j ++){
printf("%s ",resultp[a++]);
}
putchar(10);
}
sqlite3_close(db);
return 0;
}
终端可以输入,数据可以导入数据库

数据库成功更新
