查詢結果取交集_MySQL查詢語句:子查詢的使用
阿新 • • 發佈:2021-01-26
技術標籤:查詢結果取交集
子查詢定義
- 子查詢指一個查詢語句巢狀在另一個查詢語句內的查詢
- 子查詢結果作為外層另一個查詢的過濾條件
- 子查詢可以放在select語句、from語句、where語句、having語句後面
- 分為標量子查詢和關聯子查詢
- 子查詢要加括號括起來
查詢題目
有成績表sc,欄位分別是學生編號s_id,課程編號c_id,成績score
查詢平均成績大於等於85的所有學生的學號、課程編號和成績
分為兩步,第一步先算出平均成績大於等於85的學生學號
select s_id from sc
group by s_id
having avg(score)>=85;
查詢結果:
第二步,查出上一步得到的學生編號的成績資訊
select * from sc
where s_id in ("01","07");
查詢結果:
最後將兩個查詢語句整合在一起,將第二個查詢的"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");
結果如下:
按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
需要將成績和平均成績共同顯示,先求出每個學生的平均成績
select s_id,avg(score) 平均成績 from sc
group by s_id;
結果如下:
在將上面查詢的結果與成績表進行橫向連線,連線欄位是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;
結果如下:
以上的查詢都是標量子查詢,外層查詢不會影響內層查詢的結果,關聯子查詢的案例如下:
用關聯子查詢解決排名問題(1):https://zhuanlan.zhihu.com/p/85729241
用關聯子查詢解決排名問題(2):https://zhuanlan.zhihu.com/p/85815809
歡迎觀看,如果對你有用,給個贊和關注哈~