查询成绩表中同时考了科目1和科目2,并且科1大于科2的学生

mac2024-11-15  6

select * from sc;

-- 01~04号学生各考了01、02、03科,05号考了01、02科,06号考了01、03科,07号学生考了02、03科, -- 那么会产生(1*3)*3*4+(1*2)*2*3=48条记录 -- 就是把左表中的一条和右表中与之相等条件下的每一条进行匹配,生成新的记录。 select s1.* , s2.* from sc s1, sc s2 where s1.sid = s2.sid;

-- 这样查询左表只把考了科目一的查询出来,右表会把所有的查询出来 -- 然后左表中的每一条记录会和右表中符合连接条件下的每一条进行匹配生成一行 select s1.*,s2.* from sc s1, sc s2 where s1.sid = s2.sid -- 把左右表中sid相等的连接起来生成新的纪录 and s1.cid='01' -- 约束左表值查出来考了科目一的

-- 这样查询出来的两个表没有连接关系了。 -- 会把左表中的每一条逐一和右表中的一条匹配(左表第1条会和右表每一条匹配),生成记录数的平方个记录 select s1.* , s2.* from sc s1, sc s2 where s1.cid='01' and s2.cid='02'

select s1.* , s2.* from sc s1, sc s2 where s1.sid=s2.sid -- 查询表中sid相等的连接起来生成新的记录 and s1.cid='01' -- 考了科目1 and s2.cid='02'-- 并且要考了科目2(因为左右表已经通过sid连接起来了,所以是在同一个id下既考了科1右考了科2)

select s1.* , s2.* from sc s1,sc s2 where s1.sid=s2.sid and s1.cid='01' and s2.cid='02' and s1.score > s2.score;

select sname,s3.* from (select s1.* from sc s1, sc s2 where s1.sid=s2.sid and s1.cid='01' and s2.cid='02' and s1.score>s2.score) s3 inner join student on student.sid=s3.sid; -- 这里使用inner join和left join的效果相同,都能实现需要
最新回复(0)