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 ...
随机推荐
- [坑]c#中double转字符串精度丢失问题记录
在项目遇到了一个比较大的double值,然后出现了一些意想不到的状况: double b=1141.161994934082; b.ToString();//'1141.16199493408' 然后 ...
- python 访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...
- javascript操作注册表
try{ var shell = new ActiveXObject("WScript.Shell"); //读注册表值var key1 ...
- 7个改变世界的Java项目
Java的开源生态系统是强大而健康的,这是我们(Oreilly)创建OSCON Java(Open Source Convention Java)的主要原因之一.在过去10年中,一些项目已经被广泛接受 ...
- 多线程基础及实例(java)
前言: 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量级的进程 ...
- 【STL源码学习】STL算法学习之四
排序算法是STL算法中相当常用的一个类别,包括部分排序和全部排序算法,依据效率和应用场景进行选择. 明细: sort 函数原型: template <class RandomAccessIter ...
- 获取Application中的spring容器
方式1: ApplicationContext ac = (ApplicationContext) invocation.getInvocationContext().getApplication() ...
- Cocos2d-x——CocosBuilder官方帮助文档翻译1 使用自定义类
原创:请注明转载! 在Cocos2d-x中使用CocosBuilder 使用自定义类 CocosBuilder的使用方法是通过自定义类.在CocosBuilder中选中一个对象并在属性栏中输入自定义类 ...
- 关于android的Activity的四种启动模式
最近做项目遇到一个问题,当触摸屏幕的时候通过intent启动activity,发现会启动多次,而后查阅资料,发现,原来是activity的模式设置问题. Activity的启动模式可以通过Androi ...
- 将图片序列保存为GIF文件
http://stackoverflow.com/questions/11459568/issue-with-rebuilding-and-saving-gifs-using-tgifimage 将图 ...