1. 程式人生 > 其它 >查詢結果取交集_MySQL查詢語句:子查詢的使用

查詢結果取交集_MySQL查詢語句:子查詢的使用

技術標籤:查詢結果取交集

子查詢定義

  • 子查詢指一個查詢語句巢狀在另一個查詢語句內的查詢
  • 子查詢結果作為外層另一個查詢的過濾條件
  • 子查詢可以放在select語句、from語句、where語句、having語句後面
  • 分為標量子查詢和關聯子查詢
  • 子查詢要加括號括起來

查詢題目

有成績表sc,欄位分別是學生編號s_id,課程編號c_id,成績score

b2c79be157c460dae8fb9ee26c1c3504.png

查詢平均成績大於等於85的所有學生的學號、課程編號和成績

分為兩步,第一步先算出平均成績大於等於85的學生學號

select s_id from sc
group by s_id
having avg(score)>=85;

查詢結果:

acdd36d206eaff360bdc3aff036cbbbd.png

第二步,查出上一步得到的學生編號的成績資訊

select * from sc
where s_id in ("01","07");

查詢結果:

39250929057ddec75a071e54d482b2fd.png

最後將兩個查詢語句整合在一起,將第二個查詢的"01","07"替換成第一個查詢語句,第一個子查詢就寫完啦

select * from sc
where s_id in (select s_id from sc
group by s_id
having avg(score)>=85);

查詢學過編號為“01”並且也學過編號為“02”的課程的學生編號

先求出學過課程01的學生編號

select s_id from sc where c_id="01";

再求出學過課程02的學生編號

select s_id from sc where c_id="02";

學過01課程且學過02課程的學生,是上面兩個查詢結果的交集,兩個條件用and連線

select distinct s_id from sc
where s_id in (select s_id from sc where c_id="01")
    and s_id in (select s_id from sc where c_id="02");

結果如下:

788ce8b7559c52c2767faf3d207b5ad1.png

按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績

需要將成績和平均成績共同顯示,先求出每個學生的平均成績

select s_id,avg(score) 平均成績 from sc
group by s_id;

結果如下:

19042ee5540cda39f747079f75618348.png

在將上面查詢的結果與成績表進行橫向連線,連線欄位是s_id,子查詢的結果作為新表與已有表做連線時,需要給一個別名,這裡給的別名是aa。 (多表連線的用法在另一篇文章詳細介紹)

select sc.*,平均成績 
from sc join (select s_id,avg(score) 平均成績
from sc
group by s_id) as aa on sc.s_id=aa.s_id
order by 平均成績 desc;

結果如下:

974b7401b7f964444c2700f519c563ff.png

以上的查詢都是標量子查詢,外層查詢不會影響內層查詢的結果,關聯子查詢的案例如下:

用關聯子查詢解決排名問題(1):https://zhuanlan.zhihu.com/p/85729241

用關聯子查詢解決排名問題(2):https://zhuanlan.zhihu.com/p/85815809

歡迎觀看,如果對你有用,給個贊和關注哈~