查有成绩的学生信息
分析:这道题可以用到in或者exists的用法,主要就是筛选出sc表中的sid,然后查询出student中存在上一步查询出来的sid的数据
IN()用法: 只执行一次,它查出B表中的所有id字段并缓存起来。之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录。在这里,我们的sc表数据量很少,但是当sc表数据很大的时候不适合IN()用法,因为它会吧sc表的数据全部遍历一边.
select * from student where student.sid in (select sc.sid from sc);
查询结果;
+------+--------+---------------------+------+ | SId | Sname | Sage | Ssex | +------+--------+---------------------+------+ | 01 | 赵雷 | 1990-01-01 00:00:00 | 男 | | 02 | 钱电 | 1990-12-21 00:00:00 | 男 | | 03 | 孙风 | 1990-12-20 00:00:00 | 男 | | 04 | 李云 | 1990-12-06 00:00:00 | 男 | | 05 | 周梅 | 1991-12-01 00:00:00 | 女 | | 06 | 吴兰 | 1992-01-01 00:00:00 | 女 | | 07 | 郑竹 | 1989-01-01 00:00:00 | 女 | +------+--------+---------------------+------+
EXISTS()用法: exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是其内查询语句的结果集空或者非空,空则返回false,非空则返回true,当B表比A表数据大时适合使用exists(),因为它没有那么多遍历操作,只需要再执行一次查询就行.
select * from student where exists (select sc.sid from sc where student.sid = sc.sid);
查询结果:
+------+--------+---------------------+------+ | SId | Sname | Sage | Ssex | +------+--------+---------------------+------+ | 01 | 赵雷 | 1990-01-01 00:00:00 | 男 | | 02 | 钱电 | 1990-12-21 00:00:00 | 男 | | 03 | 孙风 | 1990-12-20 00:00:00 | 男 | | 04 | 李云 | 1990-12-06 00:00:00 | 男 | | 05 | 周梅 | 1991-12-01 00:00:00 | 女 | | 06 | 吴兰 | 1992-01-01 00:00:00 | 女 | | 07 | 郑竹 | 1989-01-01 00:00:00 | 女 | +------+--------+---------------------+------+
这道题做完也可以得到一个结论:
IN()适合B表比A表数据小的情况;
EXISTS()适合B表比A表数据大的情况
以上
原文:https://www.cnblogs.com/lattesea/p/12163987.html