這是一種比較簡單和簡潔的寫法,像這樣同一個人有兩種行為的一般都要建立兩張表,進行自身的對比。同時有的時候還要和其他表進行連接
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
這里我們利用一個語句就實現了,是不是很簡單呢,所以一定要總結經驗,看到這樣的題目我們第一反應就是表的重命名