五、多表连接查询——对分组结果进行过滤

迈不过友情╰ 2023-06-23 07:00 141阅读 0赞

五、多表连接查询——对分组结果进行过滤

1.什么是对分组结果进行过滤?

我们在对数据进行分组之后,得到了一张表,但是表内的数据如果不全是我们想要的,那该怎么办呢?数据过滤可以使用where关键字,但是这个where关键字的动作发生在数据分组汇总之前,此时如果想要对分组汇总之后的数据进行过滤的话,必须使用having关键字【在此处相当于where关键字的作用,但是where发生在数据分组汇总前,having发生在数据分组汇总后】。

2.示例:

(1)示例1

将分组汇总后的成绩高于80分的班级取出。

  1. select class,avg(score) as avg_score from grade_score group by class having avg_score>60;

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjgzMDY5Nw_size_16_color_FFFFFF_t_70

  1. select class,avg(score) as avg_score from grade_score group by class having avg_score>80;

20191217230829746.png

(2)示例2

将成绩大于80的同学进行分组统计平均分数并且取出平均成绩大于88分的班级与成绩。

第一层过滤where:过滤掉低于80分的同学的成绩。

第二层过滤having:对最终结果过滤掉低于88分的班级。

  1. select class,avg(score) as avg_score from grade_score
  2. where score>80 group by class having avg_score>88;

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjgzMDY5Nw_size_16_color_FFFFFF_t_70 1

3.where和having的比较




















where子句 having
不能使用聚合函数 可以使用聚合函数
group by分组汇总之前的过滤操作 group by分组汇总之后的过滤操作
限制的行数据 限制的是分的组

4.MySQL的执行顺序

(1)一个完整的MySQL语法

  1. select [列名/聚合函数(列名)]
  2. from 表名1,表名2,...[可以使用内连接或者外连接]
  3. where [分组前过滤条件]
  4. group by [分组列]
  5. having [分组后过滤条件]
  6. order by [列(排序条件)];

(2)示例

  1. select class,sum(score) as total_score
  2. from grade_score
  3. where score>80
  4. group by class
  5. having total_score>300
  6. order by total_score desc;

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjgzMDY5Nw_size_16_color_FFFFFF_t_70 2

执行顺序:

<1>执行from子句,找到grade_score这张表;

<2>执行where子句,将grade_score表中符合score>80这个条件的数据给取出;

<3>执行group by子句,将数据根据class列分组汇总;

<4>执行having子句,将分组汇总后的数据根据total_score>300这个条件进行过滤;

<5>执行order by子句,把最终结果根据total_score的值由大到小进行排序;

<6>执行select子句,选择出所有数据。

注意:如果存在多表连接,那么在第一步就先找到对应的表,先执行多表连接,再进行where数据过滤,后续步骤相同

发表评论

表情:
评论列表 (有 0 条评论,141人围观)

还没有评论,来说两句吧...

相关阅读