Sql Server系列:子查询
1 子查询概念
子查询是嵌套在另一个查询中的普通T-SQL查询。在有一个SELECT语句通过使用小括号创建子查询,作为另一个查询的部分数据或条件的基础。
子查询通常用于满足以下某个需求:
◊ 将一个查询分解为一系列的逻辑步骤
◊ 提供一个列表作为WHERE子句或[IN | EXISTS | ANY |ALL]的目标
◊ 为父查询中的每个记录提供一个查询表
还值得注意的是,大部分(不是全部)子查询可以使用连接来编写。
2 构建嵌套子查询
嵌套子查询只在一个方向嵌套:返回在外部查询中使用的单个值,或者与IN运算符一起使用的一个完整的值列表。
子查询的查询语法类似以下两个语法模板之一:
SELECT <SELECT list>
FROM <SomeTable>
WHERE <SomeColumn> = (
SELECT <single column>
FROM <SomeTable>
WHERE <condition that results in only row returned>
)
SELECT <SELECT list>
FROM <SomeTable>
WHERE <SomeColumn> IN (
SELECT <single column>
FROM <SomeTable>
WHERE <condition>
)
2.1 使用返回单个值的SELECT语句的嵌套查询
查询UnitPrice大于等于10的CategoryName
SELECT DISTINCT [CategoryName]
FROM [dbo].[Category] c
INNER JOIN [dbo].[Product] p
ON c.[CategoryID] = p.[CategoryID]
WHERE p.[UnitPrice] >= 10
查询UnitPrice最小的记录
SELECT p.[ProductID], p.[ProductCode], p.[ProductName], c.[CategoryName], p.[UnitPrice]
FROM [dbo].[Category] c
INNER JOIN [dbo].[Product] p
ON c.[CategoryID] = p.[CategoryID]
WHERE p.[UnitPrice] = (
SELECT MIN([UnitPrice]) FROM [dbo].[Product]
)
2.2 使用返回多个值的子查询的嵌套查询
SELECT [dbo].[Product].* FROM [dbo].[Product]
WHERE [CategoryID] IN (
SELECT [CategoryID] FROM [dbo].[Category] WHERE [CategoryID] <= 10
)
尽管使用IN的嵌套查询方式可以实现,但更好的方式是使用内连接实现这种查询,而不是使用使用嵌套的SELECT。
上例的子查询使用INNER JOIN方式:
SELECT [dbo].[Product].* FROM [dbo].[Product]
INNER JOIN [dbo].[Category]
ON [dbo].[Product].[CategoryID] = [dbo].[Category].[CategoryID]
WHERE [dbo].[Category].[CategoryID] <= 10
出于性能方面的考虑,如果没有特别的理由要使用嵌套的SELECT,则还是应使用连接方式作为默认的解决方案。在大部分情况下,SQL Server会将嵌套子查询解决方案解析为和使用连接用于的查询计划,在检查嵌套子查询和内连接查询计划时,会发现它们的完全相同的计划。大多数情况下,这两种方法没有多大的区别。当查询计划不同时,连接通常的更好的选择。
3 关联子查询
关联子查询与嵌套子查询的不同之处在于信息传递是双向的,而不是单向的。在嵌套子查询中,内部查询只处理一次,然后将信息传递到外部查询,而外部查询也只执行一次。
在关联子查询中,内部查询用外部查询提供的信息运行,外部查询使用内部查询的信息运行。
关联查询分3个步骤进行的处理过程:
◊ 外部查询获得一个记录,将记录传递到内部查询;
◊ 内部查询根据传递的值执行;
◊ 内部查询将结果值返回外部查询,外部查询再利用这些值完成处理过程。
3.1 在WHERE子句中的关联子查询
示例:查询在Product中每个CategoryID中UnitPrice最贵的Product记录
实现方式一:使用两个单独的查询,先创建一个临时表,再进行连接。
-- 查询每个CategoryID中UnitPrice最大的记录
SELECT [CategoryID], MAX([UnitPrice]) AS [UnitPrice]
INTO #MaxUnitPriceProduct
FROM [dbo].[Product]
GROUP BY [CategoryID] -- SELECT * FROM #MaxUnitPriceProduct
-- 查询每个CategoryID中UnitPrice最大的Product记录
SELECT p.[ProductID], p.[CategoryID], p.[ProductCode], p.[ProductName], p.[UnitPrice]
FROM [dbo].[Product] p
INNER JOIN #MaxUnitPriceProduct t
ON p.[CategoryID] = t.[CategoryID]
AND p.[UnitPrice] = t.[UnitPrice] DROP TABLE #MaxUnitPriceProduct
实现方式二:使用关联子查询
SELECT p1.[ProductID], p1.[CategoryID], p1.[ProductCode], p1.[ProductName], p1.[UnitPrice]
FROM [dbo].[Product] p1
WHERE P1.[UnitPrice] = (
SELECT MAX(p2.[UnitPrice]) FROM [dbo].[Product] p2
WHERE p2.[CategoryID] = p1.[CategoryID]
)
3.2 在SELECT列表中的关联子查询
SELECT p1.[ProductName], (
SELECT MAX([UnitPrice]) FROM [dbo].[Product] P2
WHERE P2.[CategoryID] = p1.[CategoryID]
) AS [UnitPrice]
FROM [dbo].[Product] P1
5 派生表
派生表是有一个查询结果集的行和列构成,要创建派生表,需要做以下两件事情:
◊ 将生成结果集的查询用小括号括起来
◊ 给查询结果取别名,这样可以作为表被引用
语法结构
SELECT <select list>
FROM (<query that returns a regular resultset>) AS <alias name>
JOIN <some other base or derived table>
示例
SELECT p.[ProductID],p.[ProductCode],p.[ProductName],p.[UnitPrice],t.[CategoryName]
FROM [dbo].[Product] p
INNER JOIN (
SELECT [CategoryID],[CategoryName] FROM [dbo].[Category]
WHERE [CategoryID] <= 10
) t
ON p.[CategoryID] = t.[CategoryID]
Sql Server系列:子查询的更多相关文章
- SQL Server 数据库子查询基本语法
一.SQL子查询语句 1.单行子查询 select ename,deptno,sal from emp where deptno=(select deptno ...
- Sql Server系列:查询分页语句
1 利用临时表分页 分页存储过程: CREATE PROCEDURE [USP_Product_GetPaged] ), ), @PageIndex INT, @PageSize INT AS BEG ...
- SQL Server 之 子查询与嵌套查询
当由where子句指定的搜索条件指向另一张表时,就需要使用子查询或嵌套查询. 1 子查询 子查询是一个嵌套在select.insert.update或delete语句或其他子查询中的查询.任何允许使用 ...
- SQL优化系列——子查询
sql调优方法: (1)not in子查询优化 尽量避免子查询select * from a where id not in(select id from b); select * from a wh ...
- SQL Server Form子查询、链接查询
所用数据表:用户,钱包,订单 一.from子查询 --查询钱包里金额大于30000 and User_ID = Users.ID) ) 二.链接查询 内连接(inner join)外连接(left/r ...
- 【转】SQL Server T-SQL高级查询
SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; //查询student ...
- SQL Server 系列文章快速导航(SWF版)
一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...
- SQL SERVER中XML查询:FOR XML指定PATH
SQL SERVER中XML查询:FOR XML指定PATH 前言 在SQL SERVER中,XML查询能够指定RAW,AUTO,EXPLICIT,PATH.本文用一些实例介绍SQL SERVER中指 ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- SQL Server数据库————连接查询和分组查询
SQL Server数据库————连接查询和分组查询 分组查询 select 列from <表名> where …… group by 列 注意:跟order by一样group ...
随机推荐
- 前端CSS规范整理_转载、、、
一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用U ...
- CentOS 6.5 Python Image Library 配置
转自:http://www.cnblogs.com/way_testlife/archive/2011/04/17/2019013.html PIL 下载: http://www.pythonware ...
- web优化 js性能高级篇
今天我们继续上一个阶段关于web的性能优化,如何对js高级进行优化 (1)闭包 何为闭包; 一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 我认 ...
- Errors occurred during the build. Errors running builder 'JavaScript Validator' on project
1.问题:Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 2.解决 ...
- Web前端面试之HTML
1. 对WEB标准以及W3C的理解与认识 web标准规范要求,书写标签闭合.小写.不乱嵌套,可提高搜索机器人对网页内容的搜索几率.--- SEO 使用外链css和js脚本,结构与行为.结构与表现分离, ...
- Smart3D系列教程7之 《手动配置S3C索引加载全部的瓦片数据》
一.前言 迄今为止,Wish3D已经出品推出了6篇系列教程,从倾斜摄影的原理方法.采集照片的技巧.Smart3D各模块的功能应用.小物件的照片重建.大区域的地形重建到DSM及正射影像的处理生产,立足于 ...
- pythonchallenge 解谜 Level 1
得到第一关地址后可以进行第一关的解析了. 看起来好神秘的样子.但是也就是把字母 k 变成 m , o 变成 q ,e 变成 g.将字母对应的ASCII的值+2就行了. #-*- coding:utf- ...
- TCP三次握手四次挥手
看到一篇总结很好的TCP三次握手,学习一下,原文链接. 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,S ...
- jqueryui 进度条使用
<title></title> <script src="../Js/NewJs_CFJ/jquery.js" type="text/jav ...
- final关键字(final是最终的)
final关键字(final是最终的) 1.final修饰特点 a.修饰类,类不能被继承 b.修饰变量,变量就变成了常量, 修饰基本数据类:final int num = 10; 修饰引用数据类型变量 ...