[MySQL練習] 查詢兩個表的差集(兩種方法)


在經典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

查出來結果都是一樣的

 

 記錄一下哈哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM