where group by having语句详解(必须掌握的sql语句重点)(详细)

首先我们思考这几个问题

  1. 在编写sql语句的时候,他们的作用都是一样的,后面接判断条件。where和having到底怎么区别?
  2. group by 语句怎么用?他有什么作用?
  3. where后面可以使用聚合函数吗?
  4. 聚合函数可以在哪使用?

这里先给出答案(结论):

  • having只能对group by的结果进行操作,必须接在group by的后面,而where不能接在group by的后面。

  • where执行的过程是:根据条件,从from的表中取出一条一条的元组(一条数据)组成一个元组集合。

    where子句可以独立完成

  • group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。

  • 聚集函数也叫列函数,它们都是基于整列数据进行计算的,聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!

  • where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。

    注:(元组:就是一行数据)

要想了解这些结论,我们来看看sql语句执行的原理:

  1. FROM 子句返回初始元组集和。
  2. WHERE 子句排除不满足搜索条件的行。返回一个元组集和。
  3. GROUP BY 子句将选定的行收集到 GROUP BY 子句中各个唯一值的组中。
  4. HAVING 子句排除不满足搜索条件的行。后面可以接聚合函数
  5. ORDER BY 对结果集进行排序。
  6. SELECT 查找你要搜索的字段。

我们要注意:group by和聚合函数都只能对where查询出来的结果集进行操作。

举例说明:

--选择数学语文总分大于190的学生,按学号排序
SELECT sno,name,SUM(grade)
from sc
where cno in ('数学','语文')
group by sno
having SUM(grade)>300
order by sno

这个句子的执行过程是这样的

那么我们不能在where子句中使用这些聚合函数,为什么呢?

聚集函数也叫列函数,它们都是基于整列数据进行计算的,而where子句则是对数据行进行过滤的(这里过滤是在一个记录里边过滤的,基于"行"),where 会根据后面的条件进行结果集的确定,而聚合函数是对结果集进行操作,它两组合在一起是矛盾的。更简单地说,因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!(要在步骤2结束后才能对where确定的结果集进行操作)

where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。

注意:我们给出的例子有错误的地方:

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。

这是一个group by语句的一个原则。自己写语句的时候一定要注意!!!

例子正确的写法:

--选择数学语文总分大于190的学生,按学号排序
SELECT sno,name,SUM(grade)
from sc
where cno in ('数学','语文')
group by sno,name --(这里一定包含全部select 语句后不是聚合函数的属性)
having SUM(grade)>300
order by sno

猜你喜欢

转载自blog.csdn.net/zphuangtang/article/details/109130503
今日推荐