网络编程(数据库:SQLite)

思维导图

数据库安装

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是一个小型关系型数据库管理系统。开放源码 (嵌入式不需要存储太多数据)

MySQLSQLite 区别:

MySQL和SQLite是两种不同的数据库管理系统,它们在多个方面有所不同。

  1. 性能和规模:MySQL通常用于大型应用程序和网站,它可以处理大量数据和高并发访问。SQLite则更适合于小型应用程序或移动设备,因为它是一个轻量级的数据库引擎,不需要独立的服务器进程,可以直接访问本地文件。

  2. 部署和配置:MySQL需要单独的服务器进程来运行,需要配置和管理数据库服务器。而SQLite是一个嵌入式数据库,可以直接嵌入到应用程序中,不需要单独的服务器进程。

  3. 功能和特性:MySQL提供了更多的功能和高级特性,比如存储过程、触发器、复制和集群支持等。SQLite则是一个轻量级的数据库引擎,功能相对较少,但对于简单的数据存储和检索已经足够。

  4. 跨平台支持: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;
}

终端可以输入,数据可以导入数据库

数据库成功更新

相关推荐
Mylvzi几秒前
【MySQL 从 0 讲解系列】深入理解 GROUP BY 的本质与应用(含SQL示例+面试题)
数据库·sql·mysql
运维成长记7 分钟前
阿里云实践创建实例步骤
linux·运维·服务器·阿里云·云计算
THe CHallEnge of THe BrAve22 分钟前
Linux检验库是否安装成功
linux·运维·服务器
Forest_HAHA36 分钟前
<6>-MySQL表的增删查改
数据库·mysql
blammmp41 分钟前
Redis: List类型
数据库·redis·缓存
Leo.yuan1 小时前
数据挖掘是什么?数据挖掘技术有哪些?
大数据·数据库·人工智能·数据挖掘·数据分析
梦境虽美,却不长1 小时前
C语言 学习 宏命令(预处理) 2025年6月9日14:41:39
c语言·开发语言·学习
算家计算1 小时前
告别复杂文档解析噩梦!MonkeyOCR 本地部署教程:支持公式/表格多元素结构化
linux·人工智能·开源
时时三省1 小时前
【时时三省】(C语言基础)将外部变量的作用域扩展到其他文件
c语言
曹勖之2 小时前
ROS2 工作空间中, CMakeLists.txt, setup.py和 package.xml的作用分别是?
xml·linux·服务器·ros2