一、子查询:select 语句可以嵌套在其它语句中的,比如select、insert、update和delete。这些被嵌套的select语句被称为子查询,可以这么说当一个查询依赖于另外一个查询结果时就可以使用子查询。子查询有2中类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数; 另外一种是
返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的数据表。
1、单子字查询:子查询的返回值必须只有一行记录,而且只能有一行列,这样的子查询称为标量子查询。标量子查询可以在select语句的列表中、表达式中、where语句中等很多场合。
2、列值子查询:于标量子查询不同的是,列值值查询返回的结果集是一个多行多列的值查询。这样的子查询又被称为表子查询,表子查询可以看作一个临时的表,表值查询可以用在select语句的from字句中、insert中、连接、in字句等很多场合。
3、集合运算符与子查询:标量子查询对子查询的要求非常高, 而很多情况下查询结果并不能做为标量子查询。 如果子查询是多行多列的表子查询, 那么可以将其看成一个临时的数据表使用, 而如果子查询是多行单列的表子查询,这样的子查询的结果集其实是一个集合,SQL 提供了对这样的集合进行操的运算符,包括 IN、ANY、ALL 以及 EXISTS 等。
(1)、 IN 运算符
(2)、ANY 和 SOME 运算符:ANY 和 SOME 是同义词,所以下面介绍的时候只使用 ANY, SOME 的用法和功能和 ANY 一模一样。和 IN 运算符不同,ANY 必须和其他的比较运算符共同使用,而且必须将比较运算符放在 ANY 关键字之前,所比较的值需要匹配子查询中的任意一个值,这也就是 ANY 在英文中所表示的意义。
(3)、ALL 运算符:ALL 在英文中的意思是 “所有” , ALL 运算符要求比较的值需要匹配子查询中的所有值。ALL 运算符同样不能单独使用,必须和比较运算符共同使用。
(4)、EXISTS 运算符:和 IN、ANY、ALL 等运算符不同,EXISTS 运算符是单目运算符,它不与列匹配,因此它也不要求待匹配的集合是单列的。EXISTS 运算符用来检查每一行是否匹配子查询,可以认为 EXISTS 就是用来测试子查询的结果是否为空,如果结果集为空则匹配结果为 false,否则匹配结果为 true。