用sqlite制作对局记录管理

1. sqlite简介

sqlite是一款非常轻便小巧的数据库,以C语言开发,已流行了数十年,据说是世界上部署最多的数据库。为什么是部署最多的呢?因为它根本不需要数据库服务器,且可以在任意设备、任意操作系统上部署。因此,很多应用程序,无论是Windows的、Linux的、Mac的、甚至嵌入式的,它们都内嵌了sqlite数据库。可想而知,就部署数量而言,确实没什么数据库可以和它竞争。为什么它可以做到在任意设备任意操作系统上部署呢?一是因为它的一个数据库就是一个单一的文件;二是因为它的数据库程序是纯C写的,只要编译好就可以运行在这些地方,并且据说只有一个C文件。

  • sqlite的官网:https://www.sqlite.org/index.html
  • sqlite手册网站:https://www.sqlitetutorial.net/

2. sqlite的安装

sqlite的安装特别简单。如果不想从源码编译的话,直接下载二进制文件即可运行。
sqlite下载页面:https://www.sqlite.org/download.html

本文以Windows为例,因此下载 “Precompiled Binaries for Windows” 这下面的。
这下面有 sqlite-dll-win-x64-3440200.zip (1.24MB) 和 sqlite-tools-win-x64-3440200.zip (4.71MB) 这2个。我们只要下载后者即可。前面那个dll的可能是应用程序调用sqlite的API用的,和本次实验无关。

下载完并解压之后,我们在这个解压好的文件夹下可以看到 3 个exe文件,而本次我们只需用到 sqlite3.exe.

3. 用sqlite制作对局记录管理

3.1 问题描述

有一些对局记录,可以利用sqlite进行管理。这些对局记录很简单,只包含日期、对手ID、结果这三个要素。而结果可以用1、-1、0来分别表示胜、负、平。
这些对局记录已写入csv文件,样例 20231216.csv 如下:

2023-12-16,57793,1
2023-12-16,41864,1
2023-12-16,41864,-1

3.2 表设计

根据以上所描述的对局记录的特点,很容易地设计表 go_records 如下:

CREATE TABLE go_records
(id INTEGER PRIMARY KEY AUTOINCREMENT,date DATE,player INT,result  INT
);

这里使用自增id是为了避免将来在删除某条记录时,因存在其他三要素完全一致的记录而造成误删。

貌似设计好了,但这里有一个问题:将来我们可以利用 sqlite 的.import命令来导入csv文件时,由于自增id的存在就会引起导入失败,因为csv文件中没有自增id这一列。
怎么处理呢?
笔者不是数据库专家,没有想到特别好的办法。想到的一个办法是:再创一张临时表;先将csv导入到临时表,再将临时表导入到上面的 go_records 表中。临时表不需要id,而临时表导入到最终表的过程中,因使用 INSERT INTO 语句,从而可以实现自创并自增id.

临时表的设计如下:

CREATE TABLE tmp_go_records
(date DATE,player INT,result  INT
);

而导入完csv文件之后,将临时表再导入到 go_records 表中的语句如下:

INSERT INTO go_records (date, player, result)
SELECT date,player,result FROM tmp_go_records;

3.3 运行sqlite并导入csv文件

步骤如下:

  1. 运行 sqlite3 .\go.db
    这是打开 go.db 文件记录的数据库。另一种运行方式如下:
sqlite3
.open C:\users\Finix\sqlite3\go.db

值得一提的是,.help命令可以看到各个帮助选项。

  1. 创建临时表和最终表
    这里将上面的语句拷贝过来,以作为一份完整的步骤。
DROP TABLE IF EXISTS go_records;
DROP TABLE IF EXISTS tmp_go_records;CREATE TABLE go_records
(id INTEGER PRIMARY KEY AUTOINCREMENT,date DATE,player INT,result  INT
);CREATE TABLE tmp_go_records
(date DATE,player INT,result  INT
);
  1. 导入已准备好的csv文件
.mode csv
.import ./records/20231216.csv tmp_go_records
.import ./records/20231215.csv tmp_go_records

以上是导入了2天的csv数据。注意,以上语句不能加分号,否则无效但又不会报错。

  1. 运行sql将临时表导入最终表
INSERT INTO go_records (date, player, result)
SELECT date,player,result FROM tmp_go_records;
  1. 备份数据库

如果不太放心一个数据库文件,可以再备份一个。命令如下:

.save go.db.bak
  1. 退出sqlite
.exit

3.4 一些有趣的SQL

这么一张只有4列的表(其中一列还是自增id)能有什么有趣的SQL呢?

  • 与多少棋手交过手
select count(distinct player) from go_records;
  • 某天下了多少盘
select count(*) from go_records where date in ('2023-12-16');
  • 总胜率
# 总胜率
SELECT result,cnt, sum(cnt) over() as total_cnt,concat(round((cnt*100.0/sum(cnt) over()), 2), '%') as rate
FROM (SELECT result, count(*) AS cnt FROM go_records GROUP BY result
) src;
  • 对特定棋手的胜率
select concat(round((select (select count(*) as cnt from go_records where player=40040 and result>0)*100.0/ (select count(*) as cnt from go_records where player=40040) as rate), 2), '%'
);
  • 对每一位棋手的胜率
select * from (select player, result, cnt, sum(cnt) over(PARTITION BY player) as total_cnt, round((cnt*100.0/(sum(cnt) over(PARTITION BY player))), 2) rate,concat(round((cnt*100.0/(sum(cnt) over(PARTITION BY player))), 2), '%') as percentfrom (select player, result, count(*) as cnt from go_records group by player, result) src
) final
where result > 0
order by final.rate desc;
  • 同一棋手出现在不同的2天
select distinct src.player from ((select player from go_records where date='2023-12-15') t1 inner join  (select player from go_records where date='2023-12-16') t2 on t1.player=t2.player
) src;

关于这最后一个问题,如果是打印出同一棋手出现在不同的多天,则按以上方法需写多个inner join,这显然是不能扩展和无法接受的。笔者一时之间还没有想出特别好的SQL的解决方案,留待以后的思考吧。

(END)

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

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

相关文章

服务宕机、线上环境内存溢出OOM分析思路

前言 平时工作中,肯定会遇到哪个产品经理突然来找,说服务器又挂了,怎么又用不了啦!类似的紧急情况,遇到这种情况不要慌,我提供以下几点紧急补救思路。 1)重启大法保命 2)确认是否新…

5分钟上手浏览器插件测试——Eolink Apikit

Eolink Apikit 研发管理和自动化测试产品中,提供了多种发起 API 测试的方式: 服务器测试:通过 Eolink Apikit 官方远程服务器发送请求,不需要安装任何插件,但是无法访问本地服务器(localhost)、内网、局域网。插件测试…

Qt中,将一个结构体转为qbytearray后,如何将这个qpqbytearray重新恢复为之前的结构体

在 Qt 中,如果你有一个自定义的结构体,并将其转换为 QByteArray,然后想要将 QByteArray 转换回原始的结构体,你可以使用 Qt 的 QDataStream 类来实现这个转换过程。 首先,假设你有一个自定义的线段结构体如下&#xf…

Git Status 中文乱码解决

中文的文件名,全是乱码 解决: git config --global core.quotepath false

年终汇报这么写,升值加薪必有你!

#01 你这么能干, 老板知道吗? — 打工人最怕什么? 最怕你忙前忙后,干活一大堆,气出一身结节,锅还没少背,最后升职加薪没有你,出国旅游不带你;更怕你日常996&#xf…

基于深度学习的图像分割

摘要 遥感图像分割是利用遥感技术获取的高分辨率图像进行像素级别的分类,将图像中的不同物体或不同地物提取出来的过程。这个过程对于遥感应用具有重要意义,因为它能够提取出地物和地表特征,如河流、道路、建筑、植被、水体等,并且…

同义词替换器降低论文重复率的最新技术动态

大家好,今天来聊聊同义词替换器降低论文重复率的最新技术动态,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:同义词替换器降低论文重复率的最…

从旺店通·企业版到金蝶云星空通过接口配置打通数据

从旺店通企业版到金蝶云星空通过接口配置打通数据 对接系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化智能化…

MySQL数据库知识点简易总结篇

SQL数据库简易版笔记 SQL(结构化查询语句):可操作世界上所有的关系型数据 关系数据库 建立在关系模型基础上的数据库。简单来说,关系型数据库是多张能互相连接的二维表组成的数据库。其优势有: 都是表结构&#xf…

基于SSM的视康眼镜网店销售系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

HarmonyOS4.0从零开始的开发教程20三方库的基本使用

HarmonyOS(十八)三方库的基本使用 三方库概述 三方库是开发者在系统能力的基础上进行了一层具体功能的封装,对其能力进行拓展,提供更加方便的接口,提升开发效率的工具。如果是发布到开源社区,称为开源三方…

高级算法设计与分析(二) -- 递归与分治策略

系列文章目录 高级算法设计与分析(一) -- 算法引论 高级算法设计与分析(二) -- 递归与分治策略 高级算法设计与分析(三) -- 动态规划 未完待续【 高级算法设计与分析(四) -- 贪…

CCD相机和CMOS相机有什么区别

问题描述:CCD相机和CMOS相机有什么区别。在阅读一些论文时,常看到工业上的检测常用到CCD相机,和我们熟知的CMOS相机有什么区别呢。 问题解答: CCD相机: 原理: 光电转换: 光子被感光芯片上的…

面试经典150题(32-37)

leetcode 150道题 计划花两个月时候刷完,今天(第十五天)完成了6道(32-37)150: 今天刚好有点没精神的感觉,然后碰到的题也不难。。天意!!! 32.(289. 生命游戏&#xff0…

iEnglish:家校协同培养学生自主阅读习惯

近日,2023年最新一期365天和1000天“iEnglish学习成长营”顺利结营。据悉,截至今年12月,在家庭场景中完成365天和1000天不间断阅读人数分别突破15万人和2万人。 近年来,全民终身学习的学习型社会不断深入推进,基础教育中对于学生的综合阅读能力素养新要求不断更新。提升孩子的…

【Git】Git基本操作

文章目录 Git 是什么Git 的优点Git 安装Linux UbuntuLinux CentOsWindows Git 基本操作1. 创建 Git 本地仓库2. 配置 Git3. Git工作区、暂存区和版本库4. 添加文件5. 查看 .git 文件6. 修改文件7. 版本回退 Git 是什么 Git是一个免费的、开源的分布式版本控制系统,…

【Linux】ip命令使用

ip命令 用于管理与配置网络接口和路由表。 ip命令的安装 ip 命令来自 iproute2 软件包,在 CentOS 7 中默认已安装。 yum install -y iproute 语法 ip [ OPTIONS ] OBJECT { COMMAND | help }ip [ -force ] -batch filename选项及作用 执行令 : ip …

TCP的拥塞控制_基础知识_四种拥塞控制方法

TCP的拥塞控制 一.拥塞控制的基本概念 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫作拥塞 。 计算机网络中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络的资源 若出现拥塞…

spring boot 配置多数据源 踩坑 BindingException: Invalid bound statement (not found)

在上一篇:《【已解决】Spring Boot多数据源的时候,mybatis报错提示:Invalid bound statement (not found)》 凯哥(凯哥Java) 已经接受了,在Spring Boot配置多数据源时候,因为自己马虎,导致的一个坑。下面&a…

Notepad++:多行数据操作

1)删除关键字之后(或之前)的所有字符 删除s之后(包含s)的所有内容;快捷键:s.*$ 替换成功 删除s之前(包含s)的所有内容;快捷键:^.*s 2&#xff09…