暂无 |

2 WHERE、HAVING子句与子查询

子查询大部份使用在提供判断条件用的资料,在「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

java教程
php教程
php+mysql教程
ThinkPHP教程
MySQL
C语言
css
javascript
Django教程

发表评论

    评价:
    验证码: 点击我更换图片
    最新评论