在經典sql50題中這道題是這樣的:
有三張表
student表
course表
score表
#10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
這是網上查的
select st.* from student st inner join score sc on sc.s_id = st.s_id inner join course c on c.c_id=sc.c_id and c.c_id="01" where st.s_id not in ( select st2.s_id from student st2 inner join score sc2 on sc2.s_id = st2.s_id inner join course c2 on c2.c_id=sc2.c_id and c2.c_id="02" )
這是自己寫的(單純覺得這樣看上去清楚一點,然后就懶得跟課程表連了,有成績的話他就學了,沒有成績他就沒學)
第一種方法就是用IN然后用學生表中s_id跟成績表中條件是02課程的s_id 進行比較
SELECT t1.* FROM student t1 JOIN (SELECT s_id FROM score WHERE c_id =01 and s_id NOT in (SELECT s_id FROM score WHERE c_id =02)) t2 ON t1.s_id = t2.s_id
第二種方法就是
用學習01課程的表左連接學習02課程的表查詢出來s_id,因為是左連接學過01但沒有學過02的人他的那個成績就是用NULL顯示
根據這個NULL進行判斷。如果是NULL他就是學過01但沒學過02的。
SELECT t1.* FROM student t1 JOIN (SELECT t1.s_id FROM (SELECT s_id,s_score FROM score WHERE c_id =01) t1 LEFT JOIN (SELECT s_id,s_score
FROM score
WHERE c_id =02) t2 ON t1.s_id = t2.s_id WHERE t2.s_score IS NULL) t2 ON t1.s_id = t2.s_id
查出來結果都是一樣的
記錄一下哈哈