SQL基础总结(七):子查询

本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)

--------------------------------

不要在子查询中使用ORDER BY子句,子查询返回的中间结果是看不到的,对子查询排序没有意义。

子查询是单个SELECT 语句,不能使用UNION连接多个SELECT语句作为子查询。

子查询可以使用它自身的FROM子句或外部查询的FROM子句中表的列。

 

子查询是不使用联结将一个表与另一个表建立关联的方法。

 

在既可以使用子查询,又可以使用联结的情况下,在查询通常比联结查询要快。

 

内外连接都可以写作子查询。

在外部查询子句中包含仅出现在内部查询表的列是非法的。

 

简单子查询和相关子查询

简单子查询是指能够独立于外部查询的子查询,它在整个语句中只运行一次。

相关子查询无法独立于外部查询,它是依赖于外部查询结果的内部查询,如果语句需要针对外部查询的每一行在内部查询中处理一个表,就需要用到相关子查询。

 

简单子查询

DBMS通过执行一次内部查询来得出结果,并将结果提交到外部查询。

简单子查询先于并独立于它的外部查询执行。

 

相关子查询的特点如下:

1.与简单子查询的执行顺序和执行次数不同。

2.因为它依赖于外部查询得到的值,所以无法独立于外部查询执行。

3.它重复执行——为外部查询选择的每一候选行执行一次。

4.它总是引用外部查询FROM子句指定的表。

5.它使用限定列名来引用外部查询确定的值。

 

相关子查询基本语法如下:

SELECT outer_column

FROM outer_table

WHERE outer_column_value IN (SELECT inner_column FROM inner_table WHERE inner_column=outer_columns)

 

在包含子查询的语句中,列名隐式地限定为那个同一嵌套层次FROM子句所引用的表。

显示说明表名,就不会出错。

 

当空值出现的时候,如果不删除它们就有可能出现意外的结果。

 

使用子查询作为列表达式:SQL允许在SELECT子句中嵌入一个子查询。

用来作为列表达式的子查询必须是标量子查询。一个标量子查询返回单一值(一行一列的结果),在子查询中使用聚合函数或限制性WHERE条件,以保证该子查询只返回一行。

 

可以在FROM子句中使用子查询。

可以在UPDATEINSERTDELETE子句中使用子查询作为列表达式。

 

使用IN测试集合成员资格

子查询的SELECT子句只可以包含一个表达式或列名。

子查询必须返回一列零行或多行,子查询返回超过一列会引发错误。

WHERE | HAVING test_column [NOT] IN (subquery)

 

使用ALL比较所有子查询的值

可以用关键字ALL来确定一个值是否小于或大于子查询的所有值。

<ALL表示小于每个子查询的返回值,就是小于最小值。

>ALL表示大于每个子查询的返回值,就是大于最大值。

=ALL很少用,除非子查询返回同一个值,否则=ALL永远返回假。

子查询必须返回一列(零行或多行值),返回多于一列的值将引发错误。

如果子查询返回0行,ALL条件为真。

WHERE | HAVING test_column > ALL(subquery)

 

使用ANY比较某些子查询的值

ANY功能类似于ALL,确定是否一个值等于、大于、小于子查询的结果中的某个值。

<ANY意味着小于至少一个子查询返回值,即小于最大值。

>ANY意味着大于至少一个子查询返回值,即大于最小值。

=ANY等价于IN

如果子查询返回0行,ANY条件为假。

WHERE | HAVING test_column < ANY(subquery)

 

使用EXISTS检测存在性

EXISTSNOT EXISTS不比较值,而是在子查询结果中确定存在或不存在行。

存在性检测不比较值,而是在子查询结果中确定存在或不存在行。

子查询通常是相关子查询。

子查询可以返回任意数量的行和列。

因为EXISTS 只是简单检测满足子查询条件的行是否存在,列出具体列名是没有必要的,与行中实际值是多少也并无关系。所以可以使用SELECT *来检索所有的列。

所有INALLANY可以用EXISTSNOT EXISTS代替。

行中只包含空值的子查询算作一行。

 

WHERE | HAVING [NOT] EXISTS(subquery)

如果subquery返回一行或多行,EXISTS测试结果为真。如果subquery返回0行,EXISTS测试结果为假。NOT对结果取反。

如果子查询返回至少一行,EXISTS检测为真,NOT EXISTS检测为假。如果子查询返回零行,EXISTS检测为假,NOT EXISTS检测为真。

猜你喜欢

转载自shensy.iteye.com/blog/1486863