MySQL(三)子查询

子查询

当一个查询是另一个查询的条件或表时,称之为子查询。

以下例子来说明子查询

有以下几张表

 1、查询没有学过“叶平”老师课的同学的学号和姓名

select sid 学号,sname 姓名 from student where sid not in (select a.sid from sc a join course b on (a.cid=b.cid) join teacher c on b.tid=c.tid and c.tname='叶平');

结果 

 从表中可以看出,全部学生都选过叶平老师的课,因此这个查询结果为空,思路是先查询学过叶平老师的所有学号(select a.sid from sc a join course b on (a.cid=b.cid) join teacher c on b.tid=c.tid and c.tname='叶平'),在查询学号和姓名,这时只要在条件中写上后面查询的学号不在学过叶平老师课程的学号内,就可以查出结果了。

2、查询两门以上不及格课程的同学的学号及平均成绩

select a.sid 学号,avg(score) 平均成绩 from (select sid from sc group by sid having count(cid)>1) a join sc b on a.sid=b.sid group by b.sid having sum(score<60)>1;

结果

 思路是先挑出学了2门及以上课程以上的同学的学号(select sid from sc group by sid having count(cid)>1),然后再与有成绩的表相连,也就是sc表,接下来按照学号分组,这样就把同个学生分成一组,好操作他们选课的分数,然后在判断每个组中是否有两个及以上的分数小于60(sum(score<60)>1,判断是否有两个及以上的分数小于60)。

3、查询学过1号课程并且也学过2号课程的同学的学号和姓名

select sid 学号,sname 姓名 from student where sid in (select sid from sc where cid=1 or cid=2 group by sid having count(*)>1);

 结果

思路是先分别找出学过1号课程和2号课程的学生学号 (select sid from sc where cid=1 or cid=2 group by sid having count(*)>1),然后查询有姓名的表,查询姓名和学号的列,这时这个学号的范围学过1号课程和2号课程的学生学号内,就找出符合的学生姓名和学号了。

 4、查询所有课程成绩都小于等于60分的同学的学号和姓名

select a.sid,a.sname from student a inner join (select sid from sc group by sid having max(score)<=60) b on b.sid=a.sid;

结果

 思路是先按学号分组并找出最大值小于等于60的学号(select sid from sc group by sid having max(score)<=60),因为最大值都小于等于60的话其他的分数肯定也都在最大值之下了,再把这个学号和有姓名的表的学号连接起来,就可以找出符合条件的学生的姓名和学号了。

总结

 从上面例子可以看出,子查询有两种情况,一种是把子查询当做值放在条件处用来充当判断条件,另一种是把子查询当做一张表,可以从该表中要到你想要的列。在需要查询的列后面加上空格和一个新名字,就可以把原来的列名在结果中改成你写的新列名。给子查询加上一个大括号,并在后面给它起一个名字,可以更加方便的使用子查询。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值