mysql中where、on、having使用场景

一、where和having

  • ”where“是在结果返回之前起作用,where后面不能使用”聚合函数“;
  • “having”是在结果返回之后起作用,having后面可以使用“聚合函数”;

常见的聚合函数如:sum()、max()、min()、avg()

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1wherehaving都可以用的场景
select name, score from task where score > 60;
select name, score from task having score > 60;
# having是从选择的字段再筛选,而where使用数据表中的字段直接筛选,select中选择了score,所用使用wherehaving效果一样

# 2、只可以用having,不可以用where的场景
select name, avg(score) as avgScore from task group by subject having > 60;
select name, avg(score) as avgScore from task group by subject where > 60; # 错误,表格中没有average这个字段
# 这里只能使用having,因为where后面的字段必须是数据表格里存在的字段,换成avg(score)也会报错

# 3、只可以用where,不可以用having的场景
select name, age from task where score > 60;
select name, age from task having score > 60; # 报错,select中没有score字段

二、where和on

数据库在做连接查询的时候,会生成一张临时表。

  • where在临时表生成后,再对临时表进行过滤
  • on是在生成临时表时使用条件,(例如:在left join时,无论on条件是否成立,都会返回左表记录)