返回介绍

2 WHERE、HAVING 子句与子查询

发布于 2025-02-20 13:00:30 字数 6716 浏览 0 评论 0 收藏 0

子查询大部份使用在提供判断条件用的资料,在“WHERE”和“HAVING”子句中,都可能出现子查询:

mysql_10_snap_05

2.1 比较运算子

在“WHERE”和“HAVING”子句中,你会使用许多不同的运算子来判断条件是否符合。这些运算子中的比较运算子都可以搭配子查询来完成你的需求:

mysql_10_snap_06

使用比较运算子的时候,你要提供一个资料让运算子判断条件是否符合。在使用子查询提供判断用的资料时,要特别注意子查询回传的资料是否符合规定:

mysql_10_snap_07

以下列“查询 GNP 最大的国家”需求来说,子查询传回的数字是“country”表格中“GNP”字段的最大值,这个数字就给外层查询当作“WHERE”子句中的条件设定:

mysql_10_snap_08

使用在比较运算子的子查询,在“SELECT”子句中不可以指定超过一个字段的回传资料:

mysql_10_snap_09

子查询也不可以回传超过一笔以上的纪录:

mysql_10_snap_10

2.2 “IN”运算子

除了一般的比较运算子外,你可能很常使用“IN”运算子来执行多个资料的比较,你也可以使用子查询提供“IN”运算子判断的资料:

mysql_10_snap_11

如果你想要查询“城市人口超过九百万的国家”,“IN”运算子就会出现在这类的需求中:

mysql_10_snap_12

这类的需求,也可以改成使用子查询来完成:

mysql_10_snap_13

以上列的范例来说,如果你用错运算子:

mysql_10_snap_55

“IN”运算子可以视需要搭配“NOT”运算子:

mysql_10_snap_56

2.3 其它运算子

比较运算子与子查询搭配使用时,另外还提供“ALL”、“ANY”与“SOME”三个运算子,其中“ANY”和“SOME”运算子的效果是一样的,所以只需要讨论“ALL”与“ANY”这两个运算子:

mysql_10_snap_14

比较运算子与“ALL”与“ANY”搭配使用时,可以完成比较特殊的查询需求,下列是两个用来测试的表格:

mysql_10_snap_15

下列是比较运算子与“ALL”搭配使用的范例:

mysql_10_snap_16

“ALL”运算子从字面上来看,是“全部”的意思,所以你也可以这样来看“ALL”运算子:

mysql_10_snap_17

“ANY”运算子从字面上来看,是“任何一个”的意思,所以你也可以这样来看“ANY”运算子:

mysql_10_snap_18

注:在 MySQL 中,“ANY”与“SOME”运算子的效果是一样的。

在你了解“ALL”运算子的效果以后,如果在解决你的需求时,使用了“ ALL”这样的运算子,它的效果其实跟“NOT IN”是一样的:

mysql_10_snap_20

另外“= ANY”运算子的效果跟“IN”是一样的:

mysql_10_snap_19

2.4 多字段子查询

在条件设定的时候,通常会也遇到比较复杂一点的设定,例如下列这个查询“在亚洲而且政府型式为 Republic 的国家”叙述:

mysql_10_snap_21

上列的条件设定,有另外一种比较简单的设定方式:

mysql_10_snap_22

如果想要查询“跟 Iraq 国家同一个地区,而且跟 Iraq 国家的政府型式一样的国家”,因为判断条件都要经由查询才可以得到,所以你可能会写出这样的叙述:

mysql_10_snap_23

遇到类似这样的需求时,你也可以套用这种比较简单的设定方式:

mysql_10_snap_24

如果想要查询“每一洲 GNP 最高的国家”,你可以使用下列的叙述先查询每一洲最高的 GNP:

mysql_10_snap_25

跟单一资料的判断一样,子查询传回多比纪录时就要使用“IN”运算子:

mysql_10_snap_26

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文