Java基础核心技术-----MySQL

一、数据库的相关概念

1. 数据库的好处

  1. 可以持久化数据到本地

  2. 结构化查询

2. 数据库的常见概念

  1. DB:数据库,存储数据的容器

  2. DBMS:数据库管理系统,又称为数据库软件/数据库产品,用于创建或者管理DB

  3. SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言

3. 数据库存储数据的特点

  1. 数据存放到表中,然后表再放到数据库中

  2. 一个库中有多张表,每张表具有唯一的表名用来标识自己

  3. 表中有一个或多个列,则又称为“字段”,相当于Java中“属性”

  4. 表中的每一行数据,相当于Java 中“对象”

4. 常见的数据库管理系统

  • mysql

  • oracle

  • db2

  • sql server

二、初始MySQL

1. MySQL产品的介绍

瑞典——>08年被sun收购——>09年sun被Oracle收购

优点:

  1. 开源、免费、成本低

  2. 性能高、移植性好

  3. 体积小,便于安装

2. MySQL的安装

属于 C/S 架构的软件,一般来讲安装服务器

3. MySQL服务的启动和停止

1. 方式1:通过命令行

  • net start 服务名

  • net stop 服务名

2. 方式2:计算机——右击——管理——服务

4. MySQL服务的登录和退出

  • 登录:mysql [-h主机名 -p端口号] -u 用户名 -p

  • 退出:exit 或者 Ctrl+C

5. MySQL的常见命令和语法规范

  1. 常见命令

1. 查看当前所有的数据库

show databases;

2. 打开指定的库

use 库名

3. 查看当前库的所有表

show tables;

4. 查看其它库的所有表

show tables from 库名

5. 创建表

create table 表名(
	列名 列类型,
   列名 列类型,
   ...  
);

6. 查看表结构

desc 表名;

7. 查看当前服务器的版本

方式1:登录到MySQL服务端
select version;
方式2:没有登录到MySQL服务端
mysql --version 
或者
mysql --V
  1. 语法规范

1. 不区分大小写,建议关键字大写,表名、列名小写

2. 每条命令最好用分号结尾 或者/G

3. 每条命令根据需要,可以进行缩进 或换行

4. 注释

  • 单行注释:#注释文字

  • 单行注释:-- 注释文字

  • 多行注释:/* 注释文字 */

三、DQL语言的学习

1. 基础查询

  1. 语法
select 查询列表
from 表名;

注意:字符型和日期型 的常量必须用单引号(’ ') 引起来,数值型不需要

  1. 特点
  1. 查询列表可以是字段、常量、表达式、函数,也可以是多个

  2. 查询结果是一个虚拟表

  1. 示例

1. 查询单个字段

select 字段名 from 表名;

2. 查询多个字段

select 字段名,字段名 from 表名;

3. 查询所有字段

select * from 表名;

4. 查询常量

select 常量值;

5. 查询函数

select 函数名(实参列表);

6. 查询表达式

select 1000/1234;

7. 起别名

as
② 空格

8. 去重

select distinct 字段名 from 表名;

9. '+'
作用:做加法运算

select 数值+数值; 直接运算
select 字符+数值; 先试图将字符转换为数值,如果转换成功将继续运算,否则转换成0,在做运算
select null+; 结果都为null

10. concat 函数
功能:拼接字符

select concat(字符1,字符2,字符3...);

11. ifnull 函数
功能:判断某字符串是否为null,如果为null,返回指定的值,否则返回原本的值

select ifnull(字段名,返回指定的值) from 表名

12. isnull 函数
功能:判断某字段或者表达式是否为null,如果是,返回1,否则返回0

2. 条件查询

  1. 语法
select 查询
from 表名
where 筛选条件
  1. 筛选条件分类

1. 简单条件运算符

> < = <> != >= <= <=>安全等于

2. 逻辑运算符

&& and
|| or
! not

3. 模糊查询

like 一般搭配通配符使用,可以判断字符型或者数值型
通配符 %任意多个字符,_任意单个字符

between and

in

is null / is not null  用于判断null
  1. is null 和 <=>
普通类型的数值null值可读性
is null×
<=>×

3. 排序查询

  1. 语法
select 查询列表
fromwhere 筛选条件
order by 排序列表 [asc | desc] 
  1. 特点
  • asc:升序,如果不写默认升序

  • desc:降序

  1. 排序列表 支持 单个字段、多个字段、函数、表达式、别名

  2. order by 的位置一般放到查询语句的最后(除limit语句之外)

4. 常见函数

  1. 概述
  • 功能:类似于Java中的方法

  • 优点:提高重用性和隐藏实现细节

  • 调用:select 函数名 (实参列表);

  1. 单行函数

1. 字符函数

concat 	连接
substr	截取子串
upper	变大写
lower	变小写
replace	替换
length	获取字节长度
trim 	去前后空格
lpad	左填充
rpad	右填充
instr	获取子串第一次出现的索引

2. 数学函数

round	四舍五入
mod	取模
ceil	向上取整
floor	向下取整
truncate	截断
rand	获取随机数,返回0-1之间的小数

3. 日期函数

now	返回当前日期+时间
year	返回年
mouth	返回月
day	返回日
hour	返回小时
minute	返回分
second	返回秒
date_format	将日期转换成字符
str_to_data	将字符转换成日期
curdate	返回当前日期
curtime	返回当前时间
datediff	返回两个日期相差的天数
monthname	以英文的形式返回月
unix_timestamp

4. 其他函数

version	当前服务器的版本
database	当前打开的数据库
user	当前用户
password(‘字符’)	返回该字符的密码形式
md5(‘字符’)	返回该字符的md5加密形式

5. 流程控制函数

if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2case情况1
case 变量或表达式或字段
	when 常量1 then1
	when 常量2 then2
	...
	else 值n
endcase情况2
case 
	when 条件1 then1
	when 条件2 then2
	...
	else 值n
end
  1. 分组函数

1. 分类

max	最大值
min	最小值
sum	和
avg	平均值
count	计算个数

2. 特点:

  • ①语法
select sum(字段) from 表名
  • ②支持的类型

sum 和 avg 一般用于处理数值型

max 、min、count 可以处理任何数据类型

  • ③以上分组函数都忽略null

  • ④都可以搭配distinct使用,实现去重统计

select max(distinct 字段) from 表;
  • ⑤count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
count(1):统计结果集的行数
  • ⑥和分组函数一同查询的字段,要求是 group by 后出现的字段

5. 分组查询

  1. 语法
select 分组函数,分组后的字段
from[where 筛选条件]
group by 分组的字段
[having 分组后的筛选]
[order by 排序列表]
  1. 特点
使用关键字筛选的表位置
分组前筛选where原始表group by 前面
分组后筛选having分组后的结果group by 后面

6. 连接查询

  1. 含义

当查询中涉及到了多个表的字段,需要使用多表连接

select 字段1,字段2
from1,表2...;

笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接

如何解决:添加有效的连接条件

  1. 分类

1. SQL92语法

  • 支持内连接(等值连接、非等值连接、自然连接)+ 也支持一部分外连接(mysql不支持)

内连接:

①等值连接

select 查询列表
from1 别名,表1 别名
where1.key=2.key
[and 筛选条件]
[group by 分组字段]
[having 分组后的筛选条件]
[order by 排序字段]

特点:

  • 一般为表起别名
  • 多表的顺序可以调换
  • n表连接至少需要n-1个连接条件
  • 等值连接的结果是多表连接的交集部分

②非等值连接

select 查询列表
from1 别名,表1 别名
where 非等值的连接条件
[and 筛选条件]
[group by 分组字段]
[having 分组后的筛选条件]
[order by 排序字段]

③自连接

select 查询列表
from 表 别名1,表 别名2
where 等值的连接条件
[and 筛选条件]
[group by 分组字段]
[having 分组后的筛选条件]
[order by 排序字段]

2. SQL99语法

  • 支持内连接(等值连接、非等值连接、自然连接)

  • 支持外连接(左外连接、右外连接、全外连接(MySQL不支持))

  • 支持交叉连接

①内连接

select 查询列表
from1 别名
[inner] join2 别名 on 连接条件
where 筛选条件
[group by 分组字段]
[having 分组后的筛选条件]
[order by 排序字段]
[limit 字句];

特点:

  • 一般为表起别名
  • 多表的顺序可以调换
  • n表连接至少需要n-1个连接条件
  • 内连接=多表交集

②外连接

select 查询列表
from1 别名
left|right|full [outer] join2 别名 
on 连接条件
where 筛选条件
[group by 分组字段]
[having 分组后的筛选条件]
[order by 排序字段]
[limit 起始条目索引,条目数]; 

特点:

  • 查询结果=主表中的所有行,其中从表和它匹配的将显示匹配行,从表没有匹配的则显示null
  • left join 左边就是主表 ,right join 右边就是主表,full join 两边都是主表
  • 一般用于查询除了交集部分,剩余的不匹配的行

③交叉连接

特点:类似于笛卡尔积

7. 子查询

  1. 含义
  • 嵌套到其他语句内部的select语句称为子查询或内查询

  • 外面的语句可以是insert、updata、delete、select等,一般select作为外面语句较多

  • 外面如果我select语句,则此语句称为外查询或者子查询

  1. 分类

1. 按出现的位置

  • ①select的后面 仅仅支持标量子查询

  • ②from的后面 表子查询

  • ③where或者having的后面 标量子查询、列子查询、行子查询

  • ④exists 后面 标量子查询、列子查询、行子查询、表子查询

2. 按结果集的行列

  • ①标量子查询(单行子查询):结果集为一行一列

  • ②列子查询(多行子查询):结果集为多行一列

  • ③行子查询:结果集为多行多列

  • ④表子查询:结果集为任意

8. 分页查询

  1. 应用场景

当要查询的条目数太多,一页显示不全

  1. 语法
select 查询列表
fromlimit [offset,] size;

注意:
offset 代表的是起始条目的索引,默认从0卡死
size 代表的是显示的条目数

公式:

假如要显示的页数为page,每一页的条目数为size

select 查询列表
fromlimit (page-1)*size,size;

9.union联合查询

  1. 含义

union:合并,联合,将多次查询结果合并成一个结果

  1. 语法
查询语句1
union [all]
查询语句2
union [all]
...
  1. 意义
  1. 将一条比较复杂的查询语句拆分成多条语句

  2. 适用于查询多个表的时候,查询的列基本一致

  1. 特点
  1. 要求多条查询语句的查询列数必须一致

  2. 要求多条查询语句的各列类型、顺序最好一致

  3. union去重,union all包含重复项

10. 总结

select 查询列表			       ⑦
from1 别名				    ①
连接类型 join2 别名 		  ②
on 连接条件					    ③
where 筛选条件                   ④
[group by 分组字段][having 分组后的筛选条件][order by 排序字段][limit 起始条目索引,条目数];

四、DML语言的学习

1. 插入语句

  1. 方式一:

1. 语法:

insert into 表名(字段名,...) value(值,...);

2. 特点:

  • 要求值的类型和字段的类型要一致或者兼容
  • 字段的个数和顺序不一定与原始表中的字段个数或者顺序一致,但必须保证字段和值一一对应
  • 假如表中有可以为null的字段,注意可通过以下方式插入null值
    • ①字段和值都省略
    • ②字段写上,值使用null
  • 字段和值的个数必须一致
  • 字段名可以省略,默认所有列
  1. 方式二:

语法:

insert into 表名 set 字段=值,字段=值,...;
  1. 两种方式的区别:

1. 方式一支持一次插入多行,语法如下:

insert into 表名(字段名,...) value(值,...),(值,...),...;

2. 方式一支持子查询,语法如下

insert into 表名
查询语句;

2. 修改语句

  1. 修改单表的记录

语法:

update 表名
set 字段=值,字段=[where 筛选条件];
  1. 修改多表的记录

语法:

update1 别名
left|right|inner join2 别名
on 连接条件
set 字段=值,字段=[where 筛选条件];

3. 删除语句

  1. 方式一:使用delete

1. 删除单表的记录,语法如下

delete from 表名
[where 筛选条件]
[limit 条目数];

2. 级联删除,语法如下

delete 别名1,别名2
from1 别名
inner|left|right join2 别名
on 连接条件
[where 筛选条件];
  1. 方式二:使用truncate

语法:

truncate table 表名 
  1. 两种方式的区别
删除后,如果再插入筛选条件效率返回值回滚
truncate标识从1开始不可添加没有不可以
delete标识从断点开始可以添加受影响的行数可以

五、DDL语言的学习

1. 库的管理

  1. 创建库
create database 
[if not exists] 库名
[character set 字符集名];
  1. 修改库
alter database 库名
character set 字符集名;
  1. 删除库
drop database [if exists] 库名;

2. 表的管理

  1. 创建表
create table [if not exists] 表名(
	字段名 字段类型 [约束],
    字段名 字段类型 [约束],
    ...
    字段名 字段类型 [约束]
);
  1. 修改表

1. 添加列

alter table 表名 add column 列名 类型 [frist|after 字段名];

2. 修改列的类型或约束

alter table 表名 modify column 列名 新类型 [新约束];

3. 修改列名

alter table 表名 change column 旧列名 新列名 类型;

4. 删除某个列

alter table 表名 drop column 列名;

5. 修改表名

alter table 表名 rename [to] 新表名;
  1. 删除表
drop table [if exists] 表名;
  1. 复制表

1. 复制表的结构

create table 表名 like 旧表;

2. 复制表的结构+数据

create table 表名
select 查询列表
from 旧表 [筛选条件];

3. 常见数据类型介绍

  1. 数值型

1. 整型

tinyint	 smallint 	mediumint 	int/integer 	bigint
1			2			3			4			8

特点:

  • 都可以设置无符号和有符号,默认有符号,通过 unsigned 设置无符号
  • 如果超出范围,会报out or range 出异常,插入临界值
  • 长度可以不指定,默认会有一个长度,长度代表显示的最大宽度,如果不够在左边用0填充,但需要搭配zerofill ,并且默认变为无符号整型

2. 浮点型

定点数:decimal(M,D)
浮点数:
float(M,D)			4
double(M,D)		     8

特点:

  • M 代表整数部位+小数部位的个数,D 代表小数部位
  • 如果超出范围,会报out or range 出异常,插入临界值
  • M 和 D 都可以省略,但对于定点数,M 默认为10,D 默认为 0
  • 如果精度要求较高,则优先考虑使用定点数
  1. 字符型
char varcahr binary enum set text blob
  • char:固定长度字符,写法为char(M),最大长度不能超过 M ,其中 M 可以省略,默认为 1

  • varchar:可变长度的字符,写法为varchar(M) ,最大长度不能超过 M ,其中 M 不可以省略

  1. 日期型
yeardate 日期
time 时间
datetime 日期+时间		8
timestamp 日期+时间		 4		比较容易受时区、语法模式、版本的影响,更能反映当前时区的真实时间

4. 常见约束

  1. 含义

一种限制,用于限制表中的数据,为了保证表中的数据的准确性和可靠性

  1. 分类
not null	非空,保证该字段的值不能为空
default	默认,用于保证该字段有默认值
primary key	主键,用于保证该字段的值具有唯一性,并且非空
unique	唯一,用于保证该字段的值具有唯一性,可以为空
check	检查约束(MySQL中不支持)
foreign key	外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值

1. 添加约束的时机:

  • 创建表时
  • 修改表时

2. 约束的添加分类:

  • 列级约束:六大约束都支持,但外键约束没有效果,列的后面,不可以起约束名

  • 表级约束:除了非空、默认,其他都支持,所有列的下面,可以起约束名(主键没效果)

语法:在各个字段的最下面

 [constraint 约束名] 约束类型(字段名)
  1. 主键和唯一对比
保证唯一性是否允许为空一个表中可以有多少个是否允许组合
主键×至多1个√,但不支持
唯一可以有多个√,但不支持
  1. 外键
  1. 要求在从表设置外键

  2. 从表的外键列的类型和主表的关联列的类型要求一致或兼容

  3. 主表的关联列必须是key(一般是主键或者是唯一)

  4. 插入数据时,先插入主表,再插入从表;删除数据时,先删除从表,再删除主表

  1. 创建时添加约束
create table 表名(
	字段名 字段类型 约束类型,
    字段名 字段类型 约束类型,
    ...
    字段名 字段类型 约束类型
    
    constraint 约束名 约束类型(字段名)
);
  1. 修改表时添加约束

1. 添加列级约束

alter table 表名 modify column 字段名 字段类型 新约束类型;

2. 添加表级约束

alter table 表名 add [constraint 约束名] 约束类型(字段名);
  1. 修改表时删除约束
alter table 表名 drop 约束 字段名;
  1. auto_increment 自增长列

1. 自增长列必须和主键搭配吗?不一定,但要求是一个key

2. 一个表可以有多少个自增长列?至多 1 个

3. 自增长列的类型:只能是数值型

4. 自增长列可以通过 以下方式,设置步长,也可以通过手动插入值,设置起始值

set auto_increment =;

5. 创建表时设置自增长列

create table 表名 (
   字段名 字段类型 约束 auto_increment;
)

6. 修改表时设置自增长列

alter table 表名 modify column 字段名 字段类型 约束 auto_increment;

7. 修改表时删除自增长列

alter table 表名 modify column 字段名 字段类型 auto_increment;

六、TCL语言的学习

  1. 含义

事务:一条或者多条SQL语句组成一个执行单位,一组SQL语句要不都执行,要不都不执行

  1. 特点(ACID)
  • A 原子性:一个事务是不可再分割的整体,要么都执行,要么都不执行

  • C 一致性:一个事务可以使数据从一个一致状态切换到另一个一致状态

  • I 隔离性:一个事务不受其他事务的干扰,多个事务相互隔离的

  • D 持久性:一个事务一旦提交了,则永久的持久化到本地

  1. 事务的使用步骤
  • 隐式(自动)事务:没有明显的开启和结束,本身就是一条事务可以自动提交,比如 insert、update、delete

  • 显式事务:具有明显的开启和结束

使用显式事务:

  • ①开启事务
set autocommit=0;
start transaction;#可以省略
  • ②编写一组逻辑SQL语句

注意:SQL语句支持的是 insert、update、delete、select

设置回滚点:

savepoint 回滚点名
  • ③结束事务

提交:commit

回滚:rollback

回滚到指定地方:

rollback to 回滚点名
  1. 并发事务

1. 事务并发问题是如何发生的?

多个事务 同时操作 同一数据库的相同数据时

2. 并发问题都有哪些?

  • 脏读:一个事务读取到其他事务还没有提交的数据,只是读到的是 其他事务 “更新” 的数据

  • 不可重复读:一个事务多次读取,结果不一样

  • 幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务 “插入” 的数据

3. 如何解决并发问题?

通过设置隔离级别来解决并发问题

4. 隔离级别

脏读不可重复读幻读
read uncommitted 读未提交×××
read committed 读已提交××
repeatable read 可重复读×
serializable 串行化

七、视图

  1. 含义

本身是一个虚拟表,他的数据来自于表,通过执行时动态生成

好处:

  1. 简化SQL语句

  2. 提高了SQL的重用性

  3. 保护基表的数据,提高了安全性

  1. 创建
create view 视图名
as
查询语句;
  1. 修改

方式1

create or replace view 视图名
as
查询语句;

方式2

alter view 视图名
as
查询语句;
  1. 删除
drop view 视图1,视图2,...;
  1. 查看
desc 视图名;
show create view 视图名;
  1. 使用
1.插入 insert
2.修改 update
3.删除 delete
4.查看 select

注意:视图一般用于查询的,而不是更新的,所以具备以下特点的视图不允许更新

  • ①包含分组函数、group by、distinct、having、union

  • ②join

  • ③常量视图

  • ④where 后的子查询用到了from中的表

  • ⑤用到了不可更新的视图

  1. 视图和表的对比
关键字是否占用物理空间使用
视图view占用较小,只存储SQL逻辑一般用于查询
table保存实际数据增删改查

八、变量

  1. 系统变量

1. 说明:变量由系统提供,不用自定义

2. 语法:

  • ①查看系统变量
show [global|session] variables; 
如果没有显式声明 global 还是 session, 则默认是session
  • ②查看指定的系统变量的值
select @@[global|session].变量名;
如果没有显式声明 global 还是 session, 则默认是session
  • ③为系统变量赋值

方式一

set [global|session] 变量名=;
如果没有显式声明 global 还是 session, 则默认是session

方式二

set @@global.变量名=;
set @@变量名=;

3. 全局变量

服务器层面上,必须拥有 super 权限才能为系统赋值,作用域为整个服务器,也就是针对所有的连接(会话)有效

4. 会话变量

服务器为每一个连接的客户端都提供了系统变量,作用域为当前的连接(会话)

  1. 自定义变量

1. 用户变量

作用域:针对于当前连接(会话)生效

位置:begin end 里面,也可以放在外面

使用:

  • ①声明并赋值
set @变量名=;set @变量名:=;select @变量名:=;
  • ②更新值

方式一:

set @变量名=;set @变量名:=;select @变量名:=;

方式二:

select xx into @变量名 from;
  • ③使用
select @变量名;

2. 局部变量

作用域:仅仅在定义它的 begin end 中有效

位置:只能放在 begin end 中,而且只能放在第一句

使用:

  • ①声明
declare 变量名 类型 [default];
  • ②赋值或者更新

方式一:

set @变量名=;set @变量名:=;select @变量名:=;

方式二:

select xx into 变量名 from;
  • ③使用
select 变量名;

九、存储过程

  1. 说明

都类似于 Java 中的方法,将一组完成特定功能的逻辑语句包装起来,对外暴露名字

好处:

  1. 提高重用性

  2. SQL语句简单

  3. 减少了和数据库服务器连接的次数,提高了效率

  1. 创建
create procedure 存储过程(参数模式 参数名 参数类型)
begin
	存储过程体
end

注意:

  1. 参数模式:in、out、inout 其中 in 可以省略

  2. 存储过程体的每一条 SQL 语句都需要用分号结尾

  1. 调用

call 存储过程名(实参列表)

举例:

# 调用 in 模式的参数
call sp1('值');
# 调用 out 模式的参数
set @name;
call sp1(@name);
select @name;
# 调用 inout 模式的参数
set @name=;
call sp1(@name);
select @name;
  1. 查看
show create procedure 存储过程名;
  1. 删除
drop procedure 存储过程名;

十、函数

  1. 创建
create function 函数名(参数名 参数类型) returns 返回类型
begin
	函数体
end

注意:函数体中肯定需要有 return 语句

  1. 调用
select 函数名(实参列表);
  1. 查看
show create function 函数名;
  1. 删除
drop function 函数名;

十一、流程控制结构

  1. 顺序结构

  2. 分支结构

1. if 函数

功能:实现简单双分支

语法:

if(条件,1,值2)

位置:可以作为表达式放在任何位置

2. case 结构

功能:实现多分支

语法1:

case 表达式或字段
when1 then 语句1;
when2 then 语句2;
...
else 语句n;
end [case];

语法2

case 
when 条件1 then 语句1;
when 条件2 then 语句2;
...
else 语句n;
end [case];

位置:可以放在任何位置;如果放在 begin end 外边,作为表达式结合着其他语句使用;如果放在 begin end 里面,一般作为独立语句使用

3. if 结构

功能:实现多分支

语法:

if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n;
end if;

位置:只能放在 begin end 中

  1. 循环结构

位置:只能放在 begin end 中

特点:都能实现循环结构

对比:

  • ①这三种循环都可以省略名称,但如果循环添加了循环控制语句(leave 或 iterate),则必须添加名称

loop 一般用于实现简单的死循环

while 先判断后执行

repeat 先执行后判断,无条件至少执行一次

1. while

语法:

[名称:] while 循环条件 do
	循环体
end while [名称];

2. loop

语法:

[名称:] loop
	循环体
end loop [名称];	

3. repeat

语法:

[名称:] repeat
	循环体
until 结束条件
end repeat [名称];	
  1. 循环控制语句
  1. leave:类似于break,用于跳出所在循环

  2. iterate:类似于continue,用于结束本次循环,继续下一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值