学习记录——day35 数据库 sqlite3

目录

一、安装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.rhkb.cn/news/407345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外排序之文件归并排序实现

外排序介绍 外排序是指能够处理极大量数据的排序算法。通常来说&#xff0c;外排序处理的数据不能一次装入内存&#xff0c;只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是⼀种“排序-归并”的策略。在排序阶段&#xff0c;先读入能放在内存中的数据量&#x…

贪吃蛇(Qt版)

目录 一、项目介绍 界面一&#xff1a;游戏大厅界面 界面二&#xff1a;关卡选择界面 界面三&#xff1a;游戏界面 最终游戏效果&#xff1a; 二、项目创建与资源配置 1. 创建项目 2. 添加项目资源文件 三、项目实现 1. 游戏大厅界面 2. 关卡选择界面 3. 游戏房间界…

TCP 粘包问题

TCP是一个面向字节流的传输层协议。“流” 意味着 TCP 所传输的数据是没有边界的。这不同于 UDP 协议提供的是面向消息的传输服务&#xff0c;其传输的数据是有边界的。TCP 的发送方无法保证对方每次收到的都是一个完整的数据包。于是就有了粘包、拆包问题的出现。粘包、拆包问…

进程的创建、终止

目录 前言1. 进程创建2. 进程终止3. exit && _exit 的异同3.1 相同点3.2 不同点 前言 紧接着进程地址空间之后&#xff0c;我们这篇文章开始谈论进程控制相关的内容&#xff0c;其中包括进程是如何创建的&#xff0c;进程终止的几种情况&#xff0c;以及进程异常终止的…

Android低内存设备系统优化

切记,所有的优化都遵循一条准则: 空间换时间,时间换空间。 一、前言 我们为什么会觉得卡顿、不流畅? 卡顿等性能问题的最主要根源都是因为渲染性能,Android系统很有可能无法及时完成那些复杂的界面渲染操作。Android系统每隔16ms发出信号,触发对UI进行渲染,如果每次渲染…

Thinkphp6 反序列化漏洞分析

本文来自无问社区&#xff0c;更多实战内容可前往查看http://wwlib.cn/index.php/artread/artid/10431.html 版本&#xff1a;Thinkphp6&PHP7.3.4 TP 环境搭建利用 composer 命令进行&#xff0c;同时本次分析在 windows 环境下进行 composer create-project topthink/t…

Android 架构模式之 MVP

目录 架构设计的目的对 MVP 的理解代码ModelViewPresenter Android 中 MVP 的问题试吃个小李子ModelViewPresenter效果展示 大家好&#xff01; 作为 Android 程序猿&#xff0c;你有研究过 MVP 架构吗&#xff1f;在开始接触 Android 那一刻起&#xff0c;我们就开始接触 MVC…

高频变压器无功补偿怎么做

高频变压器的无功补偿主要是为了提高功率因数、减小无功损耗、提高电源利用率。在高频电路中&#xff0c;由于频率较高&#xff0c;传统的无功补偿方法需要进行一定的调整和优化。以下是高频变压器无功补偿的一些方法和建议&#xff1a; 1、无功补偿电容器 高频电容器选择&…

具有手势识别的动捕设备——mHand Pro VR数据手套

数据手套是指通过手套内置的传感器&#xff0c;实时采集手部运动数据的动捕设备&#xff0c;通常被应用于虚拟仿真、虚拟现实vr交互、动画制作等领域。其中&#xff0c;基于惯性动作捕捉技术研发的数据手套&#xff0c;凭借其高性价比的优势&#xff0c;在市面上的应用更为广泛…

STM32G474按钮输入和点灯

在获取到工程模板后&#xff0c;学习某个CPU的第一步通常都是IO口操作。因此按钮输入和点灯&#xff0c;就是本次学习的第一个程序。先从简单入手。 和GPIO操作有关的函数如下: __HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟 __HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB时钟 _…

深度理解指针(2)

hello各位小伙伴们&#xff0c;关于指针的了解我们断更了好久了&#xff0c;接下来这几天我会带领大家继续我们指针的学习。 目录 数组名的理解 使用指针访问一维数组 一维数组传参的本质 二级指针 指针数组 使用指针数组来模仿二维数组 数组名的理解 我们首先来看一段…

【开源社区】Elasticsearch(ES)中 exists 查询空值字段的坑

文章目录 1、概述2、使用 null_value 处理空值3、使用 exists 函数查询值为空的文档3.1 使用场景3.2 ES 中常见的空值查询方式3.3 常见误区3.4 使用 bool 查询函数查询空值字段3.5 exists 函数详解3.5.1 bool 查询的不足3.5.3 exists 的基本使用 3.6 完美方案 1、概述 本文主要…

单例模式 详解

单例模式 简介: 让类只初始化一次, 然后不同的地方都能获取到同一个实例 这是非常常用的一种模式, 系统稍微大一点基本上都会用到. 在系统中, 不同模块的总管理类都已单例模式居多 这里我们不仅使用c实现单例模式, 也会用python2实现一遍 python代码 想要看更详细的python单…

手动下载Sentinel-1卫星精密轨道数据

轨道信息对于InSAR&#xff08;干涉合成孔径雷达&#xff09;数据处理至关重要&#xff0c;因为它影响从初始图像配准到最终形变图像生成的整个过程。不准确的轨道信息会导致基线误差&#xff0c;这些误差会以残差条纹的形式出现在干涉图中。为了消除由轨道误差引起的系统性误差…

Swift 6.0 如何更优雅的抛出和处理特定类型的错误

概述 从 Swift 语言诞生那天儿起&#xff0c;它就不厌其烦一遍又一遍地向秃头码农们诉说着自己的类型安全和高雅品味。 不过遗憾的是&#xff0c;作为 Swift 语言中错误处理这最为重要的一环却时常让小伙伴们不得要领、满腹狐疑。 在本篇博文中&#xff0c;您将学到如下内容&…

基于网格尺度的上海市人口分布空间聚集特征分析与冷热点识别

在上篇文章提到了同一研究空间在不同尺度下的观察可能会带来不同的见解和发现&#xff0c;这次我们把尺度缩放到网格&#xff0c;来看网格尺度下的空间自相关性、高/低聚类&#xff0c;这些&#xff0c;因为尺度缩放到网格尺度了&#xff0c;全国这个行政区范围就显的太大了&am…

基于Shader实现的UGUI描边解决方案遇到的bug

原文链接&#xff1a;https://www.cnblogs.com/GuyaWeiren/p/9665106.html 使用这边文章介绍的描边解决方案时遇到了一些问题&#xff0c;就是文字的描边经常会变粗&#xff0c;虽然有的时候也可以正常显示描边&#xff0c;但是运行一会儿描边就不正常了&#xff0c;而且不正常…

UDP+TCP

一、UDP协议 1.recvfrom:recvform(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen); 参数&#xff1a;socket的fd; 保存数据的空间地址 &#xff1b; 空间大小&#xff1b; 默认接收方式&#xff08;默认阻塞&#xf…

【案例56】安全设备导致请求被拦截

问题现象 访问相关报表 第二次访问发现有相关的连接问题 问题分析 服务器访问相关节点&#xff0c;发现相关节点无此问题。从客户的客户端访问缺有问题。在nclog中发现如下日志&#xff0c;链接被重置。 直接访问服务器无丢包现象。客户端未开防火墙。装了杀毒软件已经卸载。…

简单记录:两台服务器如何超快速互传文件/文件夹

在服务器间传输文件和文件夹是一个常见的任务&#xff0c;尤其是在需要同步数据或进行备份时。以下是使用 scp 命令在两台服务器之间进行文件传输的基本步骤。 服务器A 至 服务器B&#xff1a;文件传输指南 前提条件 确保服务器A和服务器B之间网络互通。确认您有权限访问目标…