首页 > 数据库 >SQL基础总结(七):子查询

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

时间:2023-09-14 14:04:21浏览次数:46  
标签:总结 返回 EXISTS 外部 SQL 查询 column 子句


本系列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

相关文章

  • SQL基础总结(五):汇总和分组数据
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)-------------------------只对单个值进行操作的是标量函数。对一组值进行操作以产生一个汇总值的是SQL聚合函数或集合函数。可以对行的集合进行......
  • SQL基础总结(十一):视图
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------除了ORDERBY子句通常是被禁止的,几乎所有有效的SELECT语句都可以定义视图。可以嵌套视图,视图的SELECT语句......
  • SQL基础总结(九):插入更新删除行及创建更新删除表
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------插入更新删除行 使用INSERT插入行INSERTINTOtableVALUES(value1,value2,value3…);INSERTINTOtable(col......
  • SQL基础总结(八):集合操作
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------使用UNION合并行UNION操作将两个查询返回的结果合并成一个结果。UNION从结果中去掉重复的行,UNIONALL不去掉重......
  • SQL基础总结(十):索引
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------对于以下列创建索引是恰当的,这些列经常被:查询、排序、分组、联结、用来计算顺序统计(MIN、MAX或中值)。对于......
  • MySQL篇:bug2_ Navicate无法添加或更新子行-外键约束失败
    问题产生原因Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。解决办法解决方法是在Mysql中取消外键约束:SETFOREIGN_KEY_CHECKS=0;再添加值,然后再设置外键约束:SETFOREIGN_KEY_CHECKS=1;查看当前FOREIGN_KEY_CHECKS的值可用如下命令:SELECT@@FOR......
  • 7 项目总结
    Webserver项目webserver项目总结1项目介绍使用多线程模型,利用信号量实现线程间加锁;利用I0复用技术Epoll与线程池实现多线程的Reactor高并发模型;利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销;利用正则与状态机解析HTTP请求报文实现处理静态资源的请求;基......
  • 2023.9.14-每日总结
    今天,我完成了软件需求与分析课堂测试02–业务需求。软件需求与分析课堂测试02–业务需求  ----------------------------------------------------------------------根据下列描述,说明新的直接销售和财务处理系统的业务需求有哪些?EspeciallyforYouJewelers是大学......
  • N天爆肝数据库——MySQL(2)
    (N天爆肝数据库——MySQL(2))链接:link这是csdn专栏链接,大家可以看一看,提提意见本篇文章,主要对DMLDQL进行知识总结和学习。期待和大家一起学习进步。DML-介绍DML(数据库操作语言),用来对数据库中表的数据记录进行增删改操作。添加数据(INSERT)修改数据(UPDATE)删除数据(DELET......
  • Citrix SQL数据库查询和替换修改字段
    1如下图,右键指定库新建查询即可2粘贴底部代码后,如下,点击执行查询即可--查看Citrix站点数据库如下表内容字段select*fromchb_config.Controllers;select*fromADIdentitySchema.Services;select*fromHostingUnitServiceSchema.Services;select*fromAppLibrarySchem......