`

[收藏]sql多表查询之三:子查询IN

SQL 
阅读更多

sql多表查询之三:子查询IN

标签: sql多表查询 子查询in

   关于使用子查询IN,给大家一个小忠告:子查询IN适合外结果集大,子查询结果集小的情况,千万不能滥用子查询IN,您一定要保证子查询所返回的结果集 尽量的小,哪怕你的SQL返回记录数只有1条,如果你使用到了子查询IN,而你的子查询返回10000条,那速度会受到很大影响呢

  大家都领会过使用不等连接进行库存计算 的神妙了吧,有没有应用到自己的学习与工作中去呢?今天我们上第三盆菜,子查询,有什么建议或意见也欢迎大家多多留言讨论啦!

  什么?你还没有看到不等连接,那么点点这里吧sql多表查询之二:不等连接
  今天我们要介绍的是子查询
  子查询大家应该都不陌生啦,在很多地方可以使用到的
  首先我们来总结一下SQL 子查询可以用在哪些地方
  子查询的位置
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语句收藏 Sql语句收藏

    查询多列与计算子查询** - **`SELECT *`**: 表示选取表中的所有列。 - **`(select count(0) from [picture] where album_id = [album].id) as piccount`**: 这是一个子查询,用于计算每个相册中的图片数量。`count...

    sql语句经典查询帖子收藏.

    这些只是SQL查询中的一部分基础知识,实际应用中可能涉及更复杂的子查询、连接、窗口函数、存储过程等。通过不断实践和学习,你将能够编写出更高效、更复杂的SQL查询来满足各种数据处理需求。这个"sql语句经典查询...

    一些常用的sql查询语句收藏

    6. **子查询**:在主查询内部嵌套另一个查询,用于提供临时结果供外部查询使用。例如: ```sql SELECT * FROM table_name WHERE column IN (SELECT column FROM another_table); ``` 7. **聚合查询(WITH ROLLUP...

    Oracle 常用SQL技巧经典收藏

    8. **用NOT EXISTS替换NOT IN**:在否定子查询中,NOT EXISTS通常比NOT IN快,因为NOT EXISTS只需检查是否存在匹配项,而NOT IN可能需要遍历整个子查询结果。 这些技巧可以帮助数据库管理员和开发人员优化Oracle ...

    个人收藏的SQL优化34条

    12. **减少临时表的使用**:临时表可能会占用大量内存,尝试使用子查询或变量代替。 13. **使用存储过程**:存储过程可以预先编译,提高执行效率,并减少网络通信。 14. **避免使用SELECT ***:只选择你需要的列,...

    经典SQL语句收藏版

    - 子查询允许在一个查询内部嵌套另一个查询,如`SELECT a, b, c FROM a WHERE a IN (SELECT d FROM b)`,这会找出a表中与b表d列匹配的行。 5. **显示特定列**: - 若要显示特定列的组合,如文章、提交人和最后...

    T-SQL查询技巧语句(收藏版).txt

    - 使用子查询的方式,先查询出前M条记录的ID,然后根据这些ID再次查询出所需的第N到第M条记录。 3. **末尾分页查询:** - 使用`SELECT TOP N * FROM 表名 ORDER BY ID DESC`查询最后N条记录。 4. **跳过指定数量...

    数据库技术复习题集2操作题.doc

    12. **集合操作与子查询**:查询未选修的课程、选修3门以上课程的学生,以及调整成绩的SQL语句。 13. **多表连接与查询**:在商场、商品和销售三个表中进行查询,例如创建销售表,定义主键和外键,以及查询包含特定...

    sqlserver 统计sql语句大全收藏

    这个查询利用子查询来获取每个学生的总成绩,再通过`JOIN`操作将结果与原始表连接,从而得到排名。这种方法可以避免使用`ORDER BY`在`GROUP BY`之后,对于某些数据库系统来说可能更有效。 ```sql SELECT DISTINCT ...

    数据库数据查询应用实践资料大全.pptx

    FROM 另一表 WHERE ...)`: 子查询可以在主查询中作为条件,实现更复杂的逻辑。例如,同样查找读者“081101”的借书记录,也可以写成`SELECT * FROM TLend WHERE 借书证号='081101' AND ISBN IN (SELECT ISBN FROM ...

    数据库试题数据库试题数据库试题

    - 找出非计算机系且年龄小于21岁的学生,需要使用除法运算或子查询来实现 9. **函数依赖与关系模式分解**: - 函数依赖分析:找出属性间的关系,确定键码 - BCNF分解:确保关系模式满足第三范式,消除传递依赖 ...

    数据库技术复习题3 操作题 附答案.docx

    3. SQL 查询:要检索年龄低于作者平均年龄的所有作者的信息,可以使用子查询计算平均年龄并进行比较: `SELECT 作者名, 书名, 出版社 FROM 作者 JOIN 图书 ON 作者.作者编号 = 图书.作者编号 WHERE 年龄 (SELECT ...

    数据库SQL语句优化总结(收藏)

    对于跨表查询,考虑使用EXISTS代替IN,以利用子查询的索引。 6. **LIKE通配符的使用**:LIKE '%abc%'会导致全表扫描,因为需要搜索所有数据。若要提高效率,可以考虑使用全文检索功能。 7. **参数化查询**:使用...

    对MySql经常使用语句的全面总结(必看篇)

    MySQL是世界上最流行的开源关系型数据库管理系统之一,它提供了丰富的SQL语句来处理各种数据库操作。以下是对MySQL常用语句的全面总结: ### 1. 服务器管理 - **启动MySQL服务**:`net start mysql` - **连接MySQL...

    Oracle函数大全收藏

    ### Oracle函数大全收藏 在Oracle数据库中,SQL函数是处理数据的强大工具,它们可以用于执行各种数据操作,从简单的字符转换到复杂的数学计算。本文将详细介绍部分常用的Oracle SQL函数及其用法。 #### 1. ASCII *...

Global site tag (gtag.js) - Google Analytics