2 WHERE、HAVING 子句与子查询
子查询大部份使用在提供判断条件用的资料,在“WHERE”和“HAVING”子句中,都可能出现子查询:
2.1 比较运算子
在“WHERE”和“HAVING”子句中,你会使用许多不同的运算子来判断条件是否符合。这些运算子中的比较运算子都可以搭配子查询来完成你的需求:
使用比较运算子的时候,你要提供一个资料让运算子判断条件是否符合。在使用子查询提供判断用的资料时,要特别注意子查询回传的资料是否符合规定:
以下列“查询 GNP 最大的国家”需求来说,子查询传回的数字是“country”表格中“GNP”字段的最大值,这个数字就给外层查询当作“WHERE”子句中的条件设定:
使用在比较运算子的子查询,在“SELECT”子句中不可以指定超过一个字段的回传资料:
子查询也不可以回传超过一笔以上的纪录:
2.2 “IN”运算子
除了一般的比较运算子外,你可能很常使用“IN”运算子来执行多个资料的比较,你也可以使用子查询提供“IN”运算子判断的资料:
如果你想要查询“城市人口超过九百万的国家”,“IN”运算子就会出现在这类的需求中:
这类的需求,也可以改成使用子查询来完成:
以上列的范例来说,如果你用错运算子:
“IN”运算子可以视需要搭配“NOT”运算子:
2.3 其它运算子
比较运算子与子查询搭配使用时,另外还提供“ALL”、“ANY”与“SOME”三个运算子,其中“ANY”和“SOME”运算子的效果是一样的,所以只需要讨论“ALL”与“ANY”这两个运算子:
比较运算子与“ALL”与“ANY”搭配使用时,可以完成比较特殊的查询需求,下列是两个用来测试的表格:
下列是比较运算子与“ALL”搭配使用的范例:
“ALL”运算子从字面上来看,是“全部”的意思,所以你也可以这样来看“ALL”运算子:
“ANY”运算子从字面上来看,是“任何一个”的意思,所以你也可以这样来看“ANY”运算子:
注:在 MySQL 中,“ANY”与“SOME”运算子的效果是一样的。
在你了解“ALL”运算子的效果以后,如果在解决你的需求时,使用了“ ALL”这样的运算子,它的效果其实跟“NOT IN”是一样的:
另外“= ANY”运算子的效果跟“IN”是一样的:
2.4 多字段子查询
在条件设定的时候,通常会也遇到比较复杂一点的设定,例如下列这个查询“在亚洲而且政府型式为 Republic 的国家”叙述:
上列的条件设定,有另外一种比较简单的设定方式:
如果想要查询“跟 Iraq 国家同一个地区,而且跟 Iraq 国家的政府型式一样的国家”,因为判断条件都要经由查询才可以得到,所以你可能会写出这样的叙述:
遇到类似这样的需求时,你也可以套用这种比较简单的设定方式:
如果想要查询“每一洲 GNP 最高的国家”,你可以使用下列的叙述先查询每一洲最高的 GNP:
跟单一资料的判断一样,子查询传回多比纪录时就要使用“IN”运算子:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论