zoukankan      html  css  js  c++  java
  • mysql having和where的区别

    区别

    唯一区别是为了区别where:其实是where只能跟着from后,having只能跟着group by后。

    即:

    having是对一个表的数据进行了分组之后,对“组信息”进行相应 条件筛选;

    可见:

    having筛选时,只能根据select子句中可出现的字段(数据)来进行条件设定。

    having子句与where子句一样,都是用于条件判断的。

    区别1

    where是判断数据从磁盘读入内存的时候

    having是判断分组统计之前的所有条件

    区别2

    having子句中可以使用字段别名,而where不能使用

    区别3

    having能够使用统计函数,但是where不能使用

    一、MySQL的group by语句

    1、group by是将具有相同的进行分组,化成一块数据集合,之后配合聚合函数进行数据处理。比如:全校学生成绩表(学号,姓名,班级,成绩….),现在我需要将按照相同的班级进行分类,之后计算出每个班的最高的成绩。

    (1)创建好student_score表

    SID  SNAME CLASS  total_score
    
    

    (2)按照班级进行分类:以班级分类为主
    按照班级分类:计算出每个班的最高的成绩。

    select CLASS, SNAME from student_score group by CLASS, SNAME;
    select CLASS, MAX(TOTAL_SCORES) AS TOP from student_score group by CLASS;
    

    2、group by需要注意的几点

    • group by语句通常配合聚合函数SUM、MAX、MIN等使用处理数据。

    • group by语句中使用的聚合函数处理数据是group by分组完毕之后聚合函数是对分组数据进行处理的,不是对整个表。比如group by之后一班的成绩有250、251、253、254。聚合函数MAX()是针对一班这四个数据计算的。并不是MAX()整个表。

    • select后面的查询字段要包含在group by后面的字段中。

    select后面的列要包含在group by后面的列中。

    二、MySQL的having语句

    1、having与where的区别

    (1)where:

    • 是作用在查询结果进行分组之前,过滤掉不符合条件的数据。
    • where中不能包含聚合函数。(注意是:where后面子句不能有聚合函数,而在含有where中可以使用聚合函数)
    • 作用在group by和having字句前
    • 是作用于对表与视图

    (2)having:

    • 是作用在查询结果分组之后,筛选满足条件的组,过滤掉数据。

    • 通常跟聚合函数一起使用。

    • having子句在聚合后对组记录进行筛选。

    • 是作用于分组

    2、使用having例子

    (1)计算出每个班级的总成绩

    SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS;
    

    (2)筛选出总成绩大于505的班级

    SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS HAVING SUM(TOTAL_SCORES)>505;
    

    这里用where SUM(TOTAL_SCORES)>505的话,将会出错,因为表中根本没有总成绩分数这项,这是分组之后才有的

    3、使用having与where联立的例子

    利用having与where联立查询
    实例:查询班级中分数大于250的学生的总成绩大于531的班级有哪几个班。
    执行顺序为:
    开始 -> where行记录筛选 -> group by分组 -> 聚合函数(sum、max、min)计算 -> having分组筛选->结束

    具体的如下:

    • where筛选学生成绩大于250的所有学生。
    • group by分组班级
    • sum计算分组班级中学生的总分数
    • having筛选总成绩大于531的班级

    具体代码如下:

    -- 1.WHERE筛选出分数大于250的学生
    SELECT CLASS,SNAME,TOTAL_SCORES FROM student_score WHERE TOTAL_SCORES>250;
    
    -- 4.SUM计算之后,having筛选总成绩大于531的分组
    SELECT CLASS,SUM(TOTAL_SCORES) AS SUM_SCORE FROM student_score 
    WHERE TOTAL_SCORES>250 
    GROUP BY CLASS HAVING SUM(TOTAL_SCORES)>531;
    
  • 相关阅读:
    lua的多种实现方式(1-100的和)
    51单片机交通灯(定时器+38译码器+中断)
    51单片机定时器实现LED闪烁
    51单片机0号与1号外部中断实例
    51单片机:IO口扩展芯片用法(74HC165,74HC595)
    mybatis org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
    Intellij IDEA运行报Command line is too long解法
    Jmeter命令行运行实例讲解
    Windows10在当前目录快速打开cmd的方法
    Jmeter接口测试对json串中的值进行断言
  • 原文地址:https://www.cnblogs.com/caibaotimes/p/13722165.html
Copyright © 2011-2022 走看看