今天给大家介绍一下SQLServer子查询相关知识,希望对大家有所帮助!1、子查询的概念介绍子查询可以嵌套在SELECT、INSERT、UPDATE、DELETE语句或者其他子查询语句中的查询,子查询一般作为查询的中间结果集。子查询也称为内部查询或内部选择,包含子查询的语句称为外部查询或外部选择。根据可用的系统内存和查询中其他表达式的复杂性,嵌套限制也不同。一般可支持32层嵌套。个人建议尽量避免多层嵌套,这样SQL语句的可读性和可维护性会较差。子查询通常可以在使用表达式的任何地方使用。2、子查询分类单值子查询:子查询的返回值属于single。常用于查询列和单值的查询条件。多值子查询:子查询返回多个值。常用于in、exists等过滤语句。3、子查询的使用场景3.1在选择列表中使用子查询在选择列表中使用子查询作为查询结果的列值。在这种情况下,调用子查询只能返回一个值。只能是单值子查询。--查询学生姓名、年龄、总分selecta.username,a.age,(selectsum(score)fromScorewhereuserId=a.userId))totalScorefromUserInfoa3.2作为查询条件--查询部门名称为的员工信息单值查询技术部selectusername,age,addressfromEmpwheredeptno=(selecttop1deptnofromDeptInfowheredepName='技术部');--query多值查询selectname,codefromProductInfowhereCodein(selects.codefromStockInfoswhereqty>20);同样的insert,update,delete用法类似例如:--删除一个stock为0的商品deletefromProductInfowhereCodein(selects.codefromStockInfoswhereqty=0);--更新一个stock为0的商品,更新remark字段为tagupdateProductInfosetremark='mark'whereCodein(selects.codefromStockInfoswhereqty=0)4.子查询和连接查询的关系许多包含子查询的SQL语句都可以用连接查询的形式来表达,包含子查询的语句的性能与没有子查询的语义等价语句。但是在检查存在性的情况下,连接查询的性能更好,数据量越大,连接查询的效率就越高。例如:--query学生姓名,年龄,总分selectmin(a.username),min(a.age),sum(score)totalScorefromUserInfoaleftjoinScorebona.userId=b.userId5,包含inandexistssubquerydifferenceinsubquery:resultIs包含0个或多个值的列表,表示值的相等关系。exists子查询:它只返回true或false。表示存在的行为。通常in和exist是可以互换的。当子查询结果不存在NULL值时,notin和notexists得到的查询结果是一样的,生成的查询计划也是一样的。当in中的值为null时,查询记录为0;当exists中的值为null时,查询条件不生效。示例:selectname,ageUserInfowhereuserIdin(1,2,3,4);selectname,ageUserInfowhereexists(1,2,3,4);说明:EXISTS和IN的使用效率通常比in效率高。但要视实际情况和具体使用情况而定:IN适用于外观大内面小的情况;EXISTS适用于外观小而内表面大的情况。6.包含比较运算符的子查询子查询可以由比较运算符(=、<>、>、>=、<、!>、!<或<=)引入。使用比较运算符引入的子查询必须返回单个值,而不是值列表。否则,SQLServer将显示一条错误消息。
