所有可能出现的子查询都需要使用“()”声明。所谓的子查询实质上就属于查询嵌套,而且从理论上来讲查询子句的任意位置上都可以随意出现子查询。但是出现子查询最多的位置:WHERE、FROM
1、WHERE子句使用子查询:
范例:
子查询返回多行单列(重点)
如果说子查询返回了多行单列的数据,那么实质上就相当于告诉用户一个数据的操作范围。而如果要想进行范围的判断,在WHERE子句里面提供有主要的三个运算符:IN、ANY、ALL。
①IN操作
IN操作指的是内容可以在指定的范围之中存在
还可以使用NOT IN操作
上面的操作一定要保证子查询里面没有null
②ANY操作
对于ANY操作实质上有三种子语法:
(1)=ANY:功能上与IN是完全没有任何区别的
(2)>ANY:比子查询返回的最小的内容要大
(3)<ANY:比子查询返回的最大的内容要小
③ALL操作
ALL操作有两种使用形式:
(1)>ALL:比子查询返回最大的值要大
(2)<ALL:比子查询返回最小的值要小
exists()判断:如果现在子查询有数据返回(不管什么数据),就表示条件满足,那么就可以显示出数据,否则不显示。
使用exists()只关心子查询里面返回的是否有行,至于什么行它不关心。
对于IN主要是对于数据的判断,exists()是针对于是否存在于数据行进行判断。很明显exists()要比IN的性能更高,因为不关心具体的数据。
2、实际上select子句里面出现的子查询核心目的在于:行列转换。
3、在FROM子句中出现子查询(重点)
多表查询永恒都会存在有性能问题,而子查询主要目的是为了解决多表查询性能问题而产生的。
复杂查询