理解子查询:

理解子查询:

多表连接查询往往也可以用子查询进行替代

子查询本质是嵌套进其他 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 理解子查询的更多相关文章

  1. sqlserver 关于子查询的优化操作

    在对条件需要用到子查询的时候,通常可以通过连接来代替子查询来完成操作,更加高效 SELECT t1.id,t2.columnName,t2.columnType,t1.rownum,t1.cellVa ...

  2. SQLServer —— EXISTS子查询

    一.删除数据库 use master go if exists (select * from sysdatabases where name = 'Demo') drop database Demo ...

  3. Oracle - 子查询、TOP - N

    1 子查询 sql 中查询是可以嵌套的,一个查询的结果可以作为另外一个查询的条件.表. SELECT select_list FROM table WHERE expr operator (SELEC ...

  4. 【SqlServer系列】子查询

    1   概述 1.1  已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [Sq ...

  5. SQLSERVER 子查询中使用ORDER BY

    SQLSERVER如何在子查询中使用ORDER BY 今天在使用公司的一个pager接口的时候,需要传递一个查询的SQL语句,因为我希望他能够在pager对他查询出来的结果排序之前自己先进行排序, 于 ...

  6. 数据库——SQL-SERVER练习(2)连接与子查询

    一.实验准备 1.复制实验要求文件及“CREATE-TABLES.SQL”文件, 粘贴到本地机桌面. 2.启动SQL-SERVER服务. 3. 运行查询分析器, 点击菜单<文件>/< ...

  7. 数据库——SQL-SERVER练习(1)连接与子查询

    一.实验准备 1.复制实验要求文件及“CREATE-TABLES.SQL”文件, 粘贴到本地机桌面. 2.启动SQL-SERVER服务. 3. 运行查询分析器, 点击菜单<文件>/< ...

  8. 深入理解MySql子查询IN的执行和优化

    IN为什么慢? 在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕.例如: SELECT driver_id FROM driver where driver_id in (SELECT dr ...

  9. SQLServer子查询

    in谓词子查询 select * from dbo.Worker where did in (select dID from DepartMent) 比较运算子查询 select * from Wor ...

随机推荐

  1. BNUOJ-29357 Bread Sorting 模拟

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29357 直接模拟就可以了.. //STATUS:C++_AC_190MS_1884KB # ...

  2. sublime text2注册码

    ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC ...

  3. 重新学习struts

    这就是所谓的一边工作一边学习. 今天准备把给公司写个管理页面,按照之前的路数,写起来应该挺快,但是不太规范.也就沉下心来学习一下了. 第一个学习的是,之前,在学校,听师兄说过,对页面编码可用inter ...

  4. Linq知识小结

    Linq语法小结:有两种形式的语法可供我们在写Linq查询时使用,分别是“查询语法”.“方法语法”.1)先看个列子,有个直观认识     int[] arr = { 12, 2,45,34,23,18 ...

  5. Ajax调用WebService(一)

    Ajax调用WebService(一) http://www.cnblogs.com/leslies2/archive/2011/01/26/1934889.html 分类: Ajax 使用技术 We ...

  6. ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中

    如果解决ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中 手机平台性能是个关键问题. 压缩视频分成3个步骤: 读取显卡数据, 使用编码器压缩,保存文件. 使用libav 压缩的 ...

  7. HDU4279(2012年天津网络赛---数论分析题)

    题目:Number 题意: 给出一个f(x),表示不大于x的正整数里,不整除x且跟x有大于1的公约数的数的个数.定义F(x),为不大于x的正整数里,满足f(x)的值为奇数的数的个数.题目就是求这个F( ...

  8. 修改hosts文件(判断是否为管理员/以管理员权限运行脚本)

    将以下命令保存为 HostsModify.ps1,然后执行即可 #该脚本用来添加hosts解析记录.脚本在执行的时候会判断当前用户是否为管理员,如果不是则弹出提示框口,要求输入相应密码 If (-NO ...

  9. ThinkPHP Volist标签

    Volist标签主要用于在模板中循环输出数据集或者多维数组. volist标签(循环输出数据) 闭合 非闭合标签 属性 name(必须):要输出的数据模板变量 id(必须):循环变量 offset(可 ...

  10. VRRP协议具体解释

    转帖:http://blog.chinaunix.net/space.php?uid=11654074&do=blog&id=2857384 Contents              ...