面试官:说说WHERE,HAVING和ON的区别?

简介: 最近有小伙伴私信我:今天面试有道题把我一下子问懵了,让我说出WHERE,HAVING和ON的区别。觉得这个问题很有价值给小伙伴们分享一下。

这三个关键字我们平时经常使用,他们一个共同点是:都可以用来过滤数据。

那不同点是什么呢?我们先来看看WHERE和HAVING的区别


WHERE和HAVING

在搞清楚WHERE和HAVING的区别之前,我们需要知道老生常谈的SQL执行顺序:

(8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
(
1)FROM [left_table]
(
3)<join_type> JOIN <right_table>
(
2)        ON <join_condition>
(
4)WHERE <where_condition>
(
5)GROUP BY <group_by_list>
(
6)WITH <CUBE | RollUP>
(
7)HAVING <having_condition>
(
10)ORDER BY <order_by_list>

上面的序号代表SQL在运行时,数据库底层的先后顺序,我们可以看到:
WHERE是在GROUP BY之前执行的,所以WHERE的后面是不能使用聚合函数来进行数据过滤的,只能使用FROM表里的字段来进行数据过滤;

HAVING是在GROUP BY之后执行的,那么这些数据就都已经分过组了的,可以使用聚合函数来进行数据的分组过滤。

我们举例说明一下有如下一张示例表Customers:

20.jpg

查询人数不小于2的省份和人数我们先用WHERE来试验

SELECT 省份,COUNT(*) 人数
FROM Customers
WHERE COUNT(*)>1
GROUP BY 省份


会报如下错误:

21.jpg


错误提示里非常明确的告诉我们:聚合函数不应出现在WHERE子句中!我们再使用HAVING来求解


SELECT 省份,COUNT(*) 人数
FROM Customers
GROUP BY 省份
HAVING COUNT(*)>1

结果如下:

22.jpg

可以得到我们想要的结果。上面就是WHERE和HAVING的主要区别了,此外WHERE和HAVING在性能上也有所区别,但这通常不是主要的,我们就不深入讲解了。说完WHERE和HAVING,我们再来看看WHERE和ON的区别


WHERE和ON


功能区别

我们知道ON支持左连接和右连接,WHERE是不支持的,WHERE里面只支持内连接,这在功能上是一个较大的区别。当然Oracle的 WHERE可以通过(+)来实现左右连接,这个我们就不讨论了。


性能区别

我们知道所有的查询都回产生一个中间临时报表,查询结果就是从返回临时报表中得到。ON和WHERE后面所跟限制条件的区别,主要与限制条件起作用的时机有关,ON根据限制条件对数据库记录进行过滤,然后生产临时表;而WHERE是在临时表生产之后,根据限制条件从临时表中筛选结果。


因为ON限制条件发生时间较早,临时表的数据集要小,因此ON的性能要优于WHERE。但这通常是在数据量比较大的时候才比较明显,如果数据量都比较小,这两个在使用上没有太大区别。



相关文章
|
1月前
|
消息中间件 负载均衡 Kafka
【Kafka面试演练】那Kafka消费者手动提交、自动提交有什么区别?
嗯嗯Ok。分区的作用主要就是为了提高Kafka处理消息吞吐量。每一个topic会被分为多个分区。假如同一个topic下有n个分区、n个消费者,这样的话每个分区就会发送消息给对应的一个消费者,这样n个消费者负载均衡地处理消息。同时生产者会发送消息给不同分区,每个分区分给不同的brocker处理,让集群平坦压力,这样大大提高了Kafka的吞吐量。面试官思考中…
61 4
|
2月前
|
存储 安全 关系型数据库
|
29天前
|
编译器 C++ Python
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
32 1
|
2月前
|
存储 SQL 数据库
面试题20: 存储过程和函数的区别
面试题20: 存储过程和函数的区别
|
3月前
|
Java
【面试问题】Synchronized 和 ReentrantLock 区别?
【1月更文挑战第27天】【面试问题】Synchronized 和 ReentrantLock 区别?
|
3月前
|
Java 编译器 API
【面试问题】JDK 和 JRE 的区别?
【1月更文挑战第27天】【面试问题】JDK 和 JRE 的区别?
|
3月前
|
存储 JavaScript
面试官:请你说一说vuex的五个属性,分别是什么,区别和用途说一下(三)
面试官:请你说一说vuex的五个属性,分别是什么,区别和用途说一下
|
3月前
|
前端开发 JavaScript
面试官:请你说一说vuex的五个属性,分别是什么,区别和用途说一下(二)
面试官:请你说一说vuex的五个属性,分别是什么,区别和用途说一下
|
3月前
|
存储 JavaScript 容器
面试官:请你说一说vuex的五个属性,分别是什么,区别和用途说一下(一)
面试官:请你说一说vuex的五个属性,分别是什么,区别和用途说一下
面试官:请你说一说vuex的五个属性,分别是什么,区别和用途说一下(一)
|
11天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
33 0