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