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 ...
随机推荐
- hdoj 1162 Eddy's picture
并查集+最小生成树 Eddy's picture Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 第一次见4.3K电阻
今天焊RC522的实验板,接收电阻买的是5.1K,焊接时发现丝层写的是432,阻为4.26K.理论值应该是4.3K
- (Relax DFS专题1.2)POJ 2386 Lake Counting(使用DFS来计算有多少坨东西是连通的)
题目大意:有N*M的矩阵稻田,'W'表示有积水的地方, '.'表示是干旱的地方,问稻田内一共有多少块积水,根据样例很容易得出,积水是8个方向任一方向相连即可. 题目大意:有N*M的矩阵稻田,'W'表示 ...
- centos6下安装部署hadoop2.2
环境准备1.操作系统:centos6.0 64位2.hadoop版本:hahadoop-2.2.0 安装和配置步骤具体如下:1.主机和ip分配如下 ip地址 ...
- WdatePicker开始日期不能大于结束日期
<input class="input_calendar inputcss" id="startDate" runat="server" ...
- http://www.360doc.com/content/10/1012/09/3722251_60285817.shtml
http://www.360doc.com/content/10/1012/09/3722251_60285817.shtml http://www.docin.com/p-163063250.htm ...
- STL之Map的运用
Map是c++的一个标准容器,她提供了非常好一对一的关系,在一些程序中建立一个map能够起到事半功倍的效果,总结了一些map基本简单有用的操作! 1. map最主要的构造函数: map<s ...
- 【设计模式】学习笔记17:代理模式之保护代理与Java反射
本文出自 http://blog.csdn.net/shuangde800 本笔记内容: 1. Java动态代理,反射机制 2. 保护代理 3. 应用保护代理实现的约会系统 ----------- ...
- ABAP程序执行效率和优化 ABAP Performance Examples
一. SQL Interface1. Select ... Where vs. Select + Check用Select … Where语句效率比Select ...
- android123 zhihuibeijing 新闻中心-新闻 页签 ViewPagerIndicator实现
## ViewPagerIndicator ## 使用导入ViewPagerIndicator库的方式相当于可以改源码,打包编译Eclips可以自动完成. ViewPager指针项目,在使用ViewP ...