本篇文章继续围绕SQL的语法重点为大家介绍 连接 和 高级连接 的使用,以及 使用连接的注意事项 。
SQL最强大的功能之一就是能在数据查询的执行中 连接(join)表 。连接是利用SQL的SELECT语句能执行的最重要的 *** 作,很好地理解连接及其语法是学习SQL的极为重要的一点。在能够有效地使用连接前,我们必须了解 关系表 以及 关系数据库 设计的一些基础知识。下面的介绍并不能涵盖这一主题的所有内容,但作为入门已经够了。
连接
理解关系表,最好是来看个例子。
有一个包含产品目录的数据库表,其中每类物品占一行。
对于每一种物品,要存储的信息包括产品描述、价格,以及生产该产品的供应商。
现在有同一供应商生产的多种物品,那么在何处存储供应商名、地址、联系方法等供应商信息呢?将这些数据与产品信息分开存储的理由是:
① 同一供应商生产的每个产品,其供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间;
② 如果供应商信息发生变化,例如供应商迁址或电话号码变动,只需修改一次即可;
③ 如果有重复数据(即每种产品都存储供应商信息),则很难保证每次输入该数据的方式都相同。不一致的数据在报表中就很难利用。
关键是, 相同的数据出现多次不是一件好事 ,这是关系数据库设计的基础。
关系表的设计就是要 把信息分解成多个表 , 一类数据一个表 。各表通过某些共同的值互相关联(所以才叫关系数据库)。在这个例子中可建立两个表:一个存储供应商信息,另一个存储产品信息。Vendors表包含所有供应商信息,每个供应商占一行,具有唯一的标识。此标识称为 主键 (primary key),可以是供应商ID或任何其他唯一值。Products表只存储产品信息,除了存储供应商ID(Vendors表的主键)外,它不存储其他有关供应商的信息。Vendors表的主键将Vendors表与Products表关联,利用供应商ID能从Vendors表中找出相应供应商的详细信息。
这样做的 好处 是:
① 供应商信息不重复,不会浪费时间和空间;
② 如果供应商信息变动,可以只更新Vendors表中的单个记录,相关表中的数据不用改动;
③ 由于数据不重复,使得处理数据和生成报表更简单。
总之,关系数据可以有效地存储,方便地处理。因此,关系数据库的可伸缩性远比非关系数据库要好。
为什么使用连接
连接将数据分解为多个表实现 更有效 地存储、 更方便 地处理,且 可伸缩性更好 。
可伸缩性:能够适应不断增加的工作量而不失败。
连接作为一种机制,能在一条SELECT语句中用来关联表。使用特定的语法,可连接多个表返回一组输出。
创建连接
分析 :上述SELECT语句中与之前的语句相同,都是指定检索的列, 区别 在于该语句指定的两列(prod_name,prod_price)在一个表中,而第一列(vend_name)在另一个表中。
FROM子句也有所区别。该FROM子句列出了两个表:Vendors,Products。这两个表由SELECT语句的WHERE子句连接。WHERE子句指示DBMS将Vendors表中的vend_id与Products表中的vend_id匹配起来。
这里使用了 完全限定列名 将Vendorsvend_id和Productsvend_id两列匹配。最终输出了两个不同表中的数据。
高级连接部分将介绍 如何使用表别名,另外的一些连接 ,以及 如何对被连接的表使用聚集函数 。
使用表别名
之前的文章已经给大家介绍了如何使用别名引用被检索的表列。
SQL还可以 给表名起别名 ,目的是:
① 缩短SQL语句。
② 允许在一条SELECT语句中多次使用相同的表。
分析 :上述语句中的FROM子句的三个表都有别名。如此 省略了许多字符 。表别名还可以用于SELECT的列表、ORDER BY子句以及其他语句部分。
需要注意的是: 表别名只在查询执行中使用 。与列别名不同,表别名不返回到客户端。
使用不同类型的连接
接下来将给大家介绍四种其他类型的连接: 自连接 、 自然连接 、 内连接 和 外连接 。
①自连接
分析: 这是使用了 子查询 的方案。对内部的SELECT语句做了一个简单的检索,返回Jim Jones工作公司的cust_name。该数据用于外部查询的WHERE子句中,以检索出为该公司工作的所有雇员。
下面看看使用了 连接 的方案。
分析:上述语句需要的两个表实际上是相同的表,所以Customers表在FROM子句中出现了两次。但这对于Customers的引用具有歧义,因为没有指示DBMS引用的是哪个Customers表。
于是需要使用表别名解决该问题。Customers表 第一次出现为别名c1 , 第二次为c2 ,然后再将这些别名用作表名。如SELECT语句使用c1前缀明确给出所需列的全名。如果不这么做,DBMS将返回错误,因为名为cust_id、cust_name、cust_contact的列各有两个。DBMS不知需要哪一列,即使它们都是同一列。
WHERE首先连接两个表,再按第二个表中的cust_contact过滤数据,返回所需的数据。
②自然连接
内连接 返回所有的数据,其中 相同的列可多次出现 。而 自然连接排除多次出现 ,使每一列只返回一次。
一般通过对一个表使用通配符(SELECT ),而对其他的列使用明确的子集来实现自然连接。
分析: 上述语句中,通配符只对第一个表使用,而所有其他列都明确列出来,所以没有出现重复的列被检索出来。
③内连接
目前为止使用的连接称为等值连接,是基于两个表之间的相等测试。该连接也称为内连接。
对该种连接还可以使用不同的语法,明确指定连接的类型。
分析 :该语句中的SELECT与之前的区别在于FROM 子句。此处两个表之间的关系是以 INNER JOIN 指定的部分FROM子句,因此需要使用特定的 ON子句 而不是WHERE子句。但传递给ON的实际条件与WHERE相同。
④外连接
许多连接将一个表中的行与另一个表中的行相关联,但有时候 需要包含没有关联的行 。例如,可能需要使用连接完成以下工作:
对每个顾客下的订单进行计数,包括那些至今尚未下订单的顾客;
列出所有产品以及订购数量,包括没有人订购的产品;
计算平均销售规模,包括那些至今尚未下订单的顾客。
在上述例子中,连接包含了那些在相关表中没有关联行的行。这种连接称为外连接,外连接分为 左外连接 和 右外连接 。
左外连接:取左边的表的全部,而右边的表按照条件显示,不符合条件的显示NULL。
右外连接:取右边的表的全部,而左边的表按照条件显示,不符合条件的显示NULL。
下面先给出一个简单的 内连接 ,再给出 左外连接 ,大家对比着理解。
分析 :两个语句都使用了 JOIN 关键字来指定连接类型,与内连接不同的是,左外连接包括没有关联行的行。因此在使用JOIN语法时,还需使用RIGHT或LEFT关键字来指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。
上述左外连接语句使用了LEFT OUTER JOIN 从FROM子句左边的表(Customers)中选择所有行。
若要从右边的表选择所有行,即使用 右外连接 ,则语句如下:
注意 :两种基本的外连接形式,左外连接和右外连接。两者的唯一差别是所关联的表的顺序。
此外,还有一种外连接,即 全外连接 。该连接检索两个表中的所有行并关联可关联的行。与左外连接或右外连接包含一个表的不关联的行不同,全外连接包含两个表的不关联的行。
自连接、自然连接、内连接和外连接的区别
①自连接: 通常用于 两张结构和数据内容完全一样的表 ,在做数据处理时,对它们分别 重命名 来加以区分,然后再进行关联。
②自然连接 :特点是要求两个关系表中进行连接的必须是 相同属性列 (名字相同),无需添加连接条件,且 在结果中消除了重复的属性列 。
③内连接 :与自然连接相似,区别在于内连接 不要求两属性列同名 ,可以用 using或on 来指定某两列字段相同的连接条件。
④外连接 :可以解决自然连接时某些属性不同导致这些元组被舍弃的问题,起到了 保留要舍弃的结果 的作用。
使用带聚集函数的连接
之前给大家介绍过使用 聚集函数 来汇总数据,殊不知这些函数也可以与连接一起使用。
分析: 上述语句使用了 COUNT函数 。该语句使用INNER JOIN将Customers和Orders表相互关联。GROUP BY子句按顾客分组,因此,函数调用COUNT(Ordersorder_num)对每个顾客的订单计数,将其作为num_ord返回。
分析: 上述语句使用 左外连接 包含所有顾客,包括了那些没有任何订单的顾客。
WHERE子句的重要性
需记住的是,在一条SELECT语句中连接几个表时,相应的关系是在运行中构造的,因为在数据库表中的定义没有指示DBMS如何对表进行连接的内容。
要连接多个表,需要将它们并列于from之后, 关键 是要设置WHERE子句,确保它们之间的 关联关系 必须给出,否则,查询结果会成为笛卡尔积。
笛卡尔积:由没有连接条件的表关系返回的结果为笛卡儿积。
分析 :上述语句输出的结果便是 笛卡尔积 。返回的数据用每个供应商匹配了每个产品,包括了供应商不正确的产品(即使该供应商没有产品)。
连接及其使用的要点
① 注意所使用的连接类型。一般我们使用内连接,但使用外连接也有效。
② 关于确切的连接语法,应该查看具体的文档,看相应的DBMS支持何种语法(大多数DBMS使用这两课中描述的某种语法)。
③ 保证使用正确的连接条件(不管采用哪种语法),否则会返回不正确的数据。
④ 应该总是提供连接条件,否则会得出笛卡儿积。
⑤ 在一个连接中可以包含多个表,甚至可以对每个连接采用不同的连接类型。虽然这样做是合法的,一般也很有用,但应该在测试它们前分别测试每个连接。这会使故障排除更为简单。
以上就是本次介绍的连接和高级连接啦~
下一期将给大家介绍 组合查询 、 插入数据 及 更新和删除数据。
我们下期见!
数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷
1 优化一览图
2 优化
笔者将优化分为了两大类,软优化和硬优化,软优化一般是 *** 作数据库即可,而硬优化则是 *** 作服务器硬件及参数设置
21 软优化
211 查询语句优化
1首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息
2例:
显示:
其中会显示索引和查询数据读取数据条数等信息
212 优化子查询
在MySQL中,尽量使用JOIN来代替子查询因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高
213 使用索引
索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者<MySQL数据库索引>一文,介绍比较详细,此处记录使用索引的三大注意事项:
214 分解表
对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表,
215 中间表
对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时
216 增加冗余字段
类似于创建中间表,增加冗余也是为了减少连接查询
217 分析表,,检查表,优化表
分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的表空间浪费
1 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user;
2 检查表: 使用 CHECK关键字,如CHECK TABLE user [option]
option 只对MyISAM有效,共五个参数值:
3 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;
LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁
22 硬优化
221 硬件三件套
1配置多核心和频率高的cpu,多核心可以执行多个线程
2配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度
3配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行 *** 作的能力
222 优化数据库参数
优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能MySQL服务的配置参数都在mycnf或myini,下面列出性能影响较大的几个参数
223 分库分表
因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。
224 缓存集群
如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。如果你就是简单的不停的加机器,其实是不对的。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。
一个完整而复杂的高并发系统架构中,一定会包含:各种复杂的自研基础架构系统。各种精妙的架构设计因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了
(1)
select 学生学号,姓名 from 学生信息表 where 学生学号 not in (select 学生学号 from 选课表)
(2)通过变量实现比较
declare @a int
select @a=
(select avg(成绩表成绩) from 成绩表,选课表 where
选课表课号=3 )
select 学生信息表学生学号,学生信息表姓名,成绩表成绩
from 学生信息表,成绩表,选课表
where
成绩表成绩<@a
and
成绩表学生学号=学生信息表学生学号
and
选课表课号=成绩表课号
3
select 选课号 from 选课表
where 学号 not in
(
select 学号 from 选课号 where
学号=(select 学生学号 from 学生信息表 where 姓名='李丽')
)
4
如果在选课表中有课程名的情况下
select 姓名 from 学生信息表
where 学生学号 in
(select 学号 from 选课表 where
课程名='数学'and 课程名='数据库'
)
5
select 学生信息表学生学号,学生信息表姓名,选课表课程名 from
学生信息表,选课表,成绩表 where
成绩表成绩>=60
and
学生信息表学生学号=成绩表学号
and
学生信息表学生学号=选课表学号
and
成绩表课程号=选课表课程号
group by 学生信息表学生学号,学生信息表姓名,选课表课程名
having count(选课表课程号)=count(成绩表课程号)
----------你没给表出来,方法大概就是这样的-----
1、主键就是聚集索引
2、只要建立索引就能显著提高查询速度
3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度
(四)其他书上没有的索引使用经验总结
1、用聚合索引比用不是聚合索引的主键速度快
2、用聚合索引比用一般的主键作order by时速度快,特别是在小数据量情况下
3、使用聚合索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚合索引使用了多少个
4 、日期列不会因为有分秒的输入而减慢查询速度
(五)其他注意事项
1 不要索引常用的小型表
2 不要把社会保障号码(SSN)或身份z号码(ID)选作键
3 不要用用户的键
4 不要索引 memo/notes 字段和不要索引大型文本字段(许多字符)
5 使用系统生成的主键
二、改善SQL语句
1、Like语句是否属于SARG取决于所使用的通配符的类型
2、or 会引起全表扫描
3、非 *** 作符、函数引起的不满足SARG形式的语句
4、IN 的作用相当与OR
5、尽量少用NOT
6、exists 和 in 的执行效率是一样的
7、用函数charindex()和前面加通配符%的LIKE执行效率一样
8、union并不绝对比or的执行效率高
9、字段提取要按照“需多少、提多少”的原则,避免“select ”
10、count()不比count(字段)慢
11、order by按聚集索引列排序效率最高
12、高效的TOP
1 相等连接
通过两个表具有相同意义的列,可以建立相等连接条件。
只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。
例 查询员工信息以及对应的员工所在的部门信息;
SELECT FROM EMP,DEPT;
SELECT FROM EMP,DEPT
WHERE EMPDEPTNO = DEPTDEPTNO
2 外连接
对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍。除了显示匹配相等连接条件的信息之外,还显示无法匹配相等连接条件的某个表的信息。
SELECT FROM 表1 LEFT OUTER JOIN 表2 ON 连接条件;
3 自连接
自连接是数据库中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。下面介绍一下自连接的方法:
将原表复制一份作为另一个表,两表做笛卡儿相等连接。
例 显示雇员的编号,名称,以及该雇员的经理名称
SELECT WORKERENAME,WORKERMGR,MANAGEREMPNO,MANAGERENAME FROM EMP WORKER,EMP MANAGER
WHERE WORKERMGR = MANAGEREMPNO
1在窗体查询窗口中,添加一个子窗体,子窗体就是caigoudanhao,然後设置子窗体的数据来源,即和主窗体的采购单号关联。
做法:在查询窗口设计状态下,将caigoudanhao从左边的对象列表中拖放到查询窗口中;在查找记录的单击事件中写以下代码:
mecaigoudanhaoformfilter="采购单号='" & me采购单号控件名称 & "'"
mecaigoudanhaoformfilteron=true
2在查询窗口设计状态下,将采购单号控件换成组合框,组合框的属性-->数据-->数据来源类型设为:数据表/查询,数据来源设为:select distinct 采购单号 from 采购单号所在的表名称;
以上两个地方“me采购单号控件名称”和“采购单号所在的表名称”需要换成你自己的实际名称
希望你能成功!
联合国商品贸易统计数据库(缩写UN Comtrade)由联合国统计署创建,是目前全球最大、最权威的国际商品贸易数据型资源库,每年超过200个国家和地区向联合国统计署提供其官方年度商品贸易数据,涵盖全球99%的商品交易,真实反映国际商品流动趋势。这是我们研究全球贸易活动最基础、最权威的数据库。下载页面如下:
但是每次都要手动 *** 作一遍,就比较麻烦。不过UN Comtrade提供了可以更方便获得数据的接口,我们来尝试一下。接口的实现原理,大概相当于:我们把要查询的数据,编成一条信息,发给UN Comtrade,然后UN Comtrade返回一个包含数据的文件,我们再解码成我们想要的格式。
一、查看接口格式。
我们先去UN Comtrade的接口网页,来看一看接口格式。
上图就是UN Comtrade的接口中,所包含的参数及格式。具体为:
r:reporting area 报告数据的国家,默认值0
px:classification 商品代码体系,商品进出口的默认值是HS(即Harmonized System),也可以选ST(即Standard International Trade Classification),服务进出口的默认值是EB02
ps:time period 时间区间,格式为 YYYY YYYYMM now recent等几种格式,取决于周期是月还是年。now 是获得最近1期数据(默认值),recent 是获得最近5期数据
p:partner area 发生贸易往来的经济体,默认值all
rg:trade regime / trade flow 贸易的方向,1 代表进口,2 代表出口,默认值all
cc:classification code 商品分类代码,TOTAL 代表全部,AG2 代表两位代码(默认值)等
max:maximum records returned 一次性返回的最大数据条数,默认值是500,普通访客最高是10万,认证用户最高是25万
type:trade data type 贸易类型,C 是商品(默认值),S 是服务
freq:data set frequency 数据频率,A 是年(默认值),M 是月
head:heading style 数据抬头格式,H 适合人阅读(默认值),M 适合机器阅读
最近铁矿石价格高涨,引发市场关注,而中国铁矿石的主要进口来源地是澳大利亚,我们就来看看,过去5年中国自澳大利亚进口铁矿石的数据。
我们把相关参数录入后,点击左下角的 Try it out! 就会返回给我们一个地址,这个地址就是向UN Comtrade发送数据请求的信息。同样,我们可以基于这条信息的格式,来设计我们的 Python 接口函数。
>
我们把这条消息输入浏览器的地址栏,就可以看到返回的数据如下,里面的 TradeValue 就是我们想要的数据了:
二、调用requests库解析数据
UN Comtrade的接口以json格式交换数据,我们来看一看返回的数据格式。我们要用到Python的requests库。
import requests test = requestsget(">
我们来看一下返回内容,json有点类似于双重字典,从下文可以看到,返回结果主要包括两大类,第一大类是validation,主要是过程信息,第二大类是dataset,主要是我们需要的数据。
{'validation': {'status': {'name': 'Ok', 'value': 0, 'category': 0, 'description': '', 'helpUrl': 'For more reference visit >
三、使用Pandas库转换数据格式
我们选择我们关心的数据,用关键字提取出来,然后转换成DataFrame格式,就可以方便的查看数据了:
import pandas as pd import cufflinks as cf pdDataFrame(testjson()['dataset'])[['yr','TradeValue']]iplot(x='yr',y='TradeValue',kind='bar',title='中国过去5年自澳大利亚进口铁矿石金额')
四、简单封装
我们把上文中的读取和解析数据的过程,简单封装成一个函数,以方便后续调用,比如我们想查看中国历年自澳大利亚进口铁矿石的金额,可以用如下命令:
import requests import pandas as pd import cufflinks as cf def comtrade_data(params): r = requestsget(">
我们想看看中国的大豆自各国进口的情况,用
soybean = comtrade_data(r="156",px="HS",ps="2019",p="all",rg='1',cc='1201',type='C',freq="A") soybean = soybeansort_values(by='TradeValue',ascending=False) soybeaniloc[1:6]iplot(x='ptTitle',y='TradeValue',kind='bar',title='2019年中国大豆进口额')
从上图可以看到,2019年中国自巴西的大豆进口,明显高于美国,那么这种情况,是否是受到中美贸易摩擦的影响呢?我们用如下命令,就可以很清晰的看到,2018年之前,中国自美国和巴西进口大豆的金额比较接近,但是2018年之后,中国自美进口大豆锐减,并从巴西替代,这也是中美贸易摩擦对美国影响的一个案例。
soybean_import = comtrade_data(r="156",px="HS",ps="all",p="76,842",rg='1',cc='1201',type='C',freq="A") soybean_import_usa = soybean_import[soybean_import['ptTitle']=='USA']set_index('yr')[['TradeValue']] soybean_import_brazil = soybean_import[soybean_import['ptTitle']=='Brazil']set_index('yr')[['TradeValue']] soybean_import_all = soybean_import_usajoin(soybean_import_brazil,lsuffix='_USA',rsuffix='_Brazil') soybean_import_alliplot(kind='bar',title='中国自美国和巴西进口大豆金额',legend={'orientation':'h','x':01,'y':-01})
五、几个注意事项
1、如果是访客用户的话,ps、r、p三个参数最多只能填5个代码,最多只有一个参数可以使用all,cc最多可以填20个代码,可以使用all
2、查询国家的时候,只能录入国家编号,查询国家对应编号的地址是>
3、查询对手方国家的时候,只能录入国家编号,查询对手方国家对应编号的地址是>
4、查询相关商品对应的HS编码,地址是>
以下语句调试通过:
SELECT FROM course WHERE name LIKE '%晓%'运行效果:
注意事项:
使用 like %name% 这样的语句是不会走索引的,相当于全表扫描;
数据量小的时候不会有太大的问题,数据量大了以后性能会下降的很厉害;
建议数据量大了以后使用搜索引擎来代替这种模糊搜索;
实在不行也要在模糊查询前加个能走索引的条件。
以上就是关于数据分析人必掌握的数据库语言-SQL指南第六期全部的内容,包括:数据分析人必掌握的数据库语言-SQL指南第六期、超详细MySQL数据库优化、数据库查询de几个问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)