where与having的区别

区别概述:

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语句的子查询,先执行子查询,再以子查询的结果作为筛选条件,过滤出结果集

博客搬家:大坤的个人博客
欢迎评论哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "where"和"having"是SQL查询语言中的两个不同的关键词。 "where"用于指定一个条件,以过滤表中的记录。例如,如果您想在表中选择所有具有特定值的记录,则可以使用"where"子句。 "having"也用于过滤数据,但它是在聚合函数(如SUM、AVG、COUNT等)已经被应用后进行的。例如,如果您想从已计算出总和的结果中选择特定值,则可以使用"having"子句。 因此,"where"和"having"的区别在于它们用于过滤数据的不同阶段。"where"用于过滤记录,而"having"用于过滤已聚合的数据。 ### 回答2: "where" 与 "having" 是两个在SQL查询中常用的关键字,它们在查询数据时有一些区别。 "where" 子句是用于在查询时对行进行筛选的条件。它在执行查询之前应用,并在从表中选择行时进行过滤。通过 "where" 子句,可以基于列的值来限制返回的结果。例如,可以使用 "where" 子句来选择所有满足特定条件的行,比如 "age > 18" 选择所有年龄大于18岁的人。 相反,"having" 子句是用于在对结果集进行分组后对分组进行筛选的条件。它在 "group by" 子句之后应用,并在结果集中对分组进行筛选。通过 "having" 子句,可以基于聚合函数的结果来限制返回的结果。例如,可以使用 "having" 子句来选择满足特定条件的分组,比如 "sum(sales) > 1000" 选择所有销售总额大于1000的分组。 总结起来,"where" 子句用于对行进行筛选,而 "having" 子句用于对分组进行筛选。这是因为 "where" 子句在查询执行之前应用,而 "having" 子句在查询执行之后应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值