`

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检测为真。

分享到:
评论

相关推荐

    (第二卷)Microsoft SQL Server 2008技术内幕:T-SQL语言基础

    主要包括SQL的基础理论、逻辑查询处理、SELECT查询、连接和子查询、表表达式、过滤和分组、透视转换、修改数据、事务和一致性的处理、可编程对象等内容。  书中并非系统地罗列T-SQL的各种语法元素,而是结合实践中...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    (第一卷)Microsoft.SQL.Server.2008技术内幕:T-SQL语言基础

    主要包括SQL的基础理论、逻辑查询处理、SELECT查询、连接和子查询、表表达式、过滤和分组、透视转换、修改数据、事务和一致性的处理、可编程对象等内容。  书中并非系统地罗列T-SQL的各种语法元素,而是结合实践中...

    Microsoft SQL Server 2005技术内幕:T-SQL查询

    第1章 T-SQL查询和编程基础  1.1 理论背景  1.2 SQL SERVER体系结构  1.3 创建表和定义数据完整性  1.4 总结 第2章 单表查询  2.1 SELECT语句的元素  2.2 谓词和运算符  2.3 CASE表达式  2.4 NULL...

    精通SQL 结构化查询语言详解

    第1章 数据库与SQL基础  1.1 数据库的基本概念  1.1.1 数据库的由来  1.1.2 数据库系统的概念  1.2 数据库系统的结构、组成及工作流程 1.2.1 数据库的体系结构  1.2.2 数据库系统的组成  1.2.3 数据库...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    SQL入门常见问题总结与实用技巧介绍.docx

    SQL基础技巧 规范书写: 使用缩进和空行提高语句可读性。 尽量避免不必要的子查询,采用连接JOIN操作提高效率。 注释习惯: 对复杂查询添加注释说明逻辑,便于后期维护和他人理解。 使用标准SQL注释符,如-- 单行...

    oracle11g

    第八章:复杂查询(下):子查询 第二部分:用户及数据库对象 第九章:用户访问控制 第十章:Oracle的事务和锁 第十一章:索引 第十二章:约束 第十三章:视图 第十四章:同义词 第十五章:序列 第三部分:...

    精通SQL--结构化查询语言详解

    第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    实验3答案-sql2.sql

    通过本实验使学生掌握多表查询、子查询以及基本数据操作 二、实验内容 使用实验一建立的银行贷款数据库和表,完成以下查询。 1-4是多表查询和子查询,5-11是数据操作 查询经济性质为“国营”的法人在上海的银行...

    MyBatis基本使用总结

    MyBatis基本使用总结 Mybatis 的核心配置文件于实体类的映射文件,mapper 代理动态代理的调用方法。

    SQL Server 2008数据库设计与实现

     10.2 查询优化的基础知识  10.3 操作系统与硬件因素  10.4 事务  10.4.1 事务语法  10.4.2 已编译的SQL Server代码  10.5 SQL Server并发控制  10.5.1 锁  10.5.2 隔离级别  10.6 完整性与并发性...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY...

    MYSQL常用命令大全

    mysqldump -u wcnc -p smgp_apps_wcnc &gt; wcnc.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名&gt; 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc users&gt; wcnc_users.sql 3.导出一个数据库结构 mysqldump ...

    sqlserver2000基础(高手也有用)

    15.1.3 测试连接到SQL Server实例的方法总结 458 15.1.4 超时 459 15.1.5 单用户的问题 460 15.1.6 默认数据库问题 461 15.2 索引中的疑难解答 462 15.2.1 索引对查询条件的影响 462 15.2.2 索引对查询...

    java从入门到精通70个PPT

    javaPPT 从入门到精通 从基础到框架 70个PPT 1.初识java 2.变量、数据类型和运算符和表达式 3运算符和程序流程结构 4.数组 5.类和对象 6.字符串 7.封装,继承,多肽 8.接口与抽象类 9.java集合类 10.jdbc 11 html...

    MySQL命令大全

    mysqldump -u wcnc -p smgp_apps_wcnc &gt; wcnc.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名&gt; 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc users&gt; wcnc_users.sql 3.导出一个数据库结构 ...

Global site tag (gtag.js) - Google Analytics