MYSQL必知必会:分组查询和子查询

时间:2021-08-25 09:48:51

除了一些汇总函数之外,还可以根据字段进行分组,分组之后再进行数据的汇总或过滤等其他查询操作.

下面有张表t5,分别有id,name,subject,score四个字段.
MYSQL必知必会:分组查询和子查询

1.分组过滤.
分组过滤是把一张表内的剩余的记录通过某个字段进行分组,关键词是group by.剩余的指的是:再分组过滤之前,我们可以先通过where过滤一部分记录.然后在进行分组操作.

先看下第一个例子.
example1:要求列出每个学生的名字和考试的门数.在这里我们对name字段进行分组,然后通过调用count(*)函数来获得每个组的记录数量.

MYSQL必知必会:分组查询和子查询

example2:要求列出考试门数大于2门的学生的名字和考试的门数.这里就需要先通过name进行分组,然后再分组的基础上,再进行过滤.当然这里的关键词不是where,而是having.where和having很像,但是他们最大的区别在于:
where用于对记录的过滤.having用于对组的过滤.也就是说where用于分组前过滤数据,having再分组后进行过滤.

MYSQL必知必会:分组查询和子查询

example3:要求列出分数>80分的科目数量>=2门的学生的姓名和科目数量.这里就需要先对所有的记录进行过滤,然后再进行分组,再对组进行过滤.

MYSQL必知必会:分组查询和子查询

example4:要求列出每个科目得最高分的学生的姓名和分数.(假设最高分没有重叠.)
这里就根据subject字段进行分组,然后对每个组调用了max()函数找出分数最高的学生的姓名和分数.注意order by排序是在之前的所有操作完成后才执行的..

MYSQL必知必会:分组查询和子查询

2.子查询

子查询指的是:把一个查询语句查询到的结果,作为筛选过滤的条件来进行条件过滤.见下例.
example5:根据表t5,列出所有分数中得到最高分的一名学生的所有考试科目以及成绩.(如果最高分相同,则按照名字字典序排列.)
根据题目,很清楚:
第一步:只需要先找到得到分数最高的学生名字.返回的是一个值.(在这个例子是一个值.)
第二步:去查询这个学生名字的所有考试记录即可.

我们把两个步骤的语句写到一个语句中去,第一步的步骤就作为第二步的子查询.子查询可以嵌套多层.但是由于性能的限制,最好不要嵌套太多的子查询,你必须要知道,并不是说在mysql数据中查询语句不用花费太多的时间.

MYSQL必知必会:分组查询和子查询

之前的例子一直都是单表查询,下面再多加一张学生信息表.分别有学号,名字,性别3个字段.

MYSQL必知必会:分组查询和子查询

example6:*要求列出考试门数大于2门的学生的学号,名字和性别.
这里就可以通过in操作符来过滤数据.

MYSQL必知必会:分组查询和子查询