这是一种比较简单和简洁的写法,像这样同一个人有两种行为的一般都要建立两张表,进行自身的对比。同时有的时候还要和其他表进行连接
select student.sid, sname
from sc a,sc b,student
where a.sid=b.sidand a.cid=100and b.cid=200and student.sid=a.sid 这是一种比较保守的简单的思路,虽然代码要复杂一些,但是思路很简单,
一般顺着题目的意思一步一步的写,就可以写出来。
这里我们思路大概是这样的,先找出学了100的学号,然后找出学了200的学号,
题目要求我们同时学了100和200的学号,那么我们只需要将这两张表和student表连接起来,自然也就是两个课程都学了的表。然后选出学号和姓名就可以了。但是这里要注意表的连接,要注意重命名并且要注意on之后的条件,三张表的连接直接在后面写join 就行了。
select stu.sid,stu.sname from student stu join (
select sid from sc where cid =100) c100 on stu.sid=c100.sid join (
select sid from sc where cid =200) c200 on stu.sid=c200.sid
查询100课程比200课程成绩高的所有学生的学号。
先来一个比较简单的写法,和上面的有点像,做法也是先分别查询出100课程和200课程的分数,然后将这两张表通过sid连接起来,再利用一个where语句就可以是实现了
是不是很简单
select c100.sid from (
select sid,score from sc where cid=100) c100 join
(select sid,score from sc where cid=200) c200 on c100.sid=c200.sid
where c100.score>c200.score
第二种写法同样是涉及到自身的比较,那么高深一点的人就会马上反应会有一个表的自身对比将表变成两张表,一张表用于100一张表用于200,下面我们来看看具体怎么实现的
select a.sid from sc a,sc b where a.sid=b.sidand a.cid=100and b.cid=200and a.score>b.score
这里我们利用一个语句就实现了,是不是很简单呢,所以一定要总结经验,看到这样的题目我们第一反应就是表的重命名