前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQLServer子查询相关知识笔记

SQLServer子查询相关知识笔记

作者头像
IT技术分享社区
发布2021-04-07 20:56:29
9110
发布2021-04-07 20:56:29
举报
文章被收录于专栏:SQLServerIT技术分享社区

今天给大家介绍以下SQLServer子查询相关知识,希望对大家能有所帮助!

1、子查询概念介绍

子查询可以嵌套在SELECT、INSERT、UPDATE、DELETE语句或其他子查询语句中的查询,子查询一般作为查询中间结果集角色,子查询也称为内部查询或内部选择,包含子查询的语句称为外部查询或外部选择。根据可用系统内存和查询中其他表达式的复杂程度的不同,嵌套限制也有所不同,一般可以支持嵌套32层。个人建议尽量避免多层嵌套这样SQL语句的可读性和可维护性都会很差。使用表达式的地方一般都可以使用子查询。

2、子查询分类

单值子查询:子查询的返回值属于单个。常见与查询列、单值的查询条件使用。

多值子查询:子查询的返回值多个。常见in、exists等筛选语句使用。

3、子查询的使用场景

3.1 选择列表中使用子查询

选择列表中使用子查询作为查询结果一列值出现的。该情况下调用子查询返回的只能是单值。只能是单值子查询。

代码语言:javascript
复制

-- 查询学生姓名、年龄、总成绩

select a.username,a.age,(select sum(score) 
from Score where userId=a.userId)) totalScorefrom UserInfo a

3.2 作为查询条件

代码语言:javascript
复制

-- 查询部门名称是技术部的员工信息 单值查询
select username,age,address from Emp
where deptno=(select top 1 deptno 
from DeptInfo where depName='技术部');
-- 查询产品库存大于10吨的产品列表 多值查询
select name,code from ProductInfo
where Code in (select s.code from StockInfo s where qty>20);
同样的insert、update、delete用法比较类似比如:
-- 删除库存量为0的产品
delete from ProductInfo
where Code in (select s.code from StockInfo s where qty=0);
-- 更新库存量为0的产品remark字段更新为标记
update ProductInfo set remark='标记'
where Code in (select s.code from StockInfo s where qty=0)

4、子查询和连接查询的关系

很多包含子查询的SQL语句都可以改成连接查询的形式表示,包含子查询的语句和语义上等效的无子查询的语句性能差别不大。但针对检查存在性的情况中,联接查询性能更好,数据量越大联接查询会更能体现效率。

比如:

代码语言:javascript
复制

-- 查询学生姓名、年龄、总成绩
select min(a.username),min(a.age),sum(score) totalScore
from UserInfo a 
left join Score b on a.userId=b.userId

5、包含in和exists子查询区别

in子查询:结果是包含0个或者多个值的列表,表示值的等于关系。

exists子查询:它只返回true或false。表示一种存在的行为。

通常情况下in和exist可以互换。

当子查询结果不存在NULL值时,not in和not exists得到的查询结果一样,所生成的查询计划也一样。

当in里面的值为null的情况下查询记录为0;当exists里面的值为null情况下相当于查询条件不起作用。

示例:

代码语言:javascript
复制
select name,age UserInfo where userId in (1,2,3,4);
select name,age UserInfo where exists (1,2,3,4);

说明:EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,但要看实际情况具体使用:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

6、包含比较运算符的子查询

子查询可以由一个比较运算符(=、<>、>、>=、<、!>、!<或<=)引入。使用比较运算符引入的子查询必须返回单个值而不能一个值列表。否则,SQL Server将显示一条错误信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明互联网技术分享社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、子查询概念介绍
  • 2、子查询分类
  • 3、子查询的使用场景
    • 3.1 选择列表中使用子查询
    • 4、子查询和连接查询的关系
    • 6、包含比较运算符的子查询
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档