SQL查询是数据库人用凌波微步都逃不过的坎。
无独有偶,就在几天前,边肖的一位朋友在面试时遇到了一个SQL查询问题。"请解释一下SQL中where和having的区别,最好能举例说明。"他支吾道,“quot选择having一般是在不能用where的时候。"其实除了where和are,where和on也是面试官经常喜欢问的问题。
那么这三者有什么区别呢?借此机会,边肖学习并整理了一些材料,与大家分享。
放大镜在灰色背景上显示sql单词。
下面的例子说明了这一点:
食物表,表字段名称(name),价格(price),类别(category)和数量(quantity)。
1.where和having都可以用的场景
比如查询价格大于50的食物和价格。
说明: having是从以前筛选的字段中重新筛选出来的,而where是直接从数据表中的字段中筛选出来的。selectprice已经过筛选,所以此时where和Having的效果是一样的。
2.只可以用having,不可以用where情况
比如查询每个食品类别的均价,得到均价在200以上的食品。
说明:你只能在这里使用having,因为跟在where后面的必须是表中的一个字段。改成avg(价格)也不对,having这个时候有优势。它根据前一个查询的内容进行筛选,而不管表中是否有该字段。
3.只可以用where,不可以用having的情况
比如查询价格大于100的食物和数量。
说明:这里不能用having的原因是having是根据上一篇文章的查询结果筛选出来的,上一篇文章没有告诉它价格是多少,所以报错了。
"哪里& quot是在生成临时表后对其进行过滤。"在& quot是生成临时表时使用的条件。无论on中的条件是否为真,它都将返回左侧表中的记录。两条查询语句:
1.select * formaleftjoinbon(a . id=b . id)其中b.name=' aa' 2和select * formaleftjoinbon(a . id=b . id andb . name=' aa ')第一条的实现过程如下:
第二条的实施过程如下:
从上面的例子可以看出,无论on上的条件是否为真,on子句都将返回左表或右表中的记录;Where子句是生成临时表后过滤临时表的一个条件,此时没有leftjoin的意义(必须返回左表中的记录),所以所有条件不为真的都被过滤掉。
关于三者的查询速度,由于on在进行统计前过滤掉了不符合条件的记录,可以减少中间操作要处理的数据,所以按理说速度应该是最快的。