总结和区分where和having用法和区别, 从熟练到掌握
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
| id | name |
|---|---|
| 1 | 淘宝 |
| 2 | 天猫 |
| 3 | 京东 |
订单表 Orders
| id | p_id | count |
|---|---|---|
| 1 | 2 | 1 |
| 2 | 3 | 8 |
| 3 | 1 | 6 |
| 4 | 3 | 2 |
| 5 | 1 | 7 |
查订单量大于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用于排序
结果为
两者区别:
where:
- 搜索条件在分组操作之前应用
- 不能跟聚合函数一起使用
- 决定了哪些行将被查询处理
- 可以直接使用表中的字段作为筛选条件
having:
- 搜索条件在进行分组操作之后应用
- 能跟聚合函数一起使用
- 决定哪些记录将被发送到客户端
- 必须要与group by配合使用,可以把分组计算的函数和分组字段作为筛选条件
where 可以先按照条件对数据进行筛选,然后进行数据连接,所以效率更高。having 可以在分组之后,通过使用分组中的计算函数,实现 WHERE 难以完成的数据筛选
where作用在GROUP BY子句和having子句前