别再踩坑了!彻底弄懂SQL where与having用法及区别

1,675 阅读1分钟

总结和区分where和having用法和区别, 从熟练到掌握

截屏2022-04-01上午9.45.33.png

where

定义

where 用于过滤,提取满足指定标准的记录

语法

select * from table_name where 条件A and 条件B;
select * from table_name where 条件A and 条件B or 条件C;
select * from table_name where (字段名A, 字段名B) = (值C, 值D)

注意:第一步会先运行and,第二步会运行or;如果要先运行or,则需要加小括号。

WHERE 子句中的运算符

下面的运算符可以在 WHERE 子句中使用:

运算符描述
=等于
<>不等于。注释: 在 SQL 的一些版本中,该操作符可被写成 !=
大于
<小于
>=大于等于
<=小于等于
BETWEEN在某个范围内
LIKE搜索某种模式
IN指定针对某个列的多个可能值

实例

select * from Students where name = 'ZhangSan'

select * from Students where id = 1

文本值使用引号括起来,数值字段,请不用使用引号


having

定义

having 用于过滤,筛选分组后的各组数据

SQL中增加having的原因是,where关键字无法与聚合函数一起使用

语法

select column_name, 聚合函数(column_name)
from table_name
where column_name 操作符 value
group by column_name
having 聚合函数(column_name) 操作符 value

SQL聚合函数有如下:

- count 统计行数量
- sum   获取单个列的合计值
- avg   计算个列的平均值
- max   计算列的最大值
- min   计算列的最小值

SQL操作符有如下: 操作符

SQL操作符包括算术运算符、关系运算符、逻辑运算符和位运算符

实例

电商平台表 Platforms

idname
1淘宝
2天猫
3京东

订单表 Orders

idp_idcount
121
238
316
432
517

查订单量大于10的平台:

select p.name, sum(o.count)
from Platforms as p
inner join Orders as o
on p.id = o.p_id
group by p.name
having sum(o.count) > 10

group by用于分组order by用于排序

结果为 截屏2022-04-01上午9.20.28.png


两者区别:

where:

  • 搜索条件在分组操作之前应用
  • 不能跟聚合函数一起使用
  • 决定了哪些行将被查询处理
  • 可以直接使用表中的字段作为筛选条件

having:

  • 搜索条件在进行分组操作之后应用
  • 能跟聚合函数一起使用
  • 决定哪些记录将被发送到客户端
  • 必须要与group by配合使用,可以把分组计算的函数和分组字段作为筛选条件

where 可以先按照条件对数据进行筛选,然后进行数据连接,所以效率更高。having 可以在分组之后,通过使用分组中的计算函数,实现 WHERE 难以完成的数据筛选

where作用在GROUP BY子句和having子句前