T-SQL查询进阶:深入理解子查询

引言

SQL有着非常强大且灵活的查询方式,而多表连接操作往往也可以用子查询进行替代,本篇文章将会讲述子查询的方方面面。

简介

子查询本质上是嵌套进其他SELECT,UPDATE,INSERT,DELETE语句的一个被限制的SELECT语句,在子查询中,只有下面几个子句可以使用

SELECT子句(必须)

FROM子句(必选)

WHERE子句(可选)

GROUP BY(可选)

HAVING(可选)

ORDER BY(只有在TOP关键字被使用时才可用)

子查询也可以嵌套在其他子查询中,这个嵌套最多可达32层。子查询也叫内部查询(Inner query)或者内部选择(Inner Select),而包含子查询的查询语句也叫做外部查询(Outter)或者外部选择(Outer Select),子查询的概念可以简单用下图阐述:

上图是作为数据源使用的一个子查询.

通常来讲,子查询按照子查询所返回数据的类型,可以分为三种,分别为:

返回一张数据表(Table)

返回一列值(Column)

返回单个值(Scalar)

下面,我们按照这三种方式来阐述子查询

子查询作为数据源使用

当子查询在外部查询的FROM子句之后使用时,子查询被当作一个数据源使用,即使这时子查询只返回一个单一值(Scalar)或是一列值(Column),在这里依然可以看作一个特殊的数据源,即一个二维数据表(Table).作为数据源使用的子查询很像一个View(视图),只是这个子查询只是临时存在,并不包含在数据库中。

比如这个语句:

SELECT     P.ProductID, P.Name, P.ProductNumber, M.Name AS ProductModelName
FROM         Production.Product AS P INNERJOIN
(SELECT     Name, ProductModelID
 FROM          Production.ProductModel) AS M
ON P.ProductModelID = M.ProductModelID

上述子查询语句将ProductModel表中的子集M,作为数据源(表)和Product表进行内连接。结果如下:

作为数据源使用也是子查询最简单的应用。当然,当子查询作为数据源使用时,也分为相关子查询和无关子查询,这会在文章后面介绍到.

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索select
, 查询
, 数据库查询
, 子查询
, 可达性查询
, 语句
, 数据源
, 一个
, 子查询语句
子句
,以便于您获取更多的相关知识。

时间: 2024-08-04 14:15:17

T-SQL查询进阶:深入理解子查询的相关文章

SQL Server高级内容之子查询和表链接概述及使用_MsSql

1.子查询概念 (1)就是在查询的where子句中的判断依据是另一个查询的结果,如此就构成了一个外部的查询和一个内部的查询,这个内部的查询就是自查询. (2)自查询的分类 1)独立子查询 ->独立单值(标量)子查询(=) 复制代码 代码如下: Select testID,stuID,testBase,testBeyond,testPro from Score where stuID=( select stuID from Student where stuName='Kencery' ) ->

SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比  今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章,自己添加了一些内容,做了简单的总结,这个语句还是第一次见到,学习了.我从简单到复杂地写,希望高手们不要见笑.下面的sql语句设计到三个表,表的内容我用txt文件复制进去,这里不妨使用上一个随笔介绍的建立端到端的package的方法将这些表导入到数据库中,具体的就不说了. 从这里下载文件emplo

你真的会玩SQL吗?无处不在的子查询

你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节点的方法 你真的会玩SQL吗?让人晕头转向的三值逻辑 你真的会玩SQL吗?EXISTS和IN之间的区别 你真的会玩SQL吗?无处不在的子查询 你真的会玩SQL吗?Case也疯狂 你真的会玩SQL吗?表表达式,排名函数 你真的会玩SQL吗?简单的 数据修改 你真的会玩SQL吗?你所不知道的 数据聚合

SQL Server高级内容之子查询和表链接概述及使用

1.子查询概念 (1)就是在查询的where子句中的判断依据是另一个查询的结果,如此就构成了一个外部的查询和一个内部的查询,这个内部的查询就是自查询. (2)自查询的分类 1)独立子查询 ->独立单值(标量)子查询(=) 复制代码 代码如下: Select testID,stuID,testBase,testBeyond,testPro from Score where stuID=( select stuID from Student where stuName='Kencery' ) ->

Oracle常用sql语句(三)之子查询

子查询 子查询要解决的问题,不能一步求解 分为: - 单行子查询 - 多行子查询 语法: SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); 子查询(内查询)在住查询之前一次执行完成 子查询的记过被主查询使用(外查询) 注意: 1.括号 2.合理的书写风格 3.可以在住查询的 WHERE SELECT HAVING FROM 后面使用子查询 4.不可以在GROUP BY 后面使用 5

妙用SQL Server聚合函数和子查询迭代求和

先看看下面的表和其中的数据: t_product 图1 该表有两个字段:xh和price, 其中xh是主索引字段,现在要得到如下的查询结果: 图2 从上面的查询结果可以看出,totalprice字段值的规则是从第1条记录到当前记录的price之和.如第3条记录的totalprice字段的值是10 + 25 + 36 = 71. 现在要通过t_product表中的数据生成图2所示的查询结果.可能会有很多读者想到使用循环和游标,不过这种方式效率并不高,尤其在记录非常多的情况. 从图2的查询结果分析可

SQL疑难杂症【4 】大量数据查询的时候避免子查询

前几天发现系统变得很慢,在Profiler里面发现有的SQL执行了几十秒才返回结果,当时的SQL如下:   可以看得出来,在652行用了子查询,恰巧目标表(QS_WIP)中的记录数为100000000+,通过如下SQL可以得到: SELECT ROWS FROM SYSINDEXES WHERE ID=OBJECT_ID('QS_WIP') AND INDID <2 大量的数据导致子查询的效率非常慢,应用系统一度提示"time out",经过优化,改为如下写法,执行效率明显提升:

SQL循序渐进(21)更多的子查询

更多的子查询 我们可以使用在SELECT查询语句中再包括一个SELECT子查询语句.举个例子吧,首先我们列除所有购买贵重物品的顾客,贵重物品的标准是比所有卖出的物品价钱的平均值多100元的物品.具体语句如下: SELECT OWNERID FROM ANTIQUES WHERE PRICE > (SELECT AVG(PRICE) + 100 FROM ANTIQUES); 上面子查询语句是计算物品的平均价格再加100元,并搜索所有在ANTIQUES表中PRICE大于这个数值的OWNERID.这

hibernate 模糊查询及not in子查询

代码如下 Query query1=this.getSession().createSQLQuery(" select p.smallClassId as smallClassId,p.id as id,p.name as name,p.thumbNail as thumbNail,p.marketPrice as marketPrice,p.memberPrice as memberPrice from product p  where  p.name like ? and p.smallCl