本系列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子句中使用子查询。
可以在UPDATE、INSERT、DELETE子句中使用子查询作为列表达式。
使用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检测存在性
EXISTS和NOT EXISTS不比较值,而是在子查询结果中确定存在或不存在行。
存在性检测不比较值,而是在子查询结果中确定存在或不存在行。
子查询通常是相关子查询。
子查询可以返回任意数量的行和列。
因为EXISTS 只是简单检测满足子查询条件的行是否存在,列出具体列名是没有必要的,与行中实际值是多少也并无关系。所以可以使用SELECT *来检索所有的列。
所有IN、ALL、ANY可以用EXISTS或NOT EXISTS代替。
行中只包含空值的子查询算作一行。
WHERE | HAVING [NOT] EXISTS(subquery)
如果subquery返回一行或多行,EXISTS测试结果为真。如果subquery返回0行,EXISTS测试结果为假。NOT对结果取反。
如果子查询返回至少一行,EXISTS检测为真,NOT EXISTS检测为假。如果子查询返回零行,EXISTS检测为假,NOT EXISTS检测为真。
标签:总结,返回,EXISTS,外部,SQL,查询,column,子句 From: https://blog.51cto.com/u_6978506/7469725