子查询

    所有可能出现的子查询都需要使用“()”声明。所谓的子查询实质上就属于查询嵌套,而且从理论上来讲查询子句的任意位置上都可以随意出现子查询。但是出现子查询最多的位置: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子句中出现子查询(重点)

多表查询永恒都会存在有性能问题,而子查询主要目的是为了解决多表查询性能问题而产生的。

子查询

复杂查询

子查询