学习记录——day35 数据库 sqlite3

news2024/11/15 12:01:46

目录

一、安装sqlite3数据库以及sqlite3函数库

二、数据库的结构

 三、常用数据库类型

1、sqlite3

2、mysql

四、sqlite3数据库的使用

1、打开数据库

 2、sqlite3数据库中指令的使用

1)界面指令

2)操作指令

3)大小写敏感性

3、创建表单

4、约束类型相关

1)主键约束:primary key

2)默认约束:default

3)非空约束:not null

4)检测约束:check

5、向表单中添加数据

6、查看表单数据

 7、查看特定数据

8、修改表单中指定数据

9、删除表单中指定的数据

10、排序显示所有数据

11、范围查看

12、模糊查询

13、给字段表单添加新的字段

14、表单重命名

15、删除表单

16、字段名重命名

17、删除字段

五、数据库函数(API)

1、打开数据库:sqlite3_open

2、操作数据库:sqlite_exec

3、读取数据库数据:teble


一、安装sqlite3数据库以及sqlite3函数库

sudo apt install sqlite3 //安装数据库

sudo apt install libsqlite3-dev //安装数据库的函数库

二、数据库的结构

        数据库是一种存放数据的的文件,但是拥有特殊的结构

第一层结构:数据库本身

第二层结构:数据库中存放了若干张表单

        每一张表单的字段结构各不相同

第三次结构:一张表单中,所有字段都能存放信息

        一组字段中的所有数据,就是一条记录

 三、常用数据库类型

1、sqlite3

        一个允许部署在本地的轻量级数据库,特别合适嵌入式开发

2、mysql

        一个部署在服务端的,需要网络连接的数据库。如果要部署在本地,夜需要安装一个mysql服务器。

        适合一些应用层程序开发

四、sqlite3数据库的使用

1、打开数据库

        输入指令:sqlite3 数据库名.db

 2、sqlite3数据库中指令的使用

1)界面指令

        以点“.”开头,回车确认输入

        .table:查看当前数据库中所有表单的名字

.      

        .schema 表单名:查看当前数据库中指定的表单中的字段结构

                                      若没有指定,则查看所有

        

        .head(er) on 在查看表单时打开抬头

        

        .mode column  字段对齐

       

        .quit  保存并退出sqlite3

2)操作指令

        以分号“;”为指令结束的标志,再键入回车,否则sqlite3不认为这条指令结束了

3)大小写敏感性

        sqlite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。

3、创建表单

        create table 表单名

        {

                字段名1        数据类型1        约束类型1

                 ...                   ...                   ...

                字段名n        数据类型n        约束类型n

        }

字段名:变量名

数据类型:

        整型        INTERFGER

        浮点型     REAL

        字符串     TEXT

        ...

约束类型:对数据进行规定

4、约束类型相关

1)主键约束:primary key

        键:用于比较大小,确定数据存放位置的关键数据。这个数据不能重复,不能修改

               被主键约束的字段,成为了表单中的“键”,剩下的都是“值”

               被主键约束的字段,可以用 auto_increment/auto increment/auto increment 修饰

auto_increment/auto increment

功能

2)默认约束:default

        在添加新纪录的时候,如果没有为拥有默认约束的字段,填充数据的话,数据库会选用默认值填充

3)非空约束:not null

        在添加新记录的时候,如果没有为 非空约束 所修饰的字段,填充数据的话,则本次记录添加失败

4)检测约束:check

        在添加记录的时候,会检查被检查约束的字段所填充的数据,是否满足"检查条件",如果不满足则添加失败

5、向表单中添加数据

insert into 表单名(字段1,字段2...,字段n)values(数据1,数据2,...,数据n)

向表单中添加 字段1——字段n 的数据

如果有任意一个数据违反了约束,则添加失败

6、查看表单数据

查看指定

select 字段1,字段2,...字段n from 表单名

查看所有

select * from 表单名

insert指令 和 select指令可以配合使用实现拷贝

insert into 表单1(字段1,字段2,....,字段n) select 字段1,字段2,...,字段n from 表单2

        先查询出表单2中的所有指定字段的数据,再将这些数据,对应的添加到表单1中的每一个字段中去

 7、查看特定数据

通过where子句限制

        select * from 表单名 where 条件定位

        比如说,想要查看 姓名(字段)为"张三"(数据)的所有信息

        select * from stu where 姓名="张三"

8、修改表单中指定数据

update 表单名 set 字段名 = 新数据 where 条件定位

例如:将姓名为"张三"的成绩,改成50分

update stu set 成绩=50 where 姓名="张三"

9、删除表单中指定的数据

delete from 表单名 where 条件定位

如果不写 where 条件定位,会将表单中的所有数据删除

为防止数据的误删,基本不用delete指令

一般会在表单中加上一个字段叫做“delete”,值只有0或非0

查询的时候,只要在最后加上 where delete=0,被标记删除的数据(delete= 1)就不会显示

10、排序显示所有数据

order by 字段名

默认升序

order by 字段名 desc

降序

11、范围查看

limit x offset y

从第y行开始,显示x条记录,y从0开始

若无offset,则默认从0开始

select、limit、order可配合使用查看某一表单中某一字段数据最高/最低的几个

select * from 表单名 order by 字段名 desc limit 3

12、模糊查询

like子句 % _  * ? like 子句 % _ (* ?)
使用like的时候,使用 _ 表示1个字符的站位,使用 % 表示 0~n个字符的占位
例如:
    select * from stu where name like "徐_"
        查询姓徐的,并且名字只有1个字的 
    select * from stu where name like "_徐_"
        查询名字3个字的,并且中间那个字是 徐 
    select * from stu where name like "徐%"
        查询姓徐的,名字有几个字无所谓,哪怕只有徐,没有名字也行
    select * from stu where name like "%徐%"
        查询所有名字中带 徐 的

13、给字段表单添加新的字段

alter table 表单名 add column 字段名 数据类型 约束类型

14、表单重命名

alter table 原表单名 rename 同 新表单名

15、删除表单

drop table 表单名

16、字段名重命名

sqlite3不支持直接重命名字段,mysql支持

sqlite3要实现字段重命名需要通过逻辑实现

1)修改原表单名为一个任意的名字

2)以原表单原名创建一个新的表单,除要修改的字段名外,其余皆与原表单相同

3)使用 insert + select 将原表单的数据拷贝到新表单中去

4)删除原表单

17、删除字段

sqlite3不支持直接删除字段,mysql支持

sqlite3要实现字段删除需要通过逻辑实现

1)修改原表单名为一个任意的名字

2)以原表单原名创建一个新的表单,除要删除的字段名外,其余皆与原表单相同

3)使用 insert + select 将原表单的需要数据拷贝到新表单中去

4)删除原表单

五、数据库函数(API)

        sqlite3函数库对应头文件:#include<sqlite3.h>

        编译时链接数据库:-l sqlite3

1、打开数据库:sqlite3_open

 原型:int sqlite3_open(const char* pathname,sqlite3** db)
 调用:    sqlite3* db;
         sqlite3_open("./test.db",&db)
 功能描述:打开pathname数据库,如果不存在,则创建后打开
 参数分析:
     参数 pathname:准备打开的数据库的路径名
     参数 db:sqlite3*变量 db的地址,说明db会在函数内部发生改变,该变量在open函数内部用来接受打开的数据库的描述符
         未来操作该数据库,都要通过这个db变量来操作
返回值:成功打开返回 SQLITE_OK,失败打开返回一个错误码(SQLITE_XXXX)

关闭数据库:
sqlite3_close(sqlite3* db)

2、操作数据库:sqlite_exec

原型:int sqlite3_exec(sqlite3* db,const char* cmd,int(*callback)(void*,int,char**,char**),void* arg,char** errmsg);
调用:
功能描述:让数据库db执行 sql语句 cmd
参数分析:
    参数 db:数据库描述符
    参数 cmd:sql语句
到此为止:如果只是执行将数据写入数据库的操作,只用前2个参数就够了,后面的所有参数写0就行了
    参数 callback:一个函数指针,指向了一个 int(void*,int,char**,char**) 这样的一个函数的指针
    参数 arg:单纯的给callback函数传递一个地址,方便callback函数能够将读取到的数据库的数据,存放到指定地址上去,以便主函数能够访问这些数据
    参数 errmsg:传一个char*字符串的地址,该字符串会在exec函数内部发生改变,变成sql语句执行时候的错误
    
    注意:sqlite3_exec 只要 sql 语句是正确的情况,就会执行成功

原型:int callback(void* arg,int argc,char** argv,char** column)

功能描述:当sqlite3_exec函数,执行的是 select 语句的时候,从数据库获取的数据(包括字段的名字),会第一时间进入callback函数

例如:执行语句 select * from stu2;
查询到的数据如下:
    姓名          score     

    张三          100       
    李四          150       
    王五          90        
    赵六          120       
    王五          125 
这些所有的内容,都会以参数的形式,进入callback函数  
每一条记录,都会单独的调用一次callback函数        
上面查到了5条记录,所以callback函数会在 sqlite3_exec函数内,被回调5次

每条记录有2个字段:argc = 2
当第一条记录 {"张三",100} 回调 callback的时候
    argv[2] = {"张三","100"}
    column[2] = {"姓名","score"}
    
当第二条记录 {"李四",150} 回调callback的时候
    argv[2] = {"李四","150"}
    column[2] = {"姓名","score"}
    
返回值:返回1表示不再接受下一条记录,返回0表示继续接受下一条记录,直到没有记录可接受为止

3、读取数据库数据:teble

原型:int sqlite3_get_table(sqlite3* db,const char* cmd,char*** buf,int* recordno,int* columnno,char** errmsg)
功能描述:获取数据库中所有数据,以及获取到底有几条记录以及每一条记录有多少个字段
参数分析:
    参数 db:数据库描述符
    参数 cmd:sql语句
    参数 buf:要传一个 char** 指针的地址,从数据库获取到的所有数据,包括字段名,都会存入这个指针指向的地址里面去
    参数 recordno:用来存放读取到的记录的条数
    参数 columnno:用来存放读取到的每一条记录,有几个字段
    参数 errmsg:同sqlite3_exec中的errmsg
    
例如:数据库查询结果为
    姓名          score     

    张三          100       
    李四          150       
    王五          90        
    赵六          120       
    王五          125   
最终,buf结构如下:buf[n] = {"姓名","score","张三","100","李四","150","王五","90","赵六","120","王五","125"}                  
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32开发的智能家居灯光控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化灯光控制逻辑传感器数据采集Wi-Fi通信与远程控制应用场景 家庭智能灯光管理办公室与商业环境的智能照明常见问题及解决方案 常见问题解决方案结论 1. 引言 随着智能家居技术的普及…

尚品汇-购物车列表、临时用户购物车与登录用户购物车合并实现(三十七)

目录&#xff1a; &#xff08;1&#xff09;功能—展示购物车列表 &#xff08;2&#xff09;在web-all添加前端实现 &#xff08;3&#xff09;功能--合并购物车 &#xff08;1&#xff09;功能—展示购物车列表 购物车列表接口&#xff1a;CartService /*** 通过用户Id …

Ps:高速缓存机制

Photoshop 的高速缓存 Cache技术利用缓存和分块的方法处理图像数据&#xff0c;通过合理设置高速缓存级别和拼贴大小&#xff0c;可以有效地提升软件在处理图像时的性能。 Ps菜单&#xff1a;编辑/首选项 Edit/Preferences “首选项”中提供了 8 种高速缓存级别。 增加高速缓存…

一文带你读懂反向代理服务器

文章目录 一、什么是反向代理&#xff1f;二、反向代理的主要特点2.1 负载均衡2.2 隐藏IP2.3 响应加速2.4 过滤非法请求 三、反向代理的应用场景3.1 负载均衡3.2 SSL/TLS终止3.3 日志记录3.4 URL重写3.5 API网关3.6 CDN服务 四、区分反向代理和正向代理4.1 从工作原理上4.2 从安…

Memcached:单节点、集群案例;概念、工作原理

目录 案例前置知识点 Memcached 概念 部署场景 Memcached常用架构 流程 Memcached Memcached API 数据存储方式 数据过期方式 LRU Lazy Expiration Memcached缓存机制 Memcached路由算法 求余数hash算法 一致性hash算法 Memcached分布式 案例 单节点Memcach…

2024电工杯B题完整论文

大学生平衡膳食食谱的优化设计及评价 摘要 大学阶段是学生获取知识和身体发育的关键时期&#xff0c;也是形成良好饮食习惯的重要阶段。然而&#xff0c;当前大学生中存在饮食结构不合理和不良饮食习惯的问题&#xff0c;主要表现为不吃早餐或早餐吃得马虎&#xff0c;经常食…

如果这10道关于数据库的测试题你都会,面试必过!

一、什么是数据库测试&#xff1f; 数据库测试也称为后端测试。数据库测试分为四个不同的类别。 [if !supportLists] [endif]数据完整性测试 [if !supportLists] [endif]数据有效性测试 [if !supportLists] [endif]数据库相关的性能 [if !supportLists] [endif]测试功能&a…

【数据结构】二叉树顺序结构之堆的实现

1. 前言 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&…

【Python机器学习】NLP分词——利用分词器构建词汇表(二)——点积

在自然语言处理中将会有多处用到点积&#xff0c;点积也被称为内积&#xff0c;这是因为两个向量&#xff08;每个向量中的元素个数&#xff09;或矩阵&#xff08;第一个矩阵的行数和第二个矩阵的列数&#xff09;的“内部”维度必须一样&#xff0c;这种情况下才能相乘。这个…

【Docker】以思源笔记为例,谈谈什么是端到端加密

本文首发于 ❄️慕雪的寒舍。 链滴&#xff08;思源笔记社区&#xff09;里面有不少老哥似乎不太了解思源使用的端到端加密功能&#xff0c;以及云同步功能背后的机制。本文将以思源笔记为例&#xff0c;谈谈什么是端到端加密&#xff0c;以及思源的同步功能中用到了什么计算机…

JavaSE基础(12)——文件、递归、IO流

1、IO流 Input&#xff1a;输入&#xff0c;写数据&#xff0c;数据从磁盘加载到内存&#xff08;程序&#xff09;中。 Output&#xff1a;输出&#xff0c;读数据&#xff0c;数据从内存&#xff08;程序&#xff09;存储到磁盘中。 流&#xff1a;不管是读还是写&#xf…

html一文入门---标签大合集

一、文档结构标签 <!DOCTYPE html>: 声明文档类型和 HTML 版本&#xff0c;告诉浏览器使用 HTML5 解析文档。<html>: HTML 文档的根元素。<head>: 包含文档的元数据&#xff08;如标题、字符集、样式表链接&#xff09;。<title>: 定义文档的标题&…

这本书已经无敌!一本书学懂NLP自然语言(附PDF文档)

自然语言处理被誉为“人工智能皇冠上的明珠”。深度学习等技术的引入为自然语言处理技术带来了一场革命&#xff0c;尤其是近年来出现的基于预训练模型的方法&#xff0c;已成为研究自然语言处理的新范式。而今天给大家推荐的这本《自然语言处理&#xff1a;基于预训练模型的方…

详细的爱剪辑官网免费版下载步骤,还有四款剪辑工具推荐!

在当下这个数字化、自媒体蓬勃发展的时代&#xff0c;视频剪辑已成为大家日常中的一项不可或缺的技能。面对市面上丰富多样的剪辑工具&#xff0c;许多初学者往往感到困惑&#xff0c;不知道该如何选择。今天接这篇文章给大家详细解析五款常用的视频剪辑软件&#xff0c;包括还…

数字工厂管理系统与MES系统集成后有哪些作用

在当今智能制造的浪潮中&#xff0c;数字工厂管理系统与MES管理系统的深度融合与集成&#xff0c;已成为推动企业转型升级、提升生产效率与竞争力的关键路径。两者协同工作&#xff0c;不仅实现了生产过程的透明化、智能化管理&#xff0c;还促进了资源优化配置与决策支持能力的…

Python读取fasta格式数据成为字典形式。

本团队提供生物医学领域专业的AI&#xff08;机器学习、深度学习&#xff09;技术支持服务。如果您有需求&#xff0c;请扫描文末二维码关注我们。 Python读取fasta格式数据成为字典形式。 def read_fasta(file_path):"""读取FASTA格式文件&#xff0c;并返回一…

基于vue框架的毕业设计管理系统5n36i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,教师,课题信息,题目分类,选题信息,任务书,中期检查,提交论文,论文成绩,答辩成绩,校园公告,教研主任,申报课题 开题报告内容 基于Vue框架的毕业设计管理系统开题报告 一、引言 随着高等教育的不断发展&#xff0c;毕业设计作为培…

2024年中科院SCI期刊牛顿-拉夫逊优化算法NRBO优化Transformer-LST模型的多变量时间序列预测

matlab R2024a以上 一、数据集 二、2024年中科院SCI期刊牛顿-拉夫逊优化算法NRBO 牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)是一种新型的元启发式算法&#xff08;智能优化算法&#xff09;&#xff0c;该成果由Sowmya等人于2024年2月发表在中科院2区Top SC…

OpenHarmony开发实战: 一种应用界面UI自动化测试方法

前言&#xff1a; 随着 OpenHarmony 版本更新&#xff0c;应用生态繁荣&#xff0c;如何对应用界面进行自动化测试成为一个迫切的问题。一般情况&#xff0c;对应用的界面测试都是通过人工进行&#xff0c;效率低&#xff0c;误判率高&#xff0c;本文将介绍一种通过图片对比进…

OpenCV Lesson 2: 如何使用OpenCV扫描图像、查找表和时间测量

How to scan images, lookup tables and time measurement with OpenCV Goal目标Our test case我们的测试用例How is the image matrix stored in memory? Goal We’ll seek answers for the following questions: How to go through each and every pixel of an image? How…