Mysql数据库

Mysql数据库

  • Mysql是一个RDBMS(关系型数据库管理系统).

Mysql基本命令

mysql -V
//查看mysql版本
net start mysql
//启动mysql服务器
net stop mysql
//关闭mysql服务器

语法规范:
关键字与函数名称全部大写.
数据库名称、表名称、字段名称全部小写
注意: 在Windows系统中mysql不区分大小写, 而在Linux系统是是区分大小写的.
MYSQL命令以分号结束.

  • 引擎
SHOW ENGINES \G //查看mysql支持的存储引擎
SHOW ENGINES;   // ;和\G都表示语句结束

在这里插入图片描述
在这里插入图片描述
操作默认存储引擎是InnoDB

数据类型

在创建库之前先了解mysql的数据类型.

  • 整型
    Mysql除了支持SQL中的所有整型类型外,还额外增加了TINYINT、MEDIUMINT和BIGINT这三个整数类型.
    TINYINT占一个字节,SMALLINT占两个字节,MEDIUMENT占三个字节,INT和INTEGER占四个字节,BIGINT占八个字节
  • 浮点型、定点数类型和位类型
    浮点型分为FLOAT占四个字节, DOUBLE占8字节.
    定点数类型用的较少在此不做介绍.
    位类型BIT(M) 位类型根据M的取值来决定存储空间(1-8字节)
  • 日期和时间类型
    此处只介绍最常用的日期和时间类型,其他类型可自行查找.
    DATE类型,占四个字节表示年月日.
    DATETIME类型,占八个字节,表示年月日时分秒.
    TIME类型,占三个字节,表示时分秒.
  • 字符串类型
    CHAR(M) M为0~255之间的整数,占M个字节.
    VARCHAR(M) M的取值在0~65535之间的整数,占M个字节.
    CHAR和VARCHAR的区别是长度是否可变, 在此更推荐使用VARCHAR类型.
    ENUM(“value1”,“value2”,…) 枚举
    SET(“value1”,“value2”,…) 集合
    字符串类型还要TEXT系列类型、BINARY系列类型和BLOB系列类型,这些类型使用的较少也不做介绍.
    tips: MySQL是不支持布尔型的,但如果设置成了布尔型MYSQL会自动转换成tinyint(1),这其实就是变相的布尔型.

Mysql创建库、表

登录Mysql

mysql -uroot -pmysql -h127.0.01 -P3306
//root账号, 密码是安装mysql设置的
//-h为服务器,-P为端口号, 一般情况下只需要账号密码即可

在mysql没有登录时使用mysql --prompt 提示符
或者是已经登录后直接输入prompt 提示符
提示符\u当前用户 \h数据库名称 \D完整日期 \d当前数据库用 使用@连接

SHOW DATABASES; 	//查看数据库
SELECT VERSION();	//查看版本
SELECT NOW();		//查看当前用户
SHOW WARNINGS; 		//查看警告
创建库

数据库包括 : 数据表、索引、视图等
创建数据库
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET charset_name;

CREATE DATABASE csdn_1 CHARACTER SET utf8;
SHOW CREATE DATABASE csdn_1;

在这里插入图片描述

修改数据库

ALTER DATABASE db_name CHARACTER SET xxx;

删除数据库

DROP DATABASE table_name;
从删库到跑路

创建表

创建表前需要先选择数据库
CREATE TABLE [IF NOT EXISTS] table_name(
column_name data_type,
…);
column_name类名 data_type 数据类型

USE csdn_1;
 CREATE TABLE test1(
 id SMALLINT PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(20) NOT NULL,
 age TINYINT UNSIGNED NOT NULL,
 salary FLOAT(8,2) UNSIGNED,
 register DATE
 )CHARACTER SET utf8;
 
添加约束

PRIMARY KEY 主键
NOT NULL 约束字段的默认值
AUTO_INCREMENT 约束字段的值为自动增加
DEFAULT 默认值 设置字段的默认值
UNSIGNED 设置字段只能为正值
UNIQUE KEY 约束字段的值唯一
AUTO INCREMENT 自增(多用于id列)

  • 查看创建数据表的创建信息
SHOW CREATE TABLE tb_name;  

在这里插入图片描述

  • 查看表定义
DESC test1;
DESCRIBE test1;  //效果和DESC相同
//先要使用数据库, 并且表是数据库中存在的表.

在这里插入图片描述

修改表

对于已经创建好的表, 需要对表的结构进行修改需要使用ALTER.

ALTER TABLE old_table RENAME TO new_table //修改表名
  • 增加字段
    表由行和列构成, 字段就是列.
ALTER TABLE table_name ADD 列名 类型 约束;
//添加的字段位于表的末尾

在这里插入图片描述

ALTER TABLE table_name ADD 列名 类型 约束 FIRST;
//在表的第一个位置添加字段
ALTER TABLE table_name ADD 列名 类型 约束 AFTER 字段名;
//在指定字段名后添加字段
  • 删除字段
ALTER TABLE table_name DROP 属性名;

在这里插入图片描述

  • 修改字段

修改字段的数据类型

ALTER TABLE table_name MODIFY 列名 数据类型

注意: 修改字段的数据类型一般情况下是小改大, 从而避免不可预知的错误.

  • 删除表

删除库中的表

DROP TABLE table_name;

Mysql数据表的增删改查

数据表的查找是使用最为频繁的操作
SELECT [DISTINCT] 关键字1[,关键字2] FROM 表 [
[WHERE 条件]
[GROUP BY 列名[ASC | DESC],…] 根据列分组
[HAVING 条件] 分组结果之后条件查询
[ORDER BY 列名 [ASC | DESC],…] 排序
[LIMIT {[OFFSET,] row_count | row_count OFFSET pffset}]
]
ASC升序默认, DESC降序
GROUP BY 在5.7版本以上会报错
5.7版本以上解决GROUP BY
SELECT @@global.sql_mode;

SELECT * FROM test1; //查看test1表的所有记录

WHERE后面是条件, GROUP BY根据类名来进行分组(可以有多个列), HAVING 是GROUP BY的搭档,只能和GROUP BY 一起使用,是分组后的条件语句, ORDER BY 是排序, LIMIT有两种用法,
第一种: LIMT n 返回表中的前n条数据.
第二种: LIMIT n m 返回从下标n开始取m个值

select * from tb1 LIMIT 3,5 //从下标3开始取值,取5条,取3到7的所有数据
  • 多表查询时, 如果存在相同的列,可以表名.列名
SELECT test1.id ...;

查询表中有多少条记录

select count(*) from table_name;

查询不重复的结果

SELECT DISTINCT 列名称 FROM 表名称;  //DISTINCT返回不重复的值

特殊条件查询
空判断值

SELECT * FROM table_name WHERE name is null;

between and (区域间值)

SELECT * FROM table_name WHERE price between 150 and 500;
//查询价格在150到500之间的所有信息

In

SELECT * FROM table_name WHERE price in (299,399,499);
//查询price值为299,399,499的所有信息

模糊查询like

SELECT * FROM table_name WHERE name like '王%';

查询table_name表的name列中有王的值, 王是模糊信息

  • %表示多个字符, _表示单个字符;
  • 王% 可以是通配符、正则表达式, 表示的意思为模糊查询以王开头;
  • %王% 表示查询的包含王在在内的所有内容
  • %王_ 表示查询以王在倒数第二位的所有内容

link

SELECT * FROM table_name WHERE name LIKE 'G%';
//查询以字母G开头的所有内容

link和like的区别在于, like是模糊查询, link的指定查询

插入记录
INSERT [INTO] 表名 [(列名1,列名2,…)] {VALUES | VALUE} ({expr | DEFAULT},…),(…),… ;

INSERT [INTO] 表名 SET col_name={expr | DEFAULT},…

INSERT [INTO] 表名 [(col_name,…)] SELECT …

INSERT INTO test1 VALUES(NULL,'mhhb',18,NULL,NULL);//如果某个键设置了自增可以直接用NULL,只有不是非空列都可以填写NULL
//也可以指定列名
INSERT INTO test1(id,age) VALUES('mhhb',18);

INSERT也可以将SELECT的查询结果插入到表中, 这涉及到子查询, 下面会讲解.

更新数据

UPDATE table_name SET 字段='haha' WHERE id=1;
//如果没有WHERE则是给表中的某一字段赋相同的值

删除记录

DELETE FROM 表名 WHERE 条件 
//删除表中数据的条件应该使用有代表性不重复的值,最好是主键
子查询

子查询是指出现在其他SQL语句内的SELECT子句.

SELECT * FROM table_name WHERE id = (SELECT id FROM t1);

其中SELECT * FROM table_name称为外部查询, SELECT id FROM t1是子查询.

子查询指嵌套在查询内部, 且必须始终出现在圆括号内.

子查询可以包含多个关键字或条件例如: DISTINCT、GROUP BY、、LIMIT函数等.

子查询的外部查询可以是SELECT,INSERT,UPDATE,SET或DO.

表连接

在这里插入图片描述

内连接(INNER JOIN ON)

MySQL的内连接使用inner join on,它的效果和使用where是一样的, 如果联结的是两个表, 那么左右的条件或者说字段是需要完全匹配的.

有两张表customers客户表和orders订单表, 外键是cust_id, 需要知道知道哪些客户有订单.

SELECT customers.cust_id,orders.order_number 
FROM customers,orders 
WHERE customers.cust_id = orders.cust_id;

使用内连接

SELECT customers.cust_id,orders.corder_num 
FROM customers INNER JOIN orders 
ON customers.cust_id = orders.cust.id;

在这里插入图片描述

外连接
SELECT customers.cust_id,orders.order_num 
FROM customers RIGHT JOIN orders 
ON customers.cust_id = orders.cust_id;
//customers为右表, orders为左表

外连接分为左连接和右连接

说明:在某些数据库中, RIGHT JOIN 写成 RIGHT OUTER JOIN
左连接

左连接的结果是除了匹配条件的数据还包含左边表中的数据
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SELECT ...
FROM table1 LEFT JOIN table2
ON ...

在这里插入图片描述

右连接

右连接的结果是除了匹配条件的数据还包括右边表中的所有数据.
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

SELECT ...
FROM table1 RIGHT JOIN table2
ON ...

在这里插入图片描述
在连接之后使用条件

SELECT ...
FROM table1 
	LEFT JOIN table2 ON table1 .id = table2 .id
	INNER JOIN table3 ON table1 .id = table3 .id
	AND table2.id = ...
	AND table3.id = ...
WHERE
	table1.uid = 10

连接之后的AND也是条件, 代表是链表之后的数据再筛选, 最后where是链表之后的数据再条件

MySQL复制表数据

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

INSERT INTO table2
SELECT * FROM table1;

将table1的内容复制到table2中(table1和table2都要求存在).

事务

MySQL事务主要是用于处理操作量大, 复杂度高的数据. 比如说,在人员管理系统中, 你删除一个人员, 你既需要删除人员的基本资料, 也要删除和该人员相关的信息, 如信箱, 文章等等, 这样, 这些数据库操作语句就构成了一个事务.

  • 在MySQL中只有使用了InnoDB数据库引擎的数据库或表才支持事务.
  • 事务处理可用用来维护数据库的完整性, 保证成批的SQL语句要么全部执行, 要么全部不执行.
  • 事务用来管理insert, update, delete语句
    一般来说, 事务是必须满足四个条件(ACID): 原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability).
  • 原子性: 一个事务(transaction)中的所有操作, 要么全部完成, 要么全部不完成, 不会结束在中间某个环节. 事务在执行过程中发生错误, 会被回滚(Rollback)到事务开始前的状态, 就像这个事务从来没有执行过一样.
  • 一致性: 在事务开始之前和事务结束之后, 数据库的完整性没有被破坏. 这表示写入的资料必须完全符合所有预设规则, 这包含资料资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作.
  • 隔离性: 数据库允许多个并发事务同时对其数据进行读写和修改的能力, 隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致. 事务隔离分为不同级别, 包括读未提交、读提交、可重复读和串行话.
  • 持久性: 事务处理结束后, 对数据的修改就是永久的, 即便系统故障也不会丢失.

在MySQL命令行的默认设置下, 事务都是自动提交的, 即执行SQL语句后就会立马执行COMMIT操作. 因此要显示地开启一个事务务须使用命令BEGIN或START TRANSACTION, 或者执行命令SET AUTOCOMMIT=0, 用来禁止使用当前会话的自动提交.

事务控制语句
  • BEGIN 或 START TRANSACTION 显式地开启一个事务;
  • COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
  • ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
  • SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  • ROLLBACK TO identifier 把事务回滚到标记点;
  • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
MySQL事务处理主要的两种方法

一. 用BEGIN, ROLLBACK, COMMIT来实现:

  • BEGIN开始一个事务
  • ROLLBACK事务回滚
  • COMMIT事务确认

二. 直接用SET来改变MySQL的自动提交模式:

  • SET AUTOCOMMIT=0禁止自动提交
  • SET AUTOCOMMIT=1开启自动提交
测试部分
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;  # 创建数据表
Query OK, 0 rows affected (0.04 sec)
 
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
 
mysql> begin;  # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
 
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
 
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
 
mysql>  select * from runoob_transaction_test;
+------+
| id   |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql> begin;    # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql>  insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
 
mysql> rollback;   # 回滚
Query OK, 0 rows affected (0.00 sec)
 
mysql>   select * from runoob_transaction_test;   # 因为回滚所以数据没有插入
+------+
| id   |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql>

使用保留点SAVEPOINT
savepoint是在数据库事务处理中实现"子事务"(subtransaction), 也成为嵌套事务的方法. 事务可以回滚到savepoint而不影响savepoint创建前的变化, 不需要放弃整个事务.
ROLLBACK回滚的用法可以设置保留点SAVEPOINT, 执行多条操作时, 回滚到想要的那条语句之前.
使用SAVEPOINT

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> SAVEPOINT savepoint_name;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into runoob_transaction_test value(213);
Query OK, 1 row affected (0.00 sec)

mysql> insert into runoob_transaction_test value(212);
Query OK, 1 row affected (0.00 sec)

mysql> insert into runoob_transaction_test value(2123);
Query OK, 1 row affected (0.00 sec)

mysql> ROLLBACK TO savepoint_name;
Query OK, 0 rows affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

SAVEPOINT在执行一条ROLLBACK或COMMIT后自动释放.
在MySQL5中, 可以用

RELEASE SAVEPOINT savepoint_name; 

删除指定保留点

存储过程

在这里插入图片描述

函数

在这里插入图片描述

视图

在SQL中, 视图是基于SQL语句的结果集的可视化的表.
视图包含行和列, 就像一个真实的表. 视图中的字段就是来自一个或多个数据库中的真实的表中的字段.

SQL CREATE VIEW 语法
CREATE VIEW view_1 AS
SELECT column_name(s)
FROM column
WHERE id<100

视图总是显示最新的数据, 每当用户查询视图时, 数据库引擎通过使用视图的SQL语句重建数据.

实例

样本数据Northwind拥有一些被默认安装的视图
视图"Current Product List"会从"Products"表列出所有正在使用的产品(未停产的产品).这个视图使用下面的SQL创建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinue=No

查询上面的视图:

SELECT * FROM [Current Product List]

Northwind样本数据的另一个视图会选取"Products"表中所有单位价格高于平均单位价格的产品:

CREATE VIEW [Product Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

查询上面的视图:

SELECt * FROM [Products Above Average Price]

Northwind样本数据库的另一个视图会计算在1997年每个种类的销售总数.这个视图会从另一个名为"Product Scale for 1997"的视图中选择数据:

CREATE VIEW [Category Scales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductScales) AS CategoryScales
FROM [Product Scales for 1997]
GROUP BY CategoryName

查询上面的视图:

SELECT * FROM [Category Scale For 1997]

也可以向查询添加条件.

SELECT * FROM [Category Scales For 1997]
WHERE CategoryName='Beverages'
//只查看Beverages类型的销售总数

索引

MySQL索引是建立对于MySQL的高效运行是很重要的, 索引可以大大提高MySQL的检索速度.
打个比方, 如果合理的设计且使用索引的MySQL是一辆超级跑车的话, 那么没有设计和使用索引的MySQL就是一个人力三轮车.

索引分单列索引和组合索引. 单列索引, 即一个索引只包含单个列, 一个表可以有多个单列索引, 但这不是组合索引. 组合索引, 即一个索引包含多个列.

创建索引时, 你需要确保该索引时应用在SQL查询语句的条件(一般作为WHERE子句的条件).

事实上, 索引也是一张表, 该表保存了主键与索引字段, 并指向实体表的记录.

使用索引的好处很多, 但是过多的使用索引会造成滥用. 因此索引页会有它的缺点: 虽然索引大大提高了查询速度, 同时也会降低更新表的建立索引会占用磁盘空间的索引文件.

普通索引

这是最基本的索引, 它没有任何限制. 它有以下几种创建方式:

CREATE INDEX indexName ON table_name(column_name)

如果CHAR、VARCHAR类型,length可以小于字段实际长度; 如果BLOB和TEXT类型, 必须制定length.

修改表结构(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接指定

CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX[indexName](username(length))
);

删除索引的语法

DROP INDEX [indexName] ON mytable;
唯一索引

它与前面的普通索引类似, 不同的就是: 索引列的值必须唯一, 但允许有空值. 如果是组合索引, 则列值的组合必须唯一. 它有以下几种创建方式:

CREATE UNIQUE INDEX indexName ON mytable(username(length))

修改表结构

ALTER table mytable ADD UNIQUE [indexName](username(length))

创建表的时候直接指定

CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName](username(length))
);
使用ALTER命令添加和删除索引

有四种方式来添加数据表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY(column_list) : 该语句添加一个主键, 这意味着索引值必须 唯一的, 且不能为NULL.
  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引.

mysql>ALTER TABLE testalter_tbl ADD INDEX(c);

还可以在ALTER命令中使用DROP子句来删除索引. 尝试以下实例删除索引

mysql>ALTER TABLE testalter_tbl DROP INDEX c;
使用ALTER命令添加和删除主键

主键作用于列上(可以一个列或多个列联合主键), 添加主键索引时, 你需要确保该主键默认不为空(NOT NULL).

mysql>ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql>ALTER TABLE testalter_tbl ADD PRIMARY KEY(i);

你也可以使用ALTER命令删除主键

mysql>ALTER TABLE testalter_tbl DROP PRIMARY KEY;

删除主键时只需要指定PRIMARY KEY,但在删除索引时, 你必须知道索引名.

显示索引信息

你可以使用SHOW INDEX命令来列出表中的相关的索引信息. 可以通过添加\G来格式化输出信息.

mysql>SHOW INDEX FROM table_name; \G

临时表

游标

数据库调优

一三九

一.创建索引
  1. 要避免全表扫描, 首先应考虑WHERE和ORDER BY涉及的列上建立索引.
  2. 1)在经常需要进行检索的字段上创建索引, 比如要按照字段username进行检索, 那么就应该在员工部门和员工岗位级别这两个字段上创建索引. 2)创建索引给检索带来的性能提升往往是巨大的, 因此在发现检索速度过慢的时候应该首先想到的就是创建索引. 3)一个表的索引数最好不要超过6个, 若太多则应考虑一些不常使用到的列上建的索引是否有必要. 索引并不是越多越好, 索引固然可以提高相应地select的效率, 但同时也考虑建索引需要慎重考虑, 视具体情况而定.
二.使用预编译查询

程序中通常根据用户的输入来动态执行SQL, 这时应该尽量SQL, 这样不仅可以避免SQL注入漏洞攻击, 最重要数据库会对这些参数化SQL进行预编译, 这样第一次执行的时候DBMS会为这个SQL语句进行查询优化, 并且执行预编译, 这样以后再执行这个SQL的时候, 这样可以大大提高执行的速度.

三.考虑使用"临时表"暂存中间结果

简化SQL语句的重要方法就是采用临时表暂存中间结果, 但是, 临时表的好远远远不止这些, 将临时结果暂存临时表, 后面的查询就在tempdb中了, 这可以避免程序中多次描述主表, 也大大减少了程序执行中"共享锁" 阻塞 “更新锁”, 减少了阻塞, 提高了并发性能.
但是也得避免频繁创建和删除临时表, 以减少系统表资源的消耗.

四.尽量将多条SQL语句压缩到一句SQL中

每次执行SQL的时候要建立网络连接、进行校验权限、进行SQL语句的查询优化、发送执行结果, 这个过程是非常耗时的, 因此应该尽量避免过多的执行SQL语句, 能够压缩到一句SQL执行的语句就不要用多条来执行.

五.避免在索引上使用计算

在WHERE字句中, 如果索引列是计算或者函数的一部分, DBMS的优化器将不会使用索引而使用全表查询, 函数属于计算的一种, 同时在IN 和EXISTS中通常情况下使用EXISTS, 因为IN不走索引

备份与恢复概述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值