多表数据记录查询

一、学习任务1:内连接查询

第10章详细介绍了单表查询,即在关键字where子句中只涉及一张表。在具体应用中,经常需要实现在一个查询语句中显示多张表的数据,这就是所谓的多表数据记录连接查询,简称连接查询。

MySQL软件也支持连接查询,在具体实现连接查询操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所要求的数据记录,查看帮助文档可以发现,连接查询分为内连接查询和外连接查询

在具体应用中,如果需要实现多表数据记录查询,一般不使用连接查询,因为该操作效率比较低。于是MySQL软件又提供了连接查询的替代操作——子查询操作。

本章将详细介绍内连接查询、外连接查询和子查询。为了便于讲解,本章只讲解两个表间的连接查询。

可以通过两种语法形式来实现连接查询,一种方式在FROM子句中利用逗号 (,)区分多个表,在WHERE于句中通过逻辑表达式来实现匹配条件,从而实现表的连接,这是早期MySQL软件连接的语法形式;另一种是ANSI(美国国家标准协会)连接语法形式,在FROM子句中使用“JOIN…ON关键字,而连接条件写在关键字ON子句中,MySQL软件推荐使用ANSI语法形式的连接。

MySQL内连接数据査询通过SQL语句INNER JOIN...ON来实现 语法形式如下

SELECT field1 field2…fieldn FROM join_tablename1 INNER JOIN join_tablename2 lNNER JOIN join_tablenamenON join_condition 【WHERE】condition;

在上述语句中参数fieldn表示所要查询的字段名字来源于所连接的表join_tablename1 join_tablename2关键字INNER JOIN表示表进行内连接参数join_condition表示进行匹配的条件。 按照匹配情况,内连接査询可以分为如下两类:

  • 等值连接。
  • 不等连接。

为了便于讲解本节所涉及的内关联查询数据记录操作都是针对于数据库company中表示部门信息的表t_dept和雇员信息的表t_employee,关于部门表t_dept的所有数据记录和雇员表t_employee的所有数据记录如下图所示。

 

 

1.1 自连接

内连接査询中存在一种特殊的等值连接——自连接,所谓自连接就是指表与其自身进行连接,下面将通过一个具体的实例来说明如何实现自连接。

【实例11-1】执行SQL语句“INNER JOIN...ON在数据库company查询每个雇员的姓名、职位、领导姓名。

【实例分析】

为了实现上述要求,需要经过如下步骤来分析。

(1)确定需要查询的表和所査询字段的来源

根据需求需要査询两张表雇员表t_employee和领导表t_employee),前者需要查询出雇员的姓名和职位;后者需要査询出领导的姓名。

注意由于表t_employee综合了雇员和领导的信息所以表t_employee既是雇员表也是领导表。

(2)确定关联匹配条件

t_employee.mgr 雇员表的领导编号=t_employee.empno (领导表的雇员编号

【实现步骤】

SELECT e.ename employeename,e.job,L.ename  loadername FROM t_employee e INNER JOIN t_employee L  ON e.mgr=L.empno;

(3)上述SQL语句采用ANSI连接语法形式通过SELECT FROM WHERE"关键字也可以实现具体SQL语句如下

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e , t_employee L WHERE e.mgr=L.empno;

【代码说明】在上述语句中,为WHERE关键字设置匹配条件 e.mgr=L.empno”。 

【运行效果】执行上面的SQL语句,其结果如下图所示。

执行结果显示,虽然SQL语句内容不同,但是执行结果却一致,即在MySQL软件中两种方式的SQL语句执行效果是一致。

当表的名称特别长时,直接使用表名很不方便,或者在实现表自连操作时,直接使用表名没办法区分表。为了解决这些问题,在MySQL软件中,提供了一种机制来为表取别名机制,具体语法形式如下:

SELECT field1,field2,…fieldn [AS] otherfieldn

FROM table_name1 [AS] other_table_name1,…table_namen [AS] other_table namen

在上述语句中参数table_name为表原来的名字参数other_table_name为表新的名字。之所以要为表设置新的名字,是为了让SQL语句代码更加直观,更加人性化,和实现更加复杂的功能。

 

 

1.2 等值连接

内连接査询中的等值连接就是在关键字ON后的四配条件中通过等于关系运算符=)来实现等值条件。

下面将通过一个具体的实例来说明如何实现等值连接。

【实例11-2】执行SQL语句INNER JOIN...ON,在数据库company査询每个雇员的编号、姓名、职位、部门名称、位置。

【实例分析】为了实现上述要求,需要经过如下步骤来分析。

(1)确定需要查洵的表和所査询字段的来源

根据要求需要査询两张表:部门表t_dept和雇员表t_employee,前者需要査询出部门的名称和位置,后者需要查询出雇员的编号、姓名和职位。

(2)确定关联匹配条件

t_dept.deptno=t_employee.deptno

【实现步骤】

SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM t_employee e INNER JOIN t_dept d ON e.deptno=d.deptno;

(3)上述SQL语句采用ANSI连接语法形式通过SELECT FROM WHERE关键字也可以实现具体SQL语句如下

SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM t_employee e,t_dept d WHERE e.deptno=d.deptno;

【运行效果】执行上面的SQL语句,其结果如阁丨丨.25所示。

 

 

执行结果显示,虽然SQL语句内容不同,但是执行结果却一致。

上述实例中,连接的表都是2个,下面将通过一个旯体的实例来说明如何实现多表(三张表) 等值连接。

【实例11-3】执行SQL语句INNER JOIN...ON在数据库company中,查洵每个雇员的编号、姓名、基本工资、职位、领导的姓名、部门名称和位置。

【实例分析】为了实现上述要求,需要经过如下步骤来分析。

(1)确定需要查询的表和所査询字段的来源

根据耍求需要查询3张表部门表t_dept)雇员表t_employee)和领导表t_cmployee), 分别査询如下字段。

雇员表:雇员的编号、姓名、基本工资和职位。

领导表:领导的姓名。

部门表:部门的名称和位置。

(2)确定关联匹配条件

领导表连接部门表匹配条件t_employee.deptno=t_dept.deptno;

雇员表连接领导表匹配条件t_employee.mgr=t_employee.empno

【实现步骤】

SELECT e.empno,e.ename employeename,e.sal,e.job, L.ename loadername,d.dname,d.loc FROM t_employee e INNER JOIN t_employee L ON e.mgr=L.empno INNER JOIN t_dept d ON e.deptno=d.deptno;

【运行效果】执行上面的SQL语句其结果如图所示。

 

执行结果成功显示出关于雇员的编号、姓名、基本工资、职位、职位领导的姓名、部门名称和

位置。

(3)SQL语句采用ANSI连接语法形式通过SELECT FROM WHERE关键字也可以

实现,具体SQL语句如下:

SELECT e. empno, e. ename employeename, e. sal, e .job, L. ename loadername, d. dname, d. loc FROM t_employee e,t_employee L, t_dept d WHERE e.mgr=L.empno AND e.deptno=d.deptno;

【运行效果】执行上面的SQL语句其结果与上图所示一致。

1.3 不等连接

内连接查询中的不等连接,就是在关键字ON后的匹配条件中通过除了等于关系运算符来实现不等条件外,可以使用的关系运算符包含>>=”<<=!=等运算符号。下面将通过一个具体的实例来说明如何实现不等连接。

【实例11-4】执行SQL语句INNER JOINON”,在数据库company查询雇员编号大于其领导编号的每个雇员的姓名、职位、领导姓名。

【实例分析】为了实现上述要求,需要经过如下步骤来分析。

(1)确定需要查询的表和所查询字段的来源

根据要求需要査询两张表雇员表t_employee)和领导表t_employee),前者需要査询出雇员的姓名和职位;后者需要査询到领导的姓名。

(2)确定关联匹配条件

t_employee.empno (雇员表的雇员编号)=t_employee.empno (领导表的领导编号

t_employee.empno (雇员表的雇员编号>t_employee.empno (领导表的领导编号

【实现步骤】

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e INNER JOIN t_employee L ON e.mgr=L.empno AND e.empno>l.empno;

(3)上述SQL语句采用ANSI连接语法形式通过SELECT FROM WHERE关键字也可以实现具体SQL语句如下

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e , t_employee L WHERE e.empno=l.empno AND e.empno>l.mgr;

【运行效果】执行上面的SQL语句,其结果如上图所示。

 

虽然SQL语句内容不同,但是执行结果却一致。

二、学习任务2:外连接查询

MySQL软件中外连接查询会返回所操作表中至少一个表的所有数据记录,在MySQL屮数据查询通过SQL语句OUTER JOIN...ON来实现,外连接数椐査询语法形式如下:

SELECT field1 field2…fieldn FROM join_tablename1 LEFT|RIGHT|FULL OUTER JOIN join_tablename2 ON join_condition;

在上述语句中参数filedn表示所要杳询的字段名字来源于所连接的表join_tablename1join_tablename 2关键OUTER JOIN表示表进行外连接join_condition表示进行匹配的条件。

按照外连接关键字,外连接査询可以分为如下三类:

左外连接。

右外连接。

全外连接。

为了便于讲解本节所涉及的外关联查询数据记录操作都是针对于数据库company中表示部门信息的表t_dept和表示雇员信息的表t_employee。

2.1 左外连接

外连接査询中的左外连接,就是指新关系中执行匹配条件时,以关键字LEFT JOIN左边的表为参考表。

下面将通过一个具体的实例来说明如何实现左外连接。

【实例11-5】执行SQL语句LEFT JOIN...ON在数据库company査询每个雇员的姓名、 职位、领导姓名。由于名为king的雇员位于公司最高位,所以没有领导信息,本实例中要显示出名为king雇员的信息。

【实例分析】为了实现上述要求,需要经过如下步骤来分析。

(1)确定需要査询的表和所査询字段的来源

根据要求需要查询两张表雇员表t_employee)和领导表t_employee),前者需要查询出雇员的姓名和职位;后者需要查询到领导的姓名。

(2)确定关联匹配条件

t_employee.mgr (雇员表的领导编号=t_employee.empno (领导表的领导编号

【实现步驟】

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e LEFT JOIN t_employee L ON e.mgr=L.empno;

(3)修改上述SQL语句为等值连接的内连接,具SQL语句如下:

SELECT e.ename employeename,e.job,L.ename loadername FROM t_employee e INNER JOIN t_employee L ON e.mgr=L.empno;

【运行效果】执行上面的SQL语句,其结果如下图所示。

 

 

2.2 右外连接

外连接査询中的右外连接,就是指新关系中执行匹配条件时,以关键字RIGHT JOIN右边的表为参考表。

下面将通过一个具体的实例来说明如何实现右外连接。

【实例11-6】执行SQL语句RIGHT JOIN...ON在数据库company中,查询每个雇员的编号、姓名、职位、部门名称、位置。新插入一名雇员信息,名为cjgong雇员所存在的部门编号50在部门表中不存在,所以该雇员信息没有部门信息,本实例中要显示出名为cjgong雇员的信息。

 

【实例分析】为了实现上述要求,需要经过如下步骤来分析。

(1)确定需要査询的表和所查询字段的来源

根据耍求需要查询两张表:部门表t_dept和雇员表t_employee),前者需要査询出部门的名称和位置;后者需要査询出雇员的编号、姓名、职位。

(2)确定关联匹配条件

t_dept.deptno=t_employee.deptno

【实现步骤】

SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM t_dept d RIGHT JOIN t_employee e ON e.deptno=d.deptno;

【运行效果】执行上面的SQL语句,其结果如图所示。

 

执行结果成功显示出关于雇员的编号、姓名、职位和其部门名称和地址,同时还显示出姓名为cjgong雇员的相应信息。由于雇员cjgong所在部门在部门表中没有相应信息,所以该记录中部门名称(字段dname和部门地址(字段loc)的值为NULL。

(3)修改上述SQL语句为等值连接的内连接,具体SQL语句如下:

SELECT e.empno,e.ename,e.job,d.dname,d.loc FROM t_employee e,t_dept d WHERE e.deptno=d.deptno;

【运行效果】执行上面的SQL语句其结果如图所示。

 

三、学习任务3:合并查询数据记录

MySQL软件中通过关键字UNION来实现并操作,即可以通过其将多个SELECT语句的査询结果合并在一起组成新的关系。MySQL软件中实现查询数据记录合并通过SQL语句union来实现,具体语法形式如下:

SELECT field1 field2 ...fieldn FROM tablename1 UNION | UNION ALL SELECT field1 field2 ...fieldn FROM tablename2 UNION | UNION ALL SELECT field1 field2 ...fieldn FROM tablename3……

上述语句中存在多个查询数据记录语句,每个査询数据记录语句之间使用关键字UNION UNION ALL进行连接。

为了便于讲解本节所涉及的并操作都是针对于数据库company中计算机系学生的表t_cstudent和表示音乐系学生的表t_mstudent关于计算机系学生表t_cstudent的所有数据记录如图所示关于音乐系学生的表t_mstudent的所有数据记录如图所示。

 

1.带有关键字union的合并操作

关键字UNION会把查询结果集直接合并在一起,同时将会去掉重复数据记录,下面将通过一个具体的实例来说明如何使用关键字UNION

【实例11-7】执行SQL语句SELECT,在数据库company中,合并计算机系学生和音乐系学生 的数据记录信息,具体步骤如下:

SELECT * FROM t_cstudent UNION SELECT * FROM t_mstudent;

【运行效果】执行上面的SQL语句其结果如图所示。

 

2.带关键字union all的合并操作

关键字union all会把査询结果集直接合并在一起,下面将通过一个具体的实例来说明如何使用关键宇UNION

【实例11-8】执行SQL语句SELECT,在数据库company中,合并计算机系学生和音乐系学生的数据记录信息,具体步骤如下:

SELECT * FROM t_cstudent UNION ALL SELECT * from t_mstudent;

【运行效果】执行上面的SQL语句,其结果如图所示。

 

四、学习任务4:子查询

MySQL软件中虽然可以通过连接査询实现多表查询数据记录,但是却不建议使用。这是因为连接査询的性能很差。因此出现了连接査询的替代者子査询。在具体开发应用中,MySQL软件推荐使用子查询来实现多表査询数据记录。

4.1 为什么使用子查询

为了讲解清楚为什么使用子査询这个问题,需要从多表查询数据记录操作的开发经验开始。在日常开发中,用户经常会接触到查询多表数据记录操作,例如,需要查询部门表t_dept和雇员表 t_employee的数据记录。

对于新手,直接会执行如下SQL语句进行査询:

SELECT * FROM t_dept t,t_employee L WHERE t.deptno=L.deptno;

上述SQL语句在执行过程中,首先会对两个表进行笛卡儿积操作,然后再选取符合匹配条件的数据记录。进行笛卡儿积操作时,会生成两个数表数据记录数的乘积条数据记录,如果这两张表的数据记录比较大,则在进行笛卡儿积操作时就会造成死机。

笛卡尔积查询如下所示:

 

于是对于有经验的用户,首先会通过统计函数査看所操作表笛卡儿积后的数据记录数,然后才会进行多表查询。因此多表查询一般会经过如下步骤:

(1)通过统计函数COUNT()査询所关联表笛卡儿积后的数据记录数,具体SQL语句如下

SELECT COUNT(*) FROM t_dept t,t_employee L;

(2)如果査询到的数据记录数MySQL软件可以接受,然后才进行多表连接査询,否则就应该考虑通过其他方式来实现。

那么如果查询到笛卡儿积后的数据记录数远远大于MySQL软件可以接受的范围,则如何实现多表査询呢?为了解决该问题,MySQL软件提供了子查询来实现多表査询。

所谓子查询就是指在一个查询之中嵌套了其他的若干查询即在一个SELECT査询语句的 WHEREFROM句中包含另一个SELECT査询语句。在査询语句中,外层SELECT查询语句称为主查询,WHERE子句中的SELECT査询语句被称为子查询,也被称为嵌套査询。

通过子査询可以实现多表査询,该査询语句中可能包含IN、ANY、ALL和EXISTS等关键字,除此之外还可能包含比较运算符。理论上子查询可以出现在査询语句的任意位置,佴是在实际开发中子査询经常出现在WHEREFROM子句中。

  • WHERE子句中的子査询该位置处的子査询一般返回单行单列、多行单列、单行多列数据记录。
  • FROM子句中的子查询:该位置处的子査询一般返回多行多列数据记录,可以作一张临时表。
    1. 单行单列和单行多列子查询

当子查询的返回结果为单行单列数据记录时,该子查询语句一般在主查询语句的WHERE子句里,通

常会包含比较运算符号(><=!=)

1.单行单列子査询

下面将通过一个具体的实例来说明如何实现返回结果为单行单列子查询。

【实例11-9】执行SQL语句select,在数据库company查询雇员表t_employee中工资比smith还要高的全部雇员信息具体如下

SELECT * FROM t_employee WHERE sal>(SELECT sal FROM t_employee WHERE ename='SMITH');

 

执行结果成功显示出工资比SMITH还要高的全部雇员信息。

2.单行多列子査询

WHERE子句中的子査询除了是返回单行单列的数据记录外,还可以是返回单行多列的数据记录,不过这种子査询很少出现。

下面将通过一个具体的实例来说明如何实现返回结果为单行多列子査询。 

【实例11-10】执行SQL语句select,在数据库company中,查询雇员表t_employee中工资和职位与SMITH样的全部雇员信息,具体如下:

SELECT ename,sal, job FROM t_employee WHERE (sal,job)=(SELECT sal,job

FROM t_employee WHERE ename='SMITH’);

 

4.3 多行单列子查询

当子查询的返回结果为多行单列数据记录时,该子査询语句一般(不是绝对)会在主査询语句的WHERE子句里出现,通常会包含IN、ANYALL、EXISTS等关键字。

1.带有关键字IN的子查询

当主查询的条件是子査询的査询结果中时,就可以通过关键字IN来进行判断。相反如果想实现主查询的条件不是子查询的查询结果中时,就可以通过关键字NOT IN来进行判断。下面将通过一个具体的实例来说明如何实现带有关键字INNOT IN的子查询。 

【实例11-11】在数据库company中,査询雇员表t_employee中的数据记录,这些数据记录的部门编号(字段deptno)必须在部门表t_deptno)中出现,具体如下:

SELECT * FROM t_employee WHERE deptno IN (SELECT deptno FROM t__dept);

执行结果成功显示出各个部门中关于雇员的详细信息,但是由于雇员cjgong所在的部门(字段 deptno的值为50)不在部门表中,所以没有显示出该雇员的详细信息。

 

如果想通过子査询来查询关于雇员cjgong的详细信息,可以通过如下SQL语句来实现:

SELECT * FROM t_employee WHERE deptno NOT IN (SELECT deptno FROM t_dept);

执行结果成功显示出关于雇员cjgong的详细信息。

 

2.带有关键字ANY的子査询

关键字ANY用来表示主查询的条件为满足子査询返回査询结果中任意一条数据记录,该关键字有三种匹配方式,分别如下。

  • =ANY:其功能与关键字IN一样:
  • >ANY (>=ANY)比子査询中返回数据记录中最小的还要大于大于等于数据记录
  • <ANY (<=ANY)比子査询中返回数据记录中最大的还要小于小于等于数据记录。 

下面将通过一个具体的实例来说明如何实现带打关键字ANY的子查询。

【实例11-12】执行SQL语句SELECT,在数据库company査询雇员表t_employee中的雇员的姓名字段ename和工资字段sal),这些雇员的工资不低于职位字段job)MANAGER的工资具体如下

SELECT ename,sal FROM t_employee WHERE sal>=ANY(SELECT sal FROM t_employee WHERE job='MANAGER')

 

执行结果成功显示工资不低于职位为MANAGER工资的雇员的姓名和工资,通过上图可以发现职位为MANAGER的最低工资为2450,所以只要工资高于等于该值的雇员都符合要求。

3.带有关键字ALL的子查询

关键字ALL用来表示主查询的条件为满足子查询返回査询结果中所有数据记录,该关键字有以下两种匹配方式。

  • >ALL (>=ALL):比子查询中返回数据记录中最大的还要大于(大于等于)数据记录;
  • <ALL (<=ALL)比子查询中返回数据记录中最小的还要小于大于等于数据记录。

下面将通过一个具体的实例来说明如何实现带有关键宇ALL的子査询。

【实例11-13】执行SQL语句select,于数据库company査询雇员表t_employee中的雇员的姓名字段ename)和工资字段sal),这些雇员的工资高于职位字段job)MANAGER 的工资具体如下

SELECT ename,sal FROM t_employee WHERE sal>ALL(SELECT sal FROM t_employee WHERE job='MANAGER')

【运行效果】执行上面的SQL语句,其结果如图所示。

 

执行结果成功显示: 工资高于职位为MANAGER工资的雇员的姓名和工资,只要工资高于该值的雇员都符合要求。

4.带有关键字EXISTS的子查询

关键字EXISTS是一个布尔类型,当返回结果集时为TRUE,不能返回结果集时为FALSE查询时EXISTS对外表采用遍历方式逐条査询,每次杳询都会比较EXlSTS的条件语句,当EXISTS的条件语句返回记录行时则条件为真,此时返冋当前遍历到的记录;反之,如果exists里的条件语句不能返回记录行,则丢弃当前遍历到的记录。

下面将通过一个具体的实例来说明如何实现带有关键字EXlSTSNOT EXlSTS的子查询。 

【实例11-14】在数据库company中查询部门表t_dept中的字段部门编号deptno)和部门名字dname),如该部门没有员工,则显示该部门,具体如下:

SELECT * FROM t_dept c WHERE NOT EXISTS(SELECT * FROM t_employee WHERE deptno=c.deptno);

 

执行上面的SQL语句,其结果如图所示,成功显示出没有雇员的部门编号和名称。

如需显示出冇雇员的部门编号和名称,则可以使用以下SQL语句杳询:

SELECT * FROM t_dept C WHERE EXISTS(SELECT * FROM t_employee WHERE deptno=c.deptno);

 

该查询首先遍历部门表t_dept中的记录,如遍历到第条记录,然后把部门编号(t_dept)传给子查询,当子查询有返回结果时,条件为真,此时打印出遍历的第一条记录,然后依次遍历其他记录,判断方法类似。

4.4 多行多列子查询

当子查询的返回结果为多行多列数据记录时,该子査询语句一般会在主查询语句的from子句里,被当作一张临时表的方式来处理。

下面将通过一个具体的实例来说明如何实现返回结果为多行多列子査询,同时理解子查询的优势。

【实例11-15】在数据库company中,查询雇员表t_employee中各部门的部门号、部门名称、部门地址、雇员人数和平均工资,具体步骤如下:

通过内连接来实现本实例需求,具体语句如下:

SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) number,AVG(e.sal) average

FROM t_employee e INNER JOIN t_dept d ON e.deptno=d.deptno

GROUP BY d.deptno DESC;

 

执行结果成功显示出各部门的部门号、部门名称、部门地址、雇员人数和平均工资。在具体运行过程中,关于笛卡儿积的数据记录数,可以通过如下SQL语句来实现:

SELECT COUNT(*) number FROM t_employee e, t_dept d ;

执行上而的SQL语句,其结果如图所示。

 

通过子连接来实现本实例需求由于子査询返回的结果为多行多列所以该子查询在主査询FROM关键字子句里具体SQL语句如下:

SELECT d.deptno,d.dname,d.loc,number,average FROM t_dept d Inner JOIN (

SELECT deptno,COUNT(empno) as number,AVG(sal) as average FROM t_employee GROUP BY deptno DESC) as employee ON d.deptno=employee.deptno;

【运行效果】执行上面的语句,其结果如图所示。

 

执行结果成功显示出各部门的部门号、部门名称、部门地址、雇员人数和平均工资。在具体运行过程中,关于笛卡儿积的数据记录数,可以通过如下语句来实现:

SELECT COUNT(*) number FROM t_dept d ,(SELECT deptno,COUNT(empno) number,AVG(sal) average FROM t_employee GROUP BY deptno) employee;

【运行效果】执行上面的语句,其结果如图所示。

 

与内连接方式査询相比,子查询方式所操作的数据记录数目为31=15 (子查询中统计的数据记录)+16(笛卡儿积的数据记录数),远远小于前者的60,因此子査询的执行效率高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

the uzi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值