博主信息
Sky
博文
291
粉丝
0
评论
0
访问量
6711
积分:0
P豆:617

关键字--where与having的区别

2021年10月21日 19:05:47阅读数:13博客 / Sky

区别概述:

1.where是一个约束声明,使用where约束来自数据库的数据,where是在结果集返回之前起作用的,where中不能使用聚合函数。注意:返回结果集之前起作用
2.having是一个过滤声明,是在查询返回结果集以后对查询结果进行过滤操作,在Having中可以使聚合函数。注意:返回结果集之后起作用
3.在查询过程中where子句、聚合语句、having子句,的执行优先级为where>group by>聚合语句(sum、count、avg、max、min)>having子句

举例说明:

<1.假设有数据表:

CREATE TABLE  `test`.`salary_info` (  
 `id` int(10) unsigned NOT NULL auto_increment,  
 `department` varchar(16) NOT NULL default '',  
 `name` varchar(16) NOT NULL default '',  
 `salary` int(10) unsigned NOT NULL default '0',  
  PRIMARY KEY  (`id`)  
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

example 1: 要查找平均工资大于3000的部门

select department,avg(salary) from salary_info group by department having avg(salary)>3000

解释:此时我们只能用having,而不能使用where子句。1.sql语句中使用了聚合函数。2.对聚合后的结果进行筛选。所以不能使用where。3.可以从题目中看出平均工资3000,是必须要知道总额之后才能计算出平均值,也就是在知道结果集之后才能计算出avg,这就是使用having的原因

example 2: 要查询每个部门工资大于3000的员工个数

select department,count(*) as c from salary_info where
salary>3000 group by department

解释:1.此处的sql执行顺序是这样的 where语句在没有获得结果集之前对数据进行约束,符合条件的数据被筛选出来,然后对数据分组,然后对每个分组的数据进行count统计。这个执行顺序是跟区别概述中二手手机转让平台第三条对应的,这也是优先级是以上所述的原因。
2.可以从题目中看出个人工资大于3000的员工个数,则在count之前,必须把工资大于3000的员工晒寻出来。在返回结果集之前先得把这些人筛选出来,而返回结果集之前的操作使用where。

<2.假设有数据表:Orders

o_Id   |     OrderDate   |    OrderPrice   |    Customer
 1          2008/12/29          1000               yy
 2          2008/11/23          2000               xx
 3          2008/10/05          1600               mm
 4          2008/09/28          700                 hh
 5          2008/08/06          300                 gg
 6          2008/07/21          100                 uu

example 1: 计算"OrderPrice" 字段的平均值

select avg(OrderPrice) as v from Orders;

example 2:找到OrderPrice 大于OrderPrice平均值的客户

select Customer From Orders where OrderPrice>(select avg(OrderPrice) as v from Orders);
//这个()语句是第一个where语句的子查询,先执行子查询,再以子查询的结果作为筛


版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • java面试题及答案:果不其然,在上次面试中面试官又问了这样问题:请你说下final具体含义,并详细讲解它作用以及它static
    this是自身一个对象,代表对象本身,可以理解为:指向对象本身一个指针。super可以理解为是指向自己超(父)类对象一个指针,而这个超类指是离自己最近一个父类。
    Java抽象类接口:1、接口只有定义,不能有方法实现,而抽象类可以有定义实现;2、实现接口为implements,继承抽象类为extends;3、接口强调特定功能实现,而抽象类强调所属
    JS中变量声明总计共有两种方式,利用let和var,那么这两种方式又有什么呢?本文就带大家一起来了解一下二者
    :1、phpclass不能有除abstract、final之外修饰符;而Java可以有。2、phpnew后面类名可以是符串类型变量,java不可以。
    :1、静电容触发原理是根据电容量多少来判断按;机械盘是通过力量触发按,每一颗按下都有一个单独;2、静电容盘不会有噪音问题;机械盘是通过物理触碰来实现打,有盘噪音
    java入门教程:本文为大家介绍了Java中classClass有什么,具有一定参考价值,希望可以帮助到大家。class是Java中,在声明类时使用。
    为:1、接口是通过interface来定义,抽象类是通过abstract来定义;2、接口没有数据成员,但是抽象类有数据成员,抽象类可以实现数据封装;3、接口没有构造函数,抽象类可以有构造函数
    php中抽象类和接口:1、抽象类可以有属性、普通方法,接口不能有属性和普通方法;2、抽象类中未必有抽象方法,接口中一定有抽象方法;3、抽象类使用abstract声明,接口使用interface
    :1、C语言源文件扩展名是“.h”和“.c”,Go语言源文件扩展名是“.go”。2、C语言中通过文件来管理代码,Go语言中通过包来管理代码。
    规则是:1、标识符第一个符必须是母(a~z或A~Z)或下划线(_);2、后面跟符是由任意母、下划线(_)、数组成;3、标识符中大小写母是有,代表不同含义;4、标识符不能是
    :1、静态方法是使用static修饰方法,属于类,不属于对象;非静态方法是不使用static修饰普通方法,属于对象,不属于类。
    解决方法:1、打开excel表格,选中数据列单元格域;2、点击“方方格子”(插件)中“统计分析”;3、点击“提取指定域”,勾选“含有文本”并输入需要提取;4、勾选“此单元格”,然后点击“
    PHP常量和变量:1、变量没有定义或函数,在赋值时候被定义,而常量必须使用“define()”函数来定义;2、变量名前需要使用美元符号“$”修饰,而常量名则不需要。
    javascript声明变量不用var可以用let和const
    计算机能够直接识机器语言是由操作码和操作数两部分组成,操作码规定了指令操作,是指令中,不能缺省;操作数表示该指令操作对象,计算机指令格式机器长、存储器容量及指令功能都有很大
    PHP抽象类和接口:1、抽象类用abstract在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明;2、抽象类抽象方法一定要用abstract
    :1、lock是一个接口,而synchronized是java一个
    java入门程序:本文从内存角度和运行机制角度为大家分析了静态修饰和非静态修饰,具有一定参考价值,希望可以帮助到大家。static不可以修饰局部变量,因为局部变量存放在栈中。
    ​在JavaScript中,函数声明和函数表达式都是使用function来创建函数,是不是觉得它们很像,很容易混淆。