赞
踩
首先,有很多问题无法通过一次性查询就能将结果查询出来
例如:要查询代课天数最多的老师信息
我们的查询步骤是:
- 先找出代课天数最多的天数,
- 然后将这个天数保作为一个变量保存起来,
- 再来一个查询老师信息的语句,并将保存起来的天数作为查询条件。
这就是子查询存在的意义。也就是说一个查询问题中包含两个查询语句。
子查询可以分为两大类:
首先先看子查询的返回形式:
子查询返回形式有:单一值(标量),一列,多列(行),多行多列(表)。
按出现的位置可分为:where型,where后;from型,from后;exists型。
列子查询和标量子查询的步骤几乎相同,不同点是列子查询返回的不是一个值,而是一列(注意,就是一列,即多个行的一列值)也叫做一个集合。然后再从这个集合中查找信息。
这里面牵涉一个问题,既然列子查询返回的不是一个值,而是一个集合,那么就要用到集合的运算符。常用的集合运算符有:
in ,not in ,some ,not some ,any ,all,!=all,
- in :表示在集合中。
- not in :表示不在集合中。且等同于!=all.(不属于集合中的任何内容)。
- some 等同于in
- any :集合中的任何一个。
- != any :表示只要与集合中的任何一个不相等即可。
- all :集合中的所有元素。
- !=all: 表示不属于集合中的任何内容。
总结:any 、some和all与in的区别就是前者可以使用除 =,!=,之外的运算符,而in只有in,和not in 。
行子查询意思是:返回一行,所谓行,至少有两列组合在一起,并且只有一行,如果超过了两行就是表。因此还需有个关键词限制。即:limit 1;
此外返回了一行,需要接收,需要判断。那么就需要一个括弧,这个括弧包含返回行里的字段。然后用运算符判断。作为条件语句。
即:
阴影处的括弧,就是子查询中返回的行。
表子查询是用在from子句内,from子句内要求使用一个表,而能是一个结果。可以给这个查询结果起名,别名。用as语法。例如:
利用as temp,让子查询得到的表称作temp表。然后外部查询在通过这个新生成的表查询所要的值。注意:外部查询所用的列明是子查询指定的。例如:子查询将t_name改为teacher。外部查询要查询t_name就要不能写这个,而应该写teacher。因为外部查询的对象是子查询得到的新表。
Exists(subquery)判断依据:如果子查询可以返回数据,则认为exists表达式返回真。否则,返回假。
由上图可见,Exists子查询可以通过其他查询代替。两种方法的结果相同,但是两者的解决思路是不同的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。