今天给大家介绍以下SQLServer子查询相关知识,希望对大家能有所帮助!
子查询可以嵌套在SELECT、INSERT、UPDATE、DELETE语句或其他子查询语句中的查询,子查询一般作为查询中间结果集角色,子查询也称为内部查询或内部选择,包含子查询的语句称为外部查询或外部选择。根据可用系统内存和查询中其他表达式的复杂程度的不同,嵌套限制也有所不同,一般可以支持嵌套32层。个人建议尽量避免多层嵌套这样SQL语句的可读性和可维护性都会很差。使用表达式的地方一般都可以使用子查询。
单值子查询:子查询的返回值属于单个。常见与查询列、单值的查询条件使用。
多值子查询:子查询的返回值多个。常见in、exists等筛选语句使用。
选择列表中使用子查询作为查询结果一列值出现的。该情况下调用子查询返回的只能是单值。只能是单值子查询。
- -- 查询学生姓名、年龄、总成绩
- select a.username,a.age,(select sum(score)
- from Score where userId=a.userId)) totalScorefrom UserInfo a
- -- 查询部门名称是技术部的员工信息 单值查询
- 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)
很多包含子查询的SQL语句都可以改成连接查询的形式表示,包含子查询的语句和语义上等效的无子查询的语句性能差别不大。但针对检查存在性的情况中,联接查询性能更好,数据量越大联接查询会更能体现效率。
比如:
- -- 查询学生姓名、年龄、总成绩
- select min(a.username),min(a.age),sum(score) totalScore
- from UserInfo a
- left join Score b on a.userId=b.userId
in子查询:结果是包含0个或者多个值的列表,表示值的等于关系。
exists子查询:它只返回true或false。表示一种存在的行为。
通常情况下in和exist可以互换。
当子查询结果不存在NULL值时,not in和not exists得到的查询结果一样,所生成的查询计划也一样。
当in里面的值为null的情况下查询记录为0;当exists里面的值为null情况下相当于查询条件不起作用。
示例:
- 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适合于外表小而内表大的情况。
子查询可以由一个比较运算符(=、<>、>、>=、<、!>、!<或<=)引入。使用比较运算符引入的子查询必须返回单个值而不能一个值列表。否则,SQL Server将显示一条错误信息。
歌词编辑器 歌词编辑器 第一步:选择要播放的歌曲并播放 第二步:填写全部的歌词...
一石激起千层浪,继中国区浩浩荡荡的大裁员告一段落之后,甲骨文并未因此收起手...
微信文件传输助手是微信电脑版与手机微信之间相互传输图片等文件的好工具,但很...
ADO对象: Connection Command Recordset Record Stream ASP支持的对象很多,可...
一、正则表达式概述 二、正则表达式在VBScript中的应用 三、正则表达式在VavaScr...
【排序算法】之lowb三人组冒泡、插入、选择 什么是lowb三人组 冒泡排序bubble so...
vbs:把一段文字中指定字符颜色变成红色的正则 functionc(Tstr,Word) Dimre Setre...
本文将研究 ES6 的 for ... of 循环。 旧方法 在过去,有两种方法可以遍历 javas...
计算属性computed: 支持缓存,只有依赖数据发生改变,才会重新进行计算 不支持...
前言 相信大家都知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也...