数据库(MySQL)基础

时间:2024-05-11 星期六

mysql基础

mysql基础学习内容

MySQL数据库安装与配置、SQL基本查询、SQL写入操作、MySQL表操作、SQL高级查询、MySQL基本函数

数据库分类

主流关系型数据库

商用数据库:DB2、Oracle

开源免费数据库:MySQL、SQL Server(微软开发的,主要用于windows系统,现在也支持linux系统,但是不活跃)

NoSQL数据库系统

NoSQL数据库是对关系型数据库的补充,NoSQL数据库指的是数据分类存放,但是数据之间没有关联关系的数据库系统

主要用于存放(秒杀库存信息、登录信息、消息通知)不太重要的信息

主流的NoSQL数据库:

用内存保存数据的NoSQL数据库:Redis、MemCache

用硬盘保存数据的NoSQL数据库: MongoDB、Neo4J

mysql介绍

重置root用户密码
  • 创建一个temp.txt文件,写入定义修改密码的SQL语句

    •  ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
Mysql配置文件
  • 配置文件my.ini,存放路径为MySql安装路径下的第一级目录下即MySql/my.ini

    • 可以设置各种MySQL的配置,例如字符集、端口号、目录地址等。

数据库表的操作

课程内容
  • 管理逻辑库和数据表

    • 创建、删除、修改逻辑库和数据表

  • 了解常用的数据类型和约束

    • 字符串、整数、浮点数、精确数字、日期、枚举、主键约束、非空约束、唯一约束、外键约束等

  • 掌握索引运行机制和使用原则

    • 排序为什么可以提高数据检索速度

    • 怎么创建和删除索引?

    • 什么条件下使用索引?

相关语言分类
  • 网页设计

    • HTML、CSS、JavaScript

  • IOS

    • Swift

  • 桌面程序

    • C++、C#、VB

  • 数据库

    • SQL语言

      • DML(数据库管理语言)DCL(数据库控制语言)DDL(数据库定义语言)
        添加 修改 删除 查询用户 权限 事务逻辑库 数据表 视图 索引
数据表相关内容
数据类型
数据类型分类类型大小说明
字符串CHAR1-255字符固定长度字符串
VARCHAR1-65535字符不固定长度字符串
TEXT1-65535字符不确定长度字符串
MEDIUMTEXT1-1千6百万字符不确定长度字符串
LONGTEXT1-42亿字符不确定长度字符串
日期类型DATE3字节日期
TIME3字节时间
YEAR1字节年份
DATETIME8字节日期时间
TIMESTAMP4字节时间戳
数字TINYINT1字节小整数
SMALLINT2字节普通整数
MEDIUMINT3字节普通整数
INT4字节较大整数
BIGINT8字节大整数
FLOAT4字节单精度浮点数
DOUBLE8字节双精度浮点数
DECIMAL------可变精度的十进制数(如:DECIMAL(10,2))
修改表的结构

修改字段类型和约束

 ALTER TABLE 表名称
 MODIFY 列1 数据类型 【约束】 【COMMENT 注释】,
 MODIFY 列2 数据类型 【约束】 【COMMENT 注释】,
 ......;

添加表的字段

 ALTER TABLE 表名称
 ADD 列1名 数据类型 【约束】 【COMMENT 注释】,
 ADD 列2名 数据类型 【约束】 【COMMENT 注释】
 .........;

修改字段名称

 ALTER TABLE 表名称
 CHANGE 列1 新列名 数据类型 【约束】 【COMMENT 注释】,
 CHANGE 列2 新列名 数据类型 【约束】 【COMMENT 注释】;

删除字段

 ALTER TABLE 表名称
 DROP 列1,
 DROP 列2,
 ......;

数据库的范式

构造数据库必须遵循一定的规则,这种规则就是范式;目前关系数据库有6种范式,一般情况下,只满足第三范式即可

第一范式:原子性

第一范式是数据库的基本要求,不满足这一点就不是关系数据库;数据库表的每一类都是不可分割的基本数据项,同一列种不能有多个值,也不能存在重复的属性。

学号姓名班级
1000李四高三年级1班

上表不符合第一范式,因为班级中的"高三年级1班"还可以划分为“年级”和“班级”

学号姓名年级班级
1000李四高三1班

这样才符合第一范式

第二范式:唯一性

数据库表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列。

学号考试成绩日期
230582018-07-15
230582018-07-15

上述表格记录为同一个人在同一天参与的考试记录,他两次的成绩都是58,我们无法区分重复的数据

流水号学号考试成绩日期
23020180715268758582018-07-15
23020180715269458582018-07-15

加了流水号后数据具有了唯一性,符合第二范式

第三范式:关联性

每列都与主键有直接关系,不存在传递依赖

爸爸儿子女儿女儿的玩具女儿的衣服
陈华陈浩陈婷婷海绵宝宝校服

上表不符合第三范式因为“女儿的玩具“ ”女儿的衣服”这两列与“女儿”字段有依赖,而与“爸爸”和“儿子”字段没有关系。

爸爸儿子女儿
陈华陈浩陈婷婷
女儿女儿的玩具女儿的衣服
陈婷婷海绵宝宝校服

将不符合的表格分为两个表格后,就符合第三范式

依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联

编号部门电话
10财务部1001
20技术部1002
30销售部1003
编号姓名性别部门入职日期
1陈浩102018-05-10
2李婷婷302018-03-22

上面的两个表,第二表将第一表关联到了第二个表中

字段约束
约束名称关键字描述
主键约束PRIMARY KEY字段值唯一,且不能为NULL
非空约束NOT NULL字段值不能为NULL
唯一约束UNIQUE字段置为一,且可以为NULL
外键约束FOREIGN KEY保持关联数据的逻辑性

注意,在使用过程中要放弃使用外键约束,因为如果使用外键约束,会导致各表之间相关联,你要删除父表的记录就需要先去删除子表与父表相关联的记录,才能回去删除父表的记录。除此之外,最糟糕的情况会出现外键约束的闭环问题,如果表与表之间形成外键闭环,我们将无法删除任何一张表的记录。由此产生的问题称为外键约束的闭环问题

索引

一旦数据排序之后,查找速度就会翻倍,现实世界跟程序世界都是如此,如给单词本按首字母进行排序

创建索引:

 CREATE TABLE 表名称(
 .........,
     INDEX 【索引名称】(字段),
 ..........
 )

添加和删除索引

 CREATE INDEX 索引名称 ON 表名(字段);
 ALTER TABLE 表名称 ADD INDEX [索引名](字段);
 SHOW INDEX FROM 表名;
 DROP INDEX 索引名称 ON 表名;

索引的使用原则

数据量很大,而且经常被查询的数据表可以设置索引;索引值添加在经常被用作检索条件的字段上面;不要在大字段(指的是那些数据量很大,或者数据类型为长文本(如TEXT或BLOB类型)的字段)上创建索引。

时间:2024-05-11 星期六下午19:30

数据库的基本查询

时间:2024-05-12 星期天

DML数据库管理语言

学习内容

数据的简单查询:无条件查询记录(SELECT FROM)、字段的计算和字段的别名(SELECT 字段 AS 别名 FROM)

数据的高级查询: 数据排序(ORDER BY)、分页(LIMIT)、去除重复记录(SELECT DISTINCT 字段名 FROM 表)

数据的有条件查询: 条件表达式(数学运算符、比较运算符、逻辑运算符、按位运算符)

数据分页

如果LIMIT字句只有一个参数,它表示的是偏移量,起始值默认为0

 SELECT 字段名1,字段名2 FROM 表 LIMIT 10;#获取结果集的10条数据
 SELECT 字段名1,字段名2 FROM 表 LIMIT 0,10;#获取结果集第一条及之后的数据共10条数据
排序加分页
 SELECT 字段名1,字段名2 FROM 表 ORDER BY 字段名 LIMIT 10;
条件查询
 SELECT ......FROM......WHERE 条件1 [AND | OR ] 条件2 .....; 
去除重复记录
 SELECT DISTINIC 字段 FROM ........; #去除重复记录,DISTINC必须在第一个字段前才能使用,而且只能由一个字段使用了DISTINC修饰
条件语句的四类运算符
序号运算符
1数学运算符(+、-、*、=)
2比较运算符(IS NULL, IS NOT NULL, BETWEEN 下限 AND 上限、LIKE模糊查询、REGEXP正则表达式)
3逻辑运算符(AND、OR、IN、XOR异或一个为真即为真)
4按位运算符(&、|、~取反、^位异或、<<左移、>>右移)

WHERE字句的注意事项:

WHERE子句中,条件执行的顺序是从左到右的,所以我们应该把索引条件、或者筛选掉记录最多的条件写在最左侧。

查询语句的执行顺序

1.词法分析与优化(读取SQL语句)-->FROM(选择数据来源)-->WHERE(筛选数据,满足条件才行)-->SELECT(查询获取结果集)--> ORDER BY(为结果集进行排序)-->LIMIT(分页查询,限制查询的数据条数)

数据库的高级查询

学习内容

数据统计分析:聚合函数、分组查询、HAVING字句

多表连接查询:外连接、内连接、以及多表查询的多种语法

子查询:单行子查询、多行子查询、WHERE子查询、FROM子查询、SELECT子查询

聚合函数

聚合函数在数据的查询分析中,应用十分广泛,聚合函数可以对数据求和、求最大值和最小值、求平均值和统计条数等

  • SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型的统计结果是毫秒数相加

    • SELECT SUM(字段1) FROM 表;
  • MAX函数

    •  SELECT MAX(字段1) FROM 表; #获取非空值的最大值
       SELECT MAX(字段1+IFNULL(字段2,0)) FROM 表 WHERE 字段3 IN(10,20);#获取字段3值为10或20时,字段1加上字段2(字段2为NULL值时,设置为0)的值的最大值
       SELECT MAX(LENGTH(字段1)) FROM 表;#获取字段1中字符最长的值
  • MIN函数,获取非空值的最小值

    •  SELECT MIN(字段1) FROM 表;
  • AVG函数:用于获得非空值得平均值,非数字数据统计结果为0

    •  SELECT AVG(字段1+IFNULL(字段2,0)) FROM 表;
  • COUNT函数,COUNT(*)用于获得包含空值得记录数,COUNT(列名)用于获得包含非控制的记录数

    •  SELECT COUNT(*) FROM 表;#统计表中所有数据条数共有几条

注意:聚合函数不能写入到WHERE字句中,如下面所示

 SELECT COUNT(*) FROM 表 WHERE 字段1>AVG(字段1); #该语句报错

分组查询
  • 为什么要分组?

    • 默认情况下汇总函数是对全表范围内的数据做统计,GROUP BY字句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理

      •  SELECT 字段1,AVG(字段2) FROM 表 GROUP BY 字段1;
  • 逐级分组

    • 数据库支持多列分组条件,执行时逐级分组

      • SELECT 字段1,字段2,COUNT(*),AVG(字段3) FROM 表 GROUP BY 字段1,字段2 ORDER BY 字段1
  • 对SELECT字句的要求

    • 查询语句中如果含有GROUP BY字句,那么SELECT子句中的内容就必须要遵守规定:SELECT子句中可以包括聚合函数,或者GROUP BY字句的分组列,其余内容均不可以出现在SELECT子句中

      • SELECT 字段1,COUNT(*), AVG(字段2) FROM 表 GROUP BY 字段1; #可以执行,语句正确
        SELECT 字段1,COUNT(*), AVG(字段2),字段3 FROM 表 GROUP BY 字段1; #不可以执行,因为字段3并没有进行聚合函数操作也没有在GROUP BY字句的分组列。
  • GROUP_CONCAT函数

    • GROUP_CONCAT函数可以把分组查询的某个字段拼接成一个字符串

  • 各种字句的执行顺序

    • FROM(获取数据源)-->WHERE(过滤数据源,满足条件才能进行后续操作)-->GROUP BY(将数据进行分组,要分组进行后续操作)-->SELECT(获取分组后的数据集,可以在这部分进行聚合函数操作)-->ORDER BY(对数据集进行排序)-->LIMIT(获取指定数据集条数)

HAVING字句

HAVING跟在GROUP BY后面,主要作用是实现分组后筛选的作用。

语句格式:

SELECT 字段1 FROM 表 GROUP BY 字段1 HAVING AVG(字段2)>=2000; #说明一下,HAVING语句中要使用如聚合函数或其它的具体值,不能使用一个字段作为筛选条件(比如 HAVING 字段2>=200这样)
表连接查询
表连接分类

内连接:内连接是结果集中只保留符合连接条件的记录

外连接:外连接是不管符不符合连接条件,记录都要保留在结果集中

内连接
  • 内连接格式

    • SELECT ...... FROM 表1
      [INNer] JOIN 表2 ON 条件
      [INNer] JOIN 表3 ON 条件
  • 从多张表中提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生笛卡尔积,即如果第一张表中有4条数据,第二张表中有16条记录,那么两个表如果无条件链接会产生4*16=64条数据

    • SELECT 字段1,字段2,字段3 FROM 表1 JOIN 表2;
  • 规定了连接条件的表连接语句,就不会出现笛卡尔积

    • SELECT 字段1,字段2,字段3 FROM 表1 e JOIN 表2 d ON e.字段名=d.与前面的表e相同的字段名;
  • 内连接的多种语法形式

    • SELECT ..... FROM 表1 JOIN 表2 ON 连接条件;
    • SELECT ..... FROM 表1 JOIN 表2 WHERE 连接条件; #WHREE替换ON
    • SELECT ..... FROM 表1 , 表2 WHERE 连接条件;#去掉JOIN,并将ON替换为WHERE
外连接
  • 左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接,如果右表没有符合条件的记录,就用NULL与左表连接。右外连接也是如此。

  • UNION关键字可以将多个查询语句的结果集合并

    • (查询语句) UNION (查询语句) UNION (查询语句).....
  • 外连接的注意事项

    • 内连接只保留符合条件的记录,所以查询条件写在ON字句和WHERE字句中的效果是相同的。但是在外连接里,条件写在WHERE子句中,不符合条件的记录会被过滤掉,而不是保留下来。

子查询
  • WHERE子查询

    • 这种子查询最简单,最容易理解,但是却是效率很低的子查询

    • SELECT 字段1,字段2,字段3 FROM 表 WHERE 字段1>=(SELECT AVG(字段1) FROM 表);#比较每条记录都要重新执行子查询
    • WHERE子句中的多行子查询

      • WHERE子句中,可以使用IN、ALL、ANY、EXISTS关键字来处理多行表达式结果集的条件判断

      •  SELECT 字段1 FROM 表1 
         WHERE 字段2 > ALL (SELECT 字段1 FROM 表1 WHERE 字段1 IN("字段1值1",“字段1值2”));#ALL都要大于子查询内容值
         ​
      • EXISTS关键字:把原来在子查询之外的条件判断,写到了子查询里面

        •  SELECT .... FROM 表名 WHERE [NOT] EXISTS(子查询)
  • FROM子查询

    • 这种子查询只会执行一次,所以查询效率很高

  • SELECT子查询

    • 这种子查询没输出一条记录的时候都要执行一次,查询效率很低,平时一般不要使用

时间:2024-05-12 星期天 下午15:50

MySQL对数据的基本操作

学习内容

数据添加:INSERT语法、INSERT方言语法(只适用于某个数据库产品的语言语法)、INSERT子查询、IGNORE关键字

数据修改:UPDATE语法、UPDATE表连接

数据删除:DELETE语法、DELETE表连接

数据添加

INSERT语句可以向数据表写入记录,可以是一条记录,也可以是多条记录

 INSERT INTO 表名(字段1,字段2,.....) VALUES(值1,值2,....);#插入一条记录
 INSERT INTO 表名(字段1,字段2,.....) VALUES(值1,值2,....),(值1,值2,....);#插入两条记录

MySQL数据库INSERT语句方言

 INSERT INTO 表名 SET 字段1=值1,字段2=值2,.....;

INGNORE关键字

INGNORE关键字会让INSERT只插入数据库不存在的记录

 INSERT [INGNORE] INTO 表名 ......;
数据修改

UPDATE语句用于修改表的记录

 UPDATE [INGNORE] 
 SET  字段1=值1,字段2=值2,......
 [WHERE 条件1....] 
 [ORDER BY .......]
 [LIMIT ..........]

UPDATE语句的表连接

因为相关子查询效率非常低,所以我们可以利用表连接的方式改造UPDATE语句

内连接

写法一:

 UPDATE 表1 JOIN 表2 ON 条件
 SET 字段1=值1, 字段2=值2,.....;

写法二:

 UPDATE 表1,表2 
 SET 字段1=值1, 字段2=值2,....
 WHERE  连接条件;
外连接
 UPDATE 表1[LEFT|RIGHT] JOIN 表2 ON 条件
 SET 字段1=值1,字段2=值2,....;
数据删除

DELETE语句用于删除记录,语法如下

 DELETE [INGNORE] FROM 表名 
 [WHERE 条件1,条件2,......]
 [ORDER BY........]
 [LIMIT.........]

时间:2024-05-17星期五 上午

MySQL基本函数的使用

学习内容

像编程语言利用函数封装业务功能一样,数据库也能把一些复杂的功能封装到函数里,供使用者调用

函数分类:

  • 数字函数

    • ABS(绝对值)、MOD、CEIL(向上取整)、FLOOR、ROUND(四舍五入)、正余弦函数、弧度转函数

  • 字符函数

    • UPPER、LOWER、CHAR_LENGTH、CONCAT

  • 日期函数

    • NOW、DATE_FORMAT、DATE_ADD、DATEDIFF

  • 条件函数

    • IF、IFNULL

日期函数

获取系统时间函数:

  • NOW()函数能获得系统日期和时间,格式yyyy-MM-dd hh:mm:ss

  • CURDATE()函数能获得当前系统日期,格式yyyy-MM-dd

  • CURTIME()函数能获得当前系统时间,格式hh:mm:ss

日期格式化函数:

  • DATE_FORMAT()函数用于格式化日期,返回用户想要的日期格式

    •  DATE_FORMAT(日期,表达式)
    • 使用

      •  SELECT ename, DATE_FORMAT(hiredate,"%Y") FROM t_emp;#获取雇佣的年份

日期偏移计算:

  • DATE_ADD()函数可以实现日期的偏移计算,而且时间单位很灵活

    •  DATE_ADD(日期,INTERVAL 偏移量 时间单位)
    • 使用

      •  SELECT DATE_ADD(NOW(),INTERVAL 15 DAY); #当前时间偏移15天后的时间
         SELECT DATE_ADD(NOW(),INTERVAL -300 DAY); #当前时间偏移300天前的时间

计算日期之间相隔的天数:

  • DATEDIFF(日期,日期)

字符函数

LOWER:转换小写字符,使用LOWER(字段名)

UPPER:转换大写字符,使用UPPER(字段名)

LENGTH:计算字符数量,使用LENGTH(字段名)

CONCAT:连接字符串,使用CONCAT(字段名,"$"),在字段名这一列中字符的后面添加"$".

INSERT:插入/替换字符,使用INSERT("你好",1,0,"先生"),在字符1的位置插入字符,替换0个字符,结果为"先生你好"

REPLACE:替换字符,使用REPLACE("你好先生","先生",“女士”),将字符串中"你好先生"中的"先生"字符替换为"女士"

SUBSTR:截取字符串,使用SUBSTR("你好世界",3,4),截取出第3个字符到第4个字符,即"世界"两字

SUBSTRING: 截取字符串,使用SUBSTRING("你好世界",3,2),截取出第3个字符开始的两个字符,即"世界"两字

LPAD:左侧填充字符,使用LPAD("Hello",10,"!"),在字符串左侧填充字符串到10个字符,不够的用"!"代替,结果为!!!!!Hello

RPAD:左侧填充字符,使用LPAD("Hello",10,"*"),在字符串左侧填充字符串到10个字符,不够的用"!"代替,结果为Hello!!!!!

TRIM:去除首位空格,使用TRIM(" 你好先生 "),去除首位空格" 你好先生 ",变为"你好先生"

条件函数
  • IFNULL(表达式,值),使用IF(字段名,0),如果字段名中的值为"NULL",则将该值置为0

  • IF(表达式,值1,值2)

    • 使用

      •  SELECT 
             e.empno,e.ename,d.dname,
             IF(d.dname="SALES","礼品A","礼品B")
         FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno;  #SALES部分发放礼品A,其余部分发放礼品B,打印每名员工获得的礼品
  • 复杂的条件判断可以用条件语句来实现,比IF语句功能更强大

    •  CASE
           WHEN 表达式 THEN 值1
           WHEN 表达式2 THEN 值2
           ..........
           ELSE 值N
       END

MySQL的综合应用

学习内容
  • 数据库事务机制

    • undo和redo机制、开启事务、提交事务、回滚事务

  • 数据导出与导入

    • SQL文件的导出与导入,TXT文档的导入与导出

事务机制

MySQL总共有5中日志,其中redo日志和undo日志与事务有关

事务机制:

  • 关系型数据库管理系统可看作由两部分组成:RDBMS=SQL语句 + 事务

  • 事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全部执行失败

  • 事务案例

管理事务

  • 默认情况下,MySQL执行每条SQL语句都会自动开启和提交事务

  • 为了让多条SQL语句纳入到一个事务之下,可以手动开启事务

    •  START TRANSACTION;
       SQL语句;
       [COMMIT|ROLLBACK];

事务的属性:

ACID: A-原子性;C-一致性;I-隔离性;D-持久性

事务的隔离级别:

  • read uncommitted: 读取未提交数据

  • read committed:读取已提交数据

  • repeatable read:重复读取

  • serializable:序列化

    • 由于事务并发执行所带来的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务注意执行,就不会产生上述问题了。开启了这个隔离级别,当前会话的事务只能在别的事务commit提交之后才能执行会话中的SQL语句。

在开启事务的语句之前,使用下面的语句可以修改这个会话(session)的事务隔离级别

 SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别名;#会话中修改隔离级别的模板
 ​
 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; #隔离级别名:READ UNCOMMITTED,意味着当前会话下的事务可以读取其它事务未提交的数据

数据的导出与导入

数据导出与备份的区别

  • 数据导出,导出的纯粹是业务数据

    • 数据导出可以分为两类

      • SQL文档(包括了表结构,再导入时会去解析每一个SQL语句,比较耗时,适用于少量数据)

      • 文本文档(只有数据,没有sql语句,没有建表语句,导入时只是将该文本文档中的数据导入到新建表结构(不在文本文档中,需要自定义好与文本文档数据进行字段对应)的表中

  • 数据备份,备份的是数据文件、日志文件、索引文件等等

指令导出SQL文件:

  • mysqldump用来把业务数据导出成SQL文件,其中也包括了表结构

    •  #指令
       mysqldump -uroot -p [no-data] 逻辑库 > 路径

指令导入SQL文件:

  • source命令用于导入SQL文件,包括创建数据表,写入记录等

    •  USE demo;#选择数据库
       SOURCE backup.sql;#执行sql文件,在demo数据库下导入表

除了上面的指令导入/导出数据之外,还可以适用入Navicat这类图形界面进行数据导入,但是需要注意的是一般数据库的使用是没有图形界面的Linux系统。

  • 45
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这啥呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值