sql多表查询之三:子查询IN
标签:
sql多表查询
子查询in
关于使用子查询IN,给大家一个小忠告:子查询IN适合外结果集大,子查询结果集小的情况,千万不能滥用子查询IN,您一定要保证子查询所返回的结果集
尽量的小,哪怕你的SQL返回记录数只有1条,如果你使用到了子查询IN,而你的子查询返回10000条,那速度会受到很大影响呢
大家都领会过使用不等连接进行库存计算
的神妙了吧,有没有应用到自己的学习与工作中去呢?今天我们上第三盆菜,子查询,有什么建议或意见也欢迎大家多多留言讨论啦!
今天我们要介绍的是子查询
子查询大家应该都不陌生啦,在很多地方可以使用到的
子查询的位置
Select <子查询> from <子查询> where <子查询>
Insert table (columns) <子查询>
Delete table from <子查询> where <子查询>
Update table from <子查询> where <子查询>
那么,你们知道子查询的关键字有哪些吗?
IN
EXISTS
对,就这两个,是不是很简单呢
可是,要把子查询用好,可不是一件这么容易的事情
今天我们来介绍子查询IN
IN 关键字使您得以选择与列表中的任意一个值匹配的行
太抽象了是吗,我们还是来看看实例吧:
这是一个数据模型
请用SQL来实现以下问题
1.显示成绩全部及格的学生名单
2.显示各班总成绩最好的学生名单
3.显示各班各课目成绩前3位学生的成绩
第一题应该很简单,其实有很多种写法
首先,如何得到及格的学生呢?
select 学号 from 成绩 where 成绩>=60
然后,这样只能得到学号呀,所以,我们需要:
select * from 学生 where 学号 in (select 学号 from 成绩 where 成绩>=60)
换一个写法可不可以呢?
select * from 学生 where 学号 not in (select 学号 from 成绩 where 成绩<60)
当然可以,想想哪种效率高,班上是及格的学生多还是不及格的学生多呢?
如果及格的学生多,那么select 学号 from 成绩 where 成绩<60,是不是返回的数据量更小呢?当然效率就高一些!
第二题,显示各班总成绩最好的学生名单
我们先把问题简单化,得到某一个班成绩最好的学生
select max(成绩) from 成绩 where 班级=XX
这个容易吧!
各班成绩最好的呢?
select 学号 from 成绩 a where 成绩=(select max(成绩) from 成绩 where 班级=a.班级
把成绩表A与子查询通过班级关联,用成绩做条件,搞定!
学生名单
select * from 学生 where 学号 in (
select
学号 from 成绩 a where 成绩=(select max(成绩) from 成绩 where 班级=a.班级)
)
也不复杂吧
第三题,显示各班各课目成绩前3位学生的成绩
跟第二题有点象吧,可是,大家注意,第二题只取每个班的第一名,我们可以用MAX,这里,似乎用不了了吧….
怎么办呢
其实很简单,在第二题中,我们的成绩是用=,而这题中,我们的成绩用IN不就可以了吗?
select * from 成绩 a where 成绩 in(select top 3 成绩 from 成绩 where 班级=a.班级 and 课目=a.课目order by 成绩.成绩 desc)
不过,有没有发现小漏洞呢,如果我有两个第三名的成绩一样,会返回几条记录呢,留给大家想想吧:)
关于使用子查询IN,给大家一个小忠告:子查询适合外结果集大,子查询结果集小的情况,千万不能滥用子查询IN,您一定要保证子查询所返回
的结果集尽量的小,哪怕你的SQL返回记录数只有1条,如果你使用到了子查询,而你的子查询返回10000条,那速度会受到很大影响呢,那天你的
SQLSERVER当机了,可千万不要来找我麻烦呀,哈哈
还有,其实第二题中的子查询与外面的表进行关联XX=外表.XX,一般情况下,我们是不太赞同这样使用的,同时会存在性能问题
那么,会不会更好的解决方案呢?下期我们将介绍子查询中应用面更广的EXISTS
,静请关注哦!
分享到:
相关推荐
多表查询和子查询
实验目的和要求:了解SQL SEVER 2000的功能及组成,熟练掌握利用SQL SEVER 2000企业管理器和查询分析器创建数据库、表、索引和修改表结构及向数据库输入数据、修改数据和删除数据的操作方法和步骤,掌握定义数据约束...
关于SQL多表查询练习,新手可以查看,附上代码和查询结果
给坛友演示WinForm+SQL多表联合自定义查询,SQL表结构见: http://bbs.csdn.net/topics/392297046
sql多表关联查询,三表关联查询
SQL数据库多表查询练习题附加数据库
主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...
Excel中SQL多表查询
10.sql.server.2005.多表查询和子查询 10.sql.server.2005.多表查询和子查询
Microsoft SQL Server 2008技术内幕:T-SQL语言基础(子查询)练习sql文件
oracle sql 多表连接和子查询 oracle sql 多表连接和子查询
浅谈Linq to sql 的多表关联与动态条件查询 Linq to sql 是一种强大的数据查询语言,它可以帮助开发者快速、高效地访问和操作数据库数据。在本文中,我们将讨论 Linq to sql 的多表关联和动态条件查询这两个重要的...
sql 联合查询 子查询 综合查询 统计数据 case when then 用法
sql多表关联查询
Microsoft SQL Server 2008技术内幕:T-SQL查询
在SQL语言中,当一个查询语句嵌套在另一个查询的查询条件之中时,称为子查询。
SQL查询 多表查询,学习left 、right等操作
本文主要通过一下几个方面介绍:使用SQLDMV查找慢速查询、通过APM解决方案查询报告、SQLServer扩展事件、SQLAzure查询性能洞察等相关内容。本文来自博客园,由火龙果软件Anna编辑、推荐。SQLServer的一个重要功能是...
本书是Inside Microsoft SQL Server ...第4章 子查询、表表达式和排名函数 第5章 联接和集合操作 第6章 聚合和旋转数据 第7章 TOP和ALLPY 第8章 数据修改 第9章 图、树、层次结构和递归查询 附录A 逻辑难题 索引