Linux数据库开发
结构化:通过特定的模型(关系模型、文档模型)去组织我们的数据;而非零散地存储我们的数据;以行或列进行存储有规则地存储;使查找定位数据更方便
无数据库的场景?
1、手动查询;效率低下
2、
文件系统阶段:文件内容冗余重复(重复信息)、系统逻辑性低:程序依赖文件格式
数据库阶段:采用关系模型(二维表、层次结构去描述数据关联);
1、数据独立性(物理独立性),磁盘存储方式变更:机械硬盘升级到SSD
2、逻辑独立性:表结构新增的字段不需要去修改原有的程序
Sqlite(关系型数据库的标准的操作语言)(事务性比较强、数据一致性要求高的场景)
关系数据库:1、基于关系模型
2、使用SQL语言进行操作
非关系型数据库:1、数据结构不规则;2、进行水平扩展3、对事务要求比较低(缓存实时统计的场景)
它们的区别:
1、数据模型不同:关系模型:关系型:表格(固定的模式);非关系型:键值对、文档、图表(灵活数据模型)
2、事务处理不同:关系型数据库:
ACID原则:原子性、隔离性、一致性、持久性(Atomicity、Consistency、Isolation、Durability)
非关系型:牺牲一致性去提高性能以及可扩展性
3、扩展型:关系型数据库:垂直扩展:增加单个服务器的性能;非关系型:增加水平扩展:通过增加更多的服务器来处理数据
4、适用场景:关系型:适用于复杂查询查询并要求严格我们数据完整性的应用(金融场景);非关系型:适合去处理大规模的数据(高并发访问以及灵活数据模型的场景:社交媒体、大数据分析)
5、性能:关系型:处理复杂数据、复杂查询以及数据一致性表现好;非关系:处理大量数据以及高并发的情况表现好
MySQL是开源关系型数据库管理系统(SC模式)
PostgreSQL是开源对象关系数据库:强调扩展性以及标准的合规性
Orale是差异级别(商业级别)关系数据库(社区版免费;企业版高昂成本:商业授权)
SQLServer是微软开发的商业级别数据库(深度继承了Windows生态):提供了数据存储到商业智能的全套解决方案;有限的跨平台
SQLite是嵌入式零配置(切入式轻量级)的关系型数据库
非关系型:
MongoDB(文档型数据库);面向文档型的NoSQL(JSON文档结构);水平扩展(分片集群)(复杂关联查询性能比关系型弱)
Redis(键值对型数据库)是开源的内存键值存储的数据库;支持多种数据结构(字符串、哈希、列表等)
Neo4(图数据库)采用节点的模式:节点关系属性来表示我们数据;提供高效地图遍历的查询语言
Cassandra(列族型)
常用SQL语句(一)
数据类型
存储类
NULL:值表示无值或未知值
INTEGER:有符号整数,存储在1,2,4,6,8个字节中
REAL:浮点型,存储在8个字节的浮点数字
TEXT:文本字符串
BLOB:存储二进制数据(如图像、音频片段等)
主键设置
一个表中只能有一个主键;但是主键可以由多个列组成(如复合主键)
基本查询语句
SELECT 表示我们要制定查询的列,可以使用*选择表中所有列
FROM确定要查询的哪个数据表
WHERE(可选)设置筛选条件,只有满足条件的行才会被返回;LIKE模糊匹配
ORDER BY(可选)用于对查询结果进行排序:例:[ASC|DESC];ASC是升序;DESC表示降序
增\删:
增:INSERTINTO values
1、表示要插入所有列的方式;要求values子句中的值的顺序与表列中的顺序是完全一致;
CREATE TABLE表
2、插入指定列的数据
INSERT INTO table_name {column1,column2,...}VALUES(value1,value2,...);//colunm指定列,values插入的值;
对于未指定插入的列我们会给它一个默认值;如果没有默认值我们给它设置为空值
删
语法:DELETEFROMtable_name [WHERE condition];
如果不加WHERE就是删除表中所有行
改
语句:UPDATE
语法:UPDATE table_name SET column1 = value1 ,column2= value2,...[WHERE condition]
如果没有WHERE会更新所有行
WHERE指定删除某一行;加上这个条件限制避免我们误删数据库中的表中的数据
SQL语句(二)聚合/通配符
聚合函与通配符
count()统计计数数量
统计满足特定条件的 记录数用count
SELECT AVG(score) FROM student
聚合语句
GROUP BY
统计每个年级每个班的学生人数
SELECT grade class COUNT(student_id)FROM students
GROUP BY grade class//把多列数据进行分组;
首先是年级进行分组,然后在每个年级里再按班分组;最后去统计每个分组的一个学生人数
HAVING只能用于GROUP BY查询之后;使用聚合函数进行筛选
通配符
%与-
'A%';'-o-';
别名:更好地区分名字;提高查询的可读性以及维护性
AS 关键字
SQL语言(三)事务处理
事务:原子性操作
事务控制命令
BEGIN TRANSACTION-(开启显示事务)>COMMIT(提交)->ROLLBACK(回滚)
隐式事务:每条独立的SQL语句自动包裹在一个事务中,执行后立即提交(无需手动BEGIN和COMMIT)
特点:操作简单,但无法保证多步骤操作的原子性
事务嵌套
Linux中的数据库操作
| 区别 | 无BEGIN(隐式事务) | 有BEGIN(显式事务) |
|---|---|---|
| 事务粒度 | 一个SQL语句就是一个事务,每个SQL相互独立 | 多条共用一个事务,任意一条报错—>ROLLBACK,两条全部撤回。数据原样退回 |
| 能不能中途回滚 | 不能 | 能ROLLBACK |
| 适用场景 | 无关联语句,自带完整事务(原子性) | 有关联的语句,必须BEGIN,手动统一事务 |
操作:创建连接数据库->创表->增删改查数据库->事务处理->完成操作
Linux与Sqlite是分离的;Sqlite3是Linux的命令,用于启动数据库;进入数据库后只需输入纯SQL语句;理解:使用WHERE约束与事务的重要性,防止操作出错。schema查看表结构
SQLIte3 与C语言接口
流程
数据库连接管理
函数原型:
int sqlite3_open(const char *filename,sqlite3 **ppDd);
filename:临时数据库(断开后数据丢失),适用于临时数据存储的场景
ppDd:数据库句柄指针;数据库连接的返回值通过ppDd返回;
如果sqlite无法分配内存来保存sqlite3 的数据库对象,我们会将NULL值写到ppDd中;而不是指向sqlite3对象的指针
ppDd是指向sqlite3的结构体的指针的指针;通过修改这个指针将数据库句柄(连接标识)返回给我们,我们去调用open
返回值:SQLITE_OK 成功,其他为错误码
作用:建立与数据库的连接:若文件不存在,自动创建空数据库;若存在则打开,直接在内存中初始化
int sqlite3_close(sqlite3 *db)
作用:关闭数据库,释放资源
有预处理指令我们需要使用sqlite_findize函数去释放预处理语句占用的资源之后才能调用这个close函数
执行sqlite语句主要通过sqlite3_exec这个函数去执行的,它支持我们增删改查、事务处理的语句;
根据我们是否需要处理查询结果,我们将执行分为带回调和不带回调的两种方法
带回调使用:sqlite3_exec
原型int sqlite3_exec(sqlite3 *db,const char *sql,int (*callback)(void*,int,char**),coid *userdata,char **errmsg);
功能:解析并执行我们输入的sqlite语句
调用sqlite_tree释放内存空间;否则造成内存泄漏;
作用:执行SQL语句
查询接口用callback函数
原型int call(void *userdata,int argc,char **argv,char **colNames);
userdata:给回调函数传入的用户数据:传递上下文的(文件指针,结构体指针)
argc:每行结果的列数:当前行的字段数量
argv:指向当前行数据的字符串数组,每一个元素都对应着一个列的值;如果列为NULL,则argv[i]为NULL,每一个元素对应一个字段的一个值
非回调查询
原型:
int sqlite3_get_table(sqlite3*db,const char *sql,char ***resultp,int *nrow,int *ncolumn,char**errmsg);
resultp:指向二维数组的指针(输出参数);内存由sqlite3进行分配
预处理语句
prepare(准备语句)->bind(对语句的参数进行绑定)->step(执行语句)->findize(释放内存)
绑定参数
int sqlite3_bind_int(sqlite3_stmt *stmt,int idx,int value);
value如果是静态的字符串或不需要释放;我们传入SQLITE_STATIC;拷贝数据并且由sqlite管理生命周期我们传入SQLITE_TRANSIENT
执行预处理语句
int sqlite3_step(sqlite3_stmt *stmt);
作用:执行预处理语句
注意事项:
必须在我们close之前调用sqlite3_finalize(防止内存泄漏);释放sqlite语句的句柄、占用的资源与绑定的参数及内部的缓存;否则在调用close之后去使用sqlite3_finalize会造成内存泄漏
MySQL数据库
MySQL架构分为三层
客户端应用程序层、MySQL服务器层、储存引擎层
应用层通过与MySQL服务器层进行交互来操作数据库;MySQL服务器包含了许多重要组件(连接器:建立与客户端的连接请求,查询缓存:缓存执行过的查询语句以及结构;分析器:对客户端发送的SQL语句进行语法分析,优化器:对SQL语句进行优化,选择最优的执行;执行器:执行我们优化后的SQL语句,与储存引擎层进行交互);
网络字典服务器介绍
注册、登录、查询客户端、服务端
词典文件存储大量单词以及解释
回调机制;文件处理流程、协议设计、服务器整体的启动流程;子进程处理请求的流程
实现网络词典服务器的搭建
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)