世界一级方程式锦标赛_Formula one小型查询数据库设计实例

2026-05-17 07:42:14186 阅读量

世界一级方程式锦标赛_Formula one小型查询数据库设计实例

2022年一级方程式锦标赛小型数据库设计

声明:本篇文章的所有数据均来自于Formula_one世界一级方程式锦标赛网站(未包含阿布扎比收官战),可能在车手的部分签约数据、是否离队数据上有一定的错误,还请读者们海涵,谢谢!

相关服务:泰国服务器

0.数据库系统基础

0.1数据库系统基础概述

数据库是采用计算机技术统一管理的相关数据的集合,数据库能为各种用户共享,具有最小冗余、数据之间联系密切、有较高的数据独立性等特点
数据库管理系统是位于用户与操作系统之间的一层数据管理软件,它为用户或应用程序提供访问数据库的方法,包括数据库的建立、查询、更新以及各种数据库控制等

0.2数据库服务器名称

本次数据库创建所用到的服务器名称
数据库引擎服务器名称

1.数据库初始化

1.1数据库表的创建

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

根据附件创建对应表格
对应的SQL语句

USE Formula_one
CREATE TABLE DRIVERS
	(
	车手 char(8) not null,
	出生时间 smalldatetime not null,
	国籍 char(20) not null,
	车手状态 char(10) not null,
	选用车号 smallint not null,
	备注 text not null 
	);
	
CREATE TABLE TEAMS
	(
	车队 char(15) not null,
	车队领队 char(15) not null, 
	车队积分 smallint not null,
	制造商冠军 char(5),
	备注 text not null
	);

CREATE TABLE POINTS
	(
	车手 char(15) not null,
	车手积分 numeric(10) not null,
	分站杆位数 smallint not null,
	分站冠军数 numeric(10) not null,
	备注 text not null
	);

CREATE TABLE DRIVERSTATES
	(
	车手 char(8) not null,
	所属车队 char(15) not null,
	签约时长 char(15) not null,
	下赛季是否转会 char(15) not null,
	备注 text not null
	);

创建的Formula_one数据库和运行后的表格结果图
在这里插入图片描述
未录入数据前,
编辑前两百行查看所生成的表格,分别如下图所示:
DRIVERS表
DRIVERS表
DRIVERSTATES表
DRIVERSTATES表
POINTS表
POINTS表
TEAMS表
TEAMS表

1.2数据库表数据的录入

根据附件所示数据将数据插入到对应的表格中
对应的SQL语句

USE Formula_one
INSERT INTO DRIVERS	/*'车手','出生时间','国籍','车手状态','选用车号','备注'*/ 
	  VALUES('维斯塔潘','1997-9-30','荷兰','正式车手','1','NULL'),
			('佩雷兹','1990-1-26','墨西哥','正式车手','11','NULL'),
			('勒克莱尔','1997-10-16','摩纳哥','正式车手','16','NULL'),
			('拉塞尔','1998-2-15','英国','正式车手','63','NULL'),
			('汉密尔顿','1985-1-7','英国','正式车手','44','NULL'),
			('赛恩斯','1994-9-1','西班牙','正式车手','55','NULL'),
			('诺里斯','1999-11-13','英国','正式车手','4','NULL'),
			('奥康','1996-9-17','法国','正式车手','31','NULL'),
			('阿隆索','1981-7-29','西班牙','正式车手','14','NULL'),
			('博塔斯','1989-8-28','芬兰','正式车手','77','NULL'),
			('维特尔','1987-7-3','德国','正式车手','5','NULL'),
			('里卡多','1989-7-7','澳大利亚','正式车手','3','NULL'),
			('马格鲁森','1992-10-5','丹麦','正式车手','20','NULL'),
			('加斯利','1996-2-7','法国','正式车手','10','NULL'),
			('斯图罗尔','1998-10-29','加拿大','正式车手','18','NULL'),
			('米克','1999-3-22','德国','正式车手','47','NULL'),
			('角田裕毅','2000-5-11','日本','正式车手','22','NULL'),
			('周冠宇','1999-5-30','中国','正式车手','24','NULL'),
			('拉提菲','1995-6-29','加拿大','储备车手','6','NULL'),
			('阿尔本','1996-3-23','泰国','正式车手','23','NULL'),
			('德弗里斯','1995-2-6','荷兰','储备车手','45','NULL'),
			('罗斯伯格','1985-6-27','德国','储备车手','22','NULL'),
			('奥斯卡','2001-4-26','澳大利亚','测试车手','2','NULL');


INSERT INTO TEAMS	/*车队,车队领队,2022车队积分,制造商冠军,备注*/
	  VALUES('红牛','霍纳','719','是','NULL'),
			('法拉利','比诺托','524','否','NULL'),
			('梅赛德斯','沃尔夫','505','否','NULL'),
			('阿尔平','萨弗诺尔','167','否','NULL'),
			('迈凯伦','赛德尔','148','否','NULL'),
			('阿尔法罗密欧','瓦塞尔','55','否','NULL'),
			('阿斯顿马丁','克拉克','50','否','NULL'),
			('哈斯','斯泰纳','37','否','NULL'),
			('红牛二队','托斯特','35','否','NULL'),
			('威廉姆斯','卡皮托','8','否','NULL');
			

INSERT INTO POINTS	/*车手,2022年车队积分,分站杆位数,分站冠军数,备注*/
	  VALUES('维斯塔潘','429','6','14','NULL'),
			('佩雷兹','290','1','2','NULL'),
			('勒克莱尔','290','9','3','NULL'),
			('拉塞尔','265','1','1','NULL'),
			('汉密尔顿','240','6','0','NULL'),
			('赛恩斯','234','1','1','NULL'),
			('诺里斯','113','0','0','NULL'),
			('奥康','86','0','0','NULL'),
			('阿隆索','81','0','0','NULL'),
			('博塔斯','49','0','0','NULL'),
			('维特尔','36','0','0','NULL'),
			('里卡多','35','0','0','NULL'),
			('马格鲁森','25','1','0','NULL'),
			('加斯利','23','0','0','NULL'),
			('斯图罗尔','14','0','0','NULL'),
			('米克','12','0','0','NULL'),
			('角田裕毅','12','0','0','NULL'),
			('周冠宇','6','0','0','NULL'),
			('阿尔本','4','0','0','NULL'),
			('拉提菲','2','0','0','NULL'),
			('德弗里斯','2','0','0','NULL'),
			('罗斯伯格','0','0','0','NULL'),
			('奥斯卡','0','0','0','NULL');

INSERT INTO DRIVERSTATES	/*车手,所属车队,签约时长,下赛季是否转会,备注*/
	  VALUES('维斯塔潘','红牛','六年','否','NULL'),
			('佩雷兹','红牛','两年','否','NULL'),
			('勒克莱尔','法拉利','两年','否','NULL'),
			('拉塞尔','梅赛德斯','两年','否','NULL'),
			('汉密尔顿','梅赛德斯','两年','否','NULL'),
			('赛恩斯','法拉利','两年','否','NULL'),
			('诺里斯','1迈凯伦','两年','否','NULL'),
			('奥康','阿尔平','两年','否','NULL'),
			('阿隆索','阿尔平','两年','否','NULL'),
			('博塔斯','阿尔法罗密欧','两年','否','NULL'),
			('维特尔','阿斯顿马丁','一年','否','NULL'),
			('里卡多','迈凯伦','未续约','是','NULL'),
			('马格鲁森','哈斯','两年','否','NULL'),
			('加斯利','红牛二队','两年','是','NULL'),
			('斯图罗尔','阿斯顿马丁','未知','否','NULL'),
			('米克','哈斯','未知','未知','NULL'),
			('角田裕毅','红牛二队','两年','否','NULL'),
			('周冠宇','阿尔法罗密欧','两年','否','NULL'),
			('阿尔本','威廉姆斯','两年','否','NULL'),
			('拉提菲','威廉姆斯','未续约','是','NULL'),
			('德弗里斯','梅赛德斯','一年','是','NULL'),
			('罗斯伯格','阿斯顿马丁','未知','是','NULL'),
			('奥斯卡','阿尔平','两年','是','NULL');

执行SQL代码后对应的表格数据结果更新如下
DRIVERS表
DRIVERS表
DRIVERSTATES表
DRIVERSTATES表
POINTS表
POINTS表
TEAMS表
TEAMS表

1.3章节小结

本章主要针对已有的数据表格进行表格的创建和对应表格数据的插入,并对执行结果进行查验。

2.SQL语句——数据更新

前文所述,INSERT语句也同样属于表格内容更新语句,在后文中便不再过多赘述。
下文内容主要介绍UPDATE和DELETE语句在数据库中的应用。

/*INSERT语句*/
INSERT INTO 表名
VALUES('','',....,'')
/*将车手久戈维奇插入DRIVERS表*/
USE Formula_one
INSERT INTO DRIVERS	/*'车手','出生时间','国籍','车手状态','选用车号','备注'*/ 
	  VALUES('久戈维奇','2000-5-23','','储备车手','0','NULL')

在这里插入图片描述

2.1修改、删除数据

/*将DRIVERSTATES表格中的米克签约时长变更为“未续约”,将下赛季是否转会变更为“是”*/
USE Formula_one
UPDATE DRIVERSTATES
SET 签约时长='未续约',
	下赛季是否转会='是'
WHERE 车手='米克'

找到对应的表,编辑前200行查看对应表格,发现以根据要求更新数据,如下图所示
在这里插入图片描述

删除DRIVERSTATES表中的车手诺里斯的所属车队,并更新为“迈凯伦”

/*第一种方法*/
USE Formula_one
UPDATE DRIVERSTATES
SET 所属车队='迈凯伦'
WHERE 车手='诺里斯'
/*第二种方法*/
USE Formula_one
DELETE FROM DRIVERSTATES
WHERE 所属车队='1迈凯伦'

INSERT INTO DRIVERSTATES
	  VALUES('诺里斯','迈凯伦','两年','否','NULL')

从执行结果中可以看出,车手诺里斯的所属车队错误信息已经得到更正
在这里插入图片描述

如上述所示,第二种方法修改表数据的方式更为复杂,需要先找到需要修改的行,再利用删除语句DELETE FROM… (但是尤为注意,删除语句是删除目标行一整行,相较与UPDATE语句略显复杂),后重新往表格中插入正确的信息。

补充:DELETE语句一般用于删除无用的数据,但受限于调研时冗杂信息设置较少,不做单独举例。DELETE操作是通过事务来实现的,所删除的是满足条件的对应行,而如果需要快速彻底的删除表中所有行,可选用TRANCATE TABLE语句。

2.2用户界面操作方式管理表中数据

打开对象资源管理器,找到对应数据库,选择对应需要操作的表格,鼠标右键,后点击“编辑前200行”,在弹出的界面中进行插入、修改和删除操作,和Excel表格中方法基本一致。相对简单,不做过多赘述
在这里插入图片描述

2.3章节小结

本章中主要介绍了数据的更新、插入、删除和修改,以及如何查看表中的数据是否更新的操作,从先删除列在重新插入的方式来修改表格中的数据和直接修改表格中的数据两种不同的语句进行对比。可以明显看出UPDATE语句在小范围修改中更为便捷,但是在实际使用时,各自的语句有各自的有点,回归原点,还是要根据任务的需要来选用实际的语句。

3.SQL语句——数据查询

3.1SELECT语句一般查询和单表查询

SELECT语句从表格中的简单查询

USE Formula_one
SELECT 车手,车手积分,分站冠军数
FROM POINTS

执行结果
在这里插入图片描述
筛选出英国国籍的车手

USE Formula_one
SELECT 车手,国籍
FROM DRIVERS
WHERE 国籍='英国'

执行结果如下
在这里插入图片描述

SELECT语句更换列名并执行筛选条件

USE Formula_one
SELECT 车手,分站杆位数 AS'杆位数',分站冠军数 AS'冠军数'/*更换列名*/
FROM POINTS
WHERE 分站杆位数!<1 AND 分站冠军数!<1/*筛选条件杆位数和冠军数大于1*/

执行结果图如下
在这里插入图片描述
为便于年度比较,将车手所得的积分数进行排序操作(降序)

USE Formula_one
SELECT 车手,车手积分
FROM POINTS
ORDER BY 车手积分 DESC
/*ASC升序 DESC降序*/

执行结果
在这里插入图片描述
SELECT语句一般查询和单标查询在Formula_one中的常见应用如筛选出车手的积分、分站杆位数、分站冠军数等操作到此结束.除此之外,SELECT语句还可进行算数运算、比较筛选、字符匹配等一系列操作,具有强大的功能。

3.2连接查询

将DRIVERS表和POINTS表连接,查询各车手的详细信息和得分数

USE Formula_one
SELECT DRIVERS.*,POINTS.*
FROM DRIVERS,POINTS
WHERE DRIVERS.车手=POINTS.车手

在这里插入图片描述
多表连接查询_LEFT OUTER(左外连接)
(车手积分查询系统)

USE Formula_one
SELECT DRIVERS.车手,DRIVERS.选用车号,POINTS.车手积分
FROM DRIVERS LEFT OUTER JOIN POINTS ON DRIVERS.车手=POINTS.车手

在这里插入图片描述

多表连接查询
将车手的姓名、车号、所属车队和车手积分从多个表中连接,执行并形成一个表
(Formula_one车手积分榜系统)
/将POINTS表中的车手、车手积分和DRIVERSTATES表中车手所属车队和DRIVERS表中车手选用车号相连接/

SELECT POINTS.车手,DRIVERS.选用车号,DRIVERSTATES.所属车队,POINTS.车手积分
FROM POINTS,DRIVERSTATES,DRIVERS
WHERE POINTS.车手=DRIVERS.车手 AND DRIVERS.车手=DRIVERSTATES.车手

在这里插入图片描述
多表连接查询,可以将我们所需要的具有一定关系数据进行筛选并连接形成所需要的关系表格
上述所示的三个多表连接实例操作,分别形成了车手的详细信息、车手积分榜和车手、车号及其所属车队的积分榜的输出,主要用于Formula_one系统中的排名分数系统,当然上述所示的历程也可以通过代码的改编达到同样的效果。

3.3嵌套查询

在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块WHERE子句或HAVING短语的条件中。就叫做嵌套查询。
常见的有:带有IN谓词的子查询、带有比较运算符的子查询、带有ANY、SOME、ALL谓词的子查询
例如以下对带有IN谓词的子查询进行举例,对DRIVERS表中的英国车手进行查询,并显示对应车手的姓名。

USE Formula_one
SELECT 车手
FROM DRIVERS
WHERE 国籍 IN
	(SELECT 国籍
	FROM DRIVERS
	WHERE 国籍='英国')

在这里插入图片描述

3.4章节小结

查询语句主要分为单表查询和多表查询,在上述给出的例子中,数据可以通过单表查询根据对应的约束值找到对应的数据,也可以根据数据间的关系(多表查询)找出对应约束关系下的数据,总之,请根据实际需求来优化自己的查询方式。

4.数据库视图创建及应用

4.1视图

视图是从一个或几个基本表(或视图)导出来的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。视图类似于一个窗口,可以用于对数据库中感兴趣的数据进行监视。
视图一经定义,就可以和基本表一样被查询、删除,也可以在一个视图上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

4.2视图的创建、修改和删除

创建一个英国车手的视图

USE Formula_one
GO
CREATE VIEW 英国车手
AS SELECT 车手,国籍,选用车号,出生时间 FROM DRIVERS WHERE 国籍='英国'

在这里插入图片描述
创建一个车手姓名、车队、车号、车手积分的赛季积分榜视图

USE Formula_one
GO
CREATE VIEW 赛季积分榜
AS SELECT DRIVERSTATES.车手,所属车队,车手积分
FROM DRIVERSTATES,POINTS
WHERE DRIVERSTATES.车手=POINTS.车手
GO

赛季积分榜
将视图修改为筛选出车手积分数大于100的车手

ALTER VIEW 赛季积分榜
AS SELECT DRIVERSTATES.车手,所属车队,车手积分
FROM DRIVERSTATES,POINTS
WHERE DRIVERSTATES.车手=POINTS.车手 AND 车手积分!<100
GO

积分数大于100的车手
视图插入值操作在对应视图中可进行图形化操作
删除视图

DROP VIEW 赛季积分榜

操作后会发现数据库“视图”选项中已无对应的视图,如下图所示
在这里插入图片描述

4.3视图知识点补充

1.视图类似于用户端的窗口,这些数据会将用户所关心的数据呈现在用户面前,并简化用户查询数据时的操作
2.视图能够针对机密数据提供安全保护,即不同等级的用户对应所能查询到的数据有限,针对对应的数据形成保护机制
3.视图使用户能以多种角度看待同一数据。视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时。

4.4章节小结

视图是从一个或几个基本表中导出来的一个“虚表”。不同约束下的视图对应的数据显示的不同,并且其中的数据会随基本表的数据变化而变化。除此之外,视图能够像基本表一样被查询、删除。

5.数据库数据完整性

数据库完整性是衡量数据库中数据质量好坏的标准,是确保数据库中数据的正确性和唯一性的重要保证,是规划数据的结构以使其更加便于管理的重要手段

5.1数据库完整性

数据库完整性一般包括实体完整性、域完整性和参考完整性三个方面:

  1. 实体完整性:又称行完整性,确保表中行的唯一性。实体完整性要求表中有一个主键,真值不能为空,且能够唯一标识一行。
  2. 域完整性:又称范围完整性,确保列的取值的有效性。
  3. 参照完整性:又称引用完整性,确保父表与子表中数据的一致性

满足数据完整性的数据一般有以下特点:

  1. 数据的取值范围符合要求;
  2. 数据在表中的唯一标识;
  3. 数据与其他表中的相关数据相匹配。

例如TEAMS表中的车队为主键,而DRIVERSTATES表中的车队为外键,前者为父表,后者为子表。

5.2缺省与规则

缺省是为列提供数据的一种方式,规则是用户进行INSERT或UPDATE操作时,对输入列中的数据设定的取值范围
缺省与规则有以下特点:

  1. 缺省与规则是数据库对象,他们是独立于表和列而建立的;
  2. 缺省与规则建立后与列或者数据类型产生关联,列和数据类型就具有了缺省与规则的属性;
  3. 缺省和规则定义后,可以重复使用,可以绑定到多个列或者数据类型上;
  4. 缺省与规则不随表同时调入内存,当用到时才会被调入内存,这可能是程序执行出现延迟。
    (特别注意:缺省与规则不是ANSI标准,不推荐使用,相比应尽可能使用约束)
    例如将,TEAMS表中制造商冠军的选项只能为“是”或者“否”
CREATE RULE rul_制造商冠军
AS @制造商冠军 IN('是','否')

在这里插入图片描述
将对应规则绑定到对应列

EXEC sp_bindrule'rul_制造商冠军','TEAMS.制造商冠军'

在这里插入图片描述

5.3数据约束

创建含有列约束的表格

USE Formula_one
CREATE TABLE DRIVERS
	(
	车手 char(8) not null,
	出生时间 smalldatetime not null,
	国籍 char(20) not null,
	车手状态 char(10) not null,
	选用车号 smallint not null,
	备注 text not null 
	);

由于前文中有执行过类似操作,不做过多赘述

5.3.1主键约束

主键约束:为了确保更新或引用数据时行定位的唯一性,必须为每一个表设定主键,主键可以是单独的列,也可以是多个列的联合。
主键的特性:

  1. 每一个表仅能有一个主键;
  2. 主键值不可为NULL,该表在表内是唯一的,即没有重复值;
  3. 主键已经具有UNIQUE的特性,作为主键的列不能再被定义成UNIQUE约束;
  4. IMAGE和TEXT类型的列不能作为主键
  5. 主键具有自动检索的作用,不能人为取消。
    用命令操作定义主键约束
USE Formula_one
CREATE TABLE DRIVER
	(
	车手 char(8) not null PRIMARY KEY CLUSTERED,
	出生时间 smalldatetime not null,
	国籍 char(20) not null,
	车手状态 char(10) not null,
	选用车号 smallint not null,
	备注 text not null 
	);

上述操作中将“车手”这一列定义为主键约束,同时完成此操作也可以“编辑前200行”中的表格中进行图形化操作。
唯一约束和外键操作类似于主键约束,但各自的用处不一样,如唯一约束是表中已有主键约束,若再想唯一性定义,则可使用唯一约束。外键约束则是用于两表之间实现一对一或一对多的关系。除此之外,还有缺省约束和CHECK约束。

5.4章节小结

缺省和规则代码相对更容易维护,但受制于不属于ANSI标准,不方便移植。缺省和规则不仅是能够重复使用的对象,并且属于面向对象的开发方式,但缺省和规则是与数据库分离的对象。

6.存储过程

通常存储过程用来提供交互式查询的客户端接口,满足用户指定条件的查询需求

6.1存储过程的特点和类型

存储过程是指在一个执行规划中预先定义并编译好的一组T-SQL语句,存放在数据库中,可由用户随时调用。
存储过程的特点:
1).执行速度快
2).减少网络流量
3)作为一种安全机制。
4)屏蔽T-SQL命令,提供交互查询用户接口,增加数据库应用的方便性.
存储过程的类型:
1).内建存储过程

  1. 目录存储过程
  2. 系统存储过程
  3. 复制存储过程
  4. 事务存储过程
  5. 扩充存储过程

2).本地存储过程

  1. 永久存储过程
  2. 临时存储过程

6.2存储过程的相关操作

创建储存过程,来查询车手的积分,并执行

CREATE PROCEDURE 荷兰车手查询;1 @DRIVERS_国籍 char(20)='荷兰%'
	AS 
	SELECT 车手,国籍
	FROM DRIVERS
	WHERE 国籍 LIKE @DRIVERS_国籍
GO



EXECUTE 荷兰车手查询 '荷兰'

执行结果如下:
在这里插入图片描述
将触发器的名字不发生变更,但是将触发器的操作改为类似于前文中“车手积分榜”的操作,并执行

ALTER PROCEDURE 荷兰车手查询
WITH ENCRYPTION
AS
SELECT DRIVERS.车手,DRIVERS.国籍,DRIVERS.选用车号,POINTS.车手积分
FROM DRIVERS,POINTS
WHERE DRIVERS.车手=POINTS.车手
GO

EXECUTE 荷兰车手查询

查询结果如下
在这里插入图片描述
删除上述的存储过程“荷兰车手查询”

USE Formula_one
DROP PROCEDURE 荷兰车手查询
GO

在这里插入图片描述

6.3章节小结

存储过程是在服务器中的代码,用以提高服务器的性能,是用户使用EXECUTE命令调用执行的,与后文的触发器不同,触发器属于“被动”触发。

7.触发器

触发器通常用来检测用户对表的操作是否符合整个应用系统的需求和商业规则,增加数据访问的安全性和方便性,维持表内数据的完整性。在执行方式上,储存过程与触发器不同,存储过程是由用户使用EXECUTE命令调用执行它,触发器是当用户对表进行操作(如建修改或删除数据)失误时被触发而自动执行。

7.1触发器的概念和类型

触发器是在定义数据库时,作为表的一部分而创建的,当表发生变化时触发器被激活,触发器代码自动运行,用户不能专门调用触发器,也不能阻止触发器的触发,除非拥有足够的权限才能禁止触发器工作。
触发器的类型:AFTER触发器和INSTEAD OF触发器

7.2触发器的作用

触发器是数据库对象,是表定义的一部分,主要用于保护表中的数据,触发器的作用为:

  1. 保证数据的完整性
  2. 数据同步变化
  3. 执行存储过程
  4. 代替规则、复杂的缺省和约束
USE Formula_one
GO
CREATE TRIGGER DRIVERS_TRIGGER1
ON DRIVERS
FOR INSERT
AS
PRINT 'DATA INSERT SUCCESSFUL'
GO

/*下面插入一行数据作为测试*/
INSERT INTO DRIVERS
VALUES('测试1','','','','','')

结果显示
在这里插入图片描述
除此之外,还可以设计各种“个性化”的触发器,当用户使用对应的语句时触发对应的触发器。

8.附录(以下待编号)

8.1所用到的表格

原始数据表格(以下表格仅记录2022世界一级方程式锦标赛阿布扎比收官战之前的数据)
数据可能有轻微错误,如有发现,请联系小编改正
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.2参考书目

《SQL Server基础教程(第三版)》董翔英 主编

8.3所使用到的软件

Microsoft SQL Server Management Studio 18
Office Excel 2019专业增强版
Xmind

本文地址:https://www.limyvps.com/news/26_42094.html