【数据库面试题01】WHERE、HAVING以及ON的区别

在数据库中对数据库进行过滤的子句有WHERE、HAVING以及ON,他们的区别如下:

WHERE、HAVING的区别

  • WHERE子句在GROUP BY分组和数据汇总之前对数据进行过滤字段、原始数据的过滤使用WHERE
  • HAVING子句在GROUP BY分组和数据汇总之后对数据进行过滤分组之后的统计数据的过滤使用HAVING

如下,由于WHERE子句是针对分组之前的数据进行过滤,在分组之前使用聚合函数count(*) 进行过滤的话是会有语法错误。

SELECT dept_id,count(*)
FROM employee e
WHERE count(*)>5
GROUP BY dept_id;

修改方法是将过滤条件count(*)>5 放到HAVING子句中去

SELECT dept_id,count(*) 
FROM employee e 
GROUP BY dept_id
HAVING count(*)>5 

同样的,由于HAVING子句是针对分组之后的数据进行过滤,因此如果进行如下查询因为分组之后的数据不存在salary字段,所以也同样会报语法错误:

SELECT dept_id,count(*) 
FROM employee e 
GROUP BY dept_id 
WHERE salary > 10000

修改方法是将WHERE salary > 10000 放到GROUP BY dept_id 之前去

SELECT dept_id,count(*) 
FROM employee e 
WHERE salary > 10000
GROUP BY dept_id 

当然WHERE和HAVING也可以结合使用,如果需要查询月薪超过一万的人数大于1的部门的话,可以使用如下SQL:

 

SELECT dept_id,count(*) 
FROM employee e 
WHERE salary > 10000 
GROUP BY dept_id 
HAVING count(*)>1

 

 

WHERE和ON的区别

在连接查询中,WHERE和ON的主要区别在于:

  • 对于内连接查询,WHERE子句和ON子句等效
  • 对于外连接查询,ON子句在连接操作之前执行,WHERE子句(逻辑上)在连接操作之后执行

以下两段SQL得到的执行结果是一致的:

WHERE子句:

SELECT *
FROM department d, employee e
WHERE d.dept_id = e.dept_id
AND d.dept_name = '财务部';

ON子句需要配合JOIN来使用:

SELECT *
FROM department d
JOIN employee e
ON (d.dept_id = e.dept_id AND d.dept_name = '财务部');

当然也可以WHERE和ON结合在一起使用,得到的结果也是一样的:

SELECT *
FROM department d
JOIN employee e
ON (d.dept_id = e.dept_id) 
WHERE d.dept_name = '财务部';

但是如果把内连接换成外连接,就将会得到不同的结果

 

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/interview/interview-db/1944/where_having_on/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录