MySQL数据库练习-4.1

查有成绩的学生信息


 

分析:这道题可以用到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表数据大的情况

 

以上

posted @ 2020-01-07 22:04  lattesea  阅读(249)  评论(0编辑  收藏  举报