Sqlserver 理解子查询
理解子查询:
理解子查询:
多表连接查询往往也可以用子查询进行替代
子查询本质是嵌套进其他 select update insert Delete 语句的一个被限制的select语句,在子查询中,只有下面几个子句可以使用:
1 select 子句(必须)
2 From 子句(必须)
3 where 子句(可选)
4 group by(可选)
5 having(可选)
6 order by(只有在top关键字使用时才可用)
子查询也可以嵌套在其他子查询中,
子查询的返回:
1 返回一张表
2 返回一列值
3 返回单个值
一 子查询作为数据源使用(子查询的最简单的使用):
当子查看在外部查询的from子句之后使用时,子查询被当作一个数据源使用,即使这个子查询只返回一个值,一列值,一张表,这里都看做是数据源,
作为数据源使用的子查询很像一个 View(视图),只是这个子查询只是临时存在,并不包含在数据库中
select a.username from a
inner join (select * from b ) as c
on a.id = c.id
当子查询作为数据源使用时候,也分为相关子查询和无关子查询
二 :子查询作为选择条件使用(比较复杂的应用)
作为选择条件的子查询是那些只返回一列(column)的子查询,如果作为选择条件使用,即使返回单个值,也可以看做是只有一行的一列
SELECT *
FROM a
WHERE ID IN
(SELECT ID
FROM b
WHERE age >68)
上面是 在in或者 not in 关键字后面的子查询返回一列值作为外部查询的选择条件使用,不过不太建议用这兄弟俩,比较耗性能,当然如果 in后的返回是固定的值,可以随便用
如果需要实现in的作用,可以用 exists ,not exists ,join 关键字进行代替,,除了in之外,用于选择条件的关键字还有 any和all,和 < ,>,= 连接使用
例如:
SELECT c.Nickname,c.Id FROM Customer AS c
WHERE c.Id = any(SELECT a.CustomerId FROM ForumTopicCustomerXREF AS a ) SELECT c.Nickname,c.Id FROM Customer AS c
WHERE c.Id IN (SELECT a.CustomerId FROM ForumTopicCustomerXREF AS a )
上面使用的any就完全可以替换 in
=ANY 和IN等价
<>ALL 和NOT IN等价
>ANY 大于最小的(>MIN)
<ANY 小于最大的(<MAX)
>ALL 大于最大的(>MAX)
<ALL 小于最小的(<MIN)
=ALL 这个效果在子查询中如果只有一个返回值,则和=相等,如果有多个返回值,则为空(很少使用)
前面说的都是无关子查询,
相关子查询:
如何区分相关子查询和无关子查询:最简单的办法是查看子查询本身能否执行
,如果能独立执行,是无关子查询,如果不能独立执行,是相关子查看
对于无关子查询,整个查询过程为子查看只执行一次,然后交给外部查询
相关子查询:子查询的执行次数依赖于外部查询,外部查询每执行一次,子查询执行一次
相关子查询内部原理:外部查询每执行一行,都会将对应行所用的参数传递到子查询中,如果子查询有对应值,则返回True,如果没有,则返回false,然后执行下一行
例如:SELECT * FROM [User] AS u
WHERE EXISTS ( SELECT 1 FROM Customer AS c WHERE u.Id = c.Id AND u.UserType = 1)
子查询作为计算列使用:只返回单个值,用在select语句之后,作为计算列使用
(同样分为相关子查询和无关子查询)
Sqlserver 理解子查询的更多相关文章
- sqlserver 关于子查询的优化操作
在对条件需要用到子查询的时候,通常可以通过连接来代替子查询来完成操作,更加高效 SELECT t1.id,t2.columnName,t2.columnType,t1.rownum,t1.cellVa ...
- SQLServer —— EXISTS子查询
一.删除数据库 use master go if exists (select * from sysdatabases where name = 'Demo') drop database Demo ...
- Oracle - 子查询、TOP - N
1 子查询 sql 中查询是可以嵌套的,一个查询的结果可以作为另外一个查询的条件.表. SELECT select_list FROM table WHERE expr operator (SELEC ...
- 【SqlServer系列】子查询
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [Sq ...
- SQLSERVER 子查询中使用ORDER BY
SQLSERVER如何在子查询中使用ORDER BY 今天在使用公司的一个pager接口的时候,需要传递一个查询的SQL语句,因为我希望他能够在pager对他查询出来的结果排序之前自己先进行排序, 于 ...
- 数据库——SQL-SERVER练习(2)连接与子查询
一.实验准备 1.复制实验要求文件及“CREATE-TABLES.SQL”文件, 粘贴到本地机桌面. 2.启动SQL-SERVER服务. 3. 运行查询分析器, 点击菜单<文件>/< ...
- 数据库——SQL-SERVER练习(1)连接与子查询
一.实验准备 1.复制实验要求文件及“CREATE-TABLES.SQL”文件, 粘贴到本地机桌面. 2.启动SQL-SERVER服务. 3. 运行查询分析器, 点击菜单<文件>/< ...
- 深入理解MySql子查询IN的执行和优化
IN为什么慢? 在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕.例如: SELECT driver_id FROM driver where driver_id in (SELECT dr ...
- SQLServer子查询
in谓词子查询 select * from dbo.Worker where did in (select dID from DepartMent) 比较运算子查询 select * from Wor ...
随机推荐
- Turn Your Raspberry Pi Into a WiFi Hotspot with Edimax Nano USB EW-7811Un (RTL8188CUS chipset)
http://www.daveconroy.com/turn-your-raspberry-pi-into-a-wifi-hotspot-with-edimax-nano-usb-ew-7811un- ...
- 问题-WIN7 ..\Bin\InitCC32.exe".进程无法访问(拒绝访问)
问题现象: 问题原因:是InitCC32.exe没有权限. 问题处理:在DELPHI7的安装目录里设置用户权限,加入EVE... 这个用户.
- exercise.tour.go google的go官方教程答案
/* Exercise: Loops and Functions #43 */ package main import ( "fmt" "math" ) fun ...
- 笔记-iOS 视图控制器转场详解(上)
这是一篇长文,详细讲解了视图控制器转场的方方面面,配有详细的示意图和代码,为了使得文章在微信公众号中易于阅读,seedante 辛苦将大量长篇代码用截图的方式呈现,另外作者也在 Github 上附上了 ...
- 转载LINQ TO Entity 在数据库发生更改时更新实体数据模型 .edmx 文件
转载原出处:http://blog.csdn.net/litao2/article/details/8629335 在“模型浏览器”中,右击 .edmx 文件,然后选择“从数据库更新模型”. 模型更新 ...
- Sublime Text2 中Emmet(之前叫Zencoding)插件安装以及使用
一.添加插件之前先 下载Package Control 按 Ctrl+`(就是~这个键) 复制下面的代码 确认 重新启动sublime text2 import urllib2,os;pf='Pack ...
- hibernate分页实现
1.创建分页实体类 public class PageBean { private int page; // 页码 private int rows; // 每页显示行数 private int st ...
- 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系
我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...
- 【转】Netty那点事(三)Channel中的Pipeline
[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch3-pipeline.md Channel是理解和使用Nett ...
- ServletContext1
---------------ConfigServlet.java----------- protected void doGet(HttpServletRequest request, HttpSe ...