子查询:要加()
子查询可以出现在以下字句中:
1)from字句
2)where字句
3)having字句:当查询条件中有分组查询
分类:
1)嵌套子查询:
1-1)单行子查询:结果是单行单列
1-2)多行子查询:结果是多行单列
1-3)多列子查询:结果是多行多列
2)相关子查询:
单行子查询:单行单列
运算符: = <> > >= < <=
多行子查询:多行单列
运算符: in any all
1)in:判断是否与子查询的任意一个返回值相等
2)any:任意的
2-1)<any:小于最大值
2-2)>any:大于最小值
2-3)=any:与in相同
3)all:所有的
3-1)<all:小于最小值
3-2)>all:大于最大值
3-3)=all:无意义
多列子查询:多行多列(不常用) 一般与in运算符一起使用
子查询中的空值null:
子查询结果集中有null值,不能使用not in运算符,因为所有的条件和空值比较结果都是空值;如果需要使用,则进行空值处理
from字句:子查询在from字句中,相当于该子查询是一张表
所有的多列子查询都可以用from字句完成
相关子查询:主查询执行一行,子查询执行一次 //for循环??
条件:子查询引用了父查询中的一列
EXISTS和NOT EXISTS操作符:
相关子查询还可使用EXISTS和NOT EXISTS操作符来进行操作
EXISTS判断是否"存在",具体操作如下:
1)子查询中如果有记录找到,子查询语句不会继续执行,返回值为TRUE;
2)子查询中如果到表的末尾也没有记录找到,返回值为FALSE
3)EXISTS子查询并没有确切记录返回,只判断是否有记录存在,而且只要找到相关记录,子查询就不需要再执行,然后再进行下面的操作.这样大大提高了语句的执行效率.
4)NOT EXISTS正好相反,判断子查询是否没有返回值.如果没
有返回值,表达式为真,如果找到一条返回值,则为假.
PS:
1)在相关子查询中,当父查询的列在子查询中使用时,一定要进行特别的标注(父表名.父查询的列),不能直接使用父查询的列名,查询结果是错误的.
2)因为EXISTS子句中,并没有确切记录返回,只返回真或假.所以select后面只需写'1'占位用即可,无实际意义
3) NOT EXISTS操作符因为运算方法与NOT IN不同,只会返回TRUE或FALSE,不会返回空值,所以不需要考虑子查询去除空值的问题