子查詢是我在刷題過程中最為頭疼的部分,子查詢根據用途不同又可分為子查詢、标量子查詢、關聯子查詢,現在把知識點系統地捋一遍。
子查詢
是什麼:一次性的視圖,臨時表
運作順序:先子查詢,後外部查詢
in,any,all的使用
-
- In (SELECT XX from……)
- Any:比較運算符+any:>any(子查詢),隻要大于子查詢中其中1個值,就傳回結果
- All:>all(子查詢):大于all中所有值
注意事項
-
- 子查詢前不能進行數學運算
- A/3 > all(b) 對
- A > 3*all(b) 錯
- 避免使用多層嵌套子查詢,難以看懂
- 子查詢名稱最好不要省略
- 子查詢前不能進行數學運算
标量子查詢
是什麼:隻能傳回一行一列的查詢結果,單一值
使用場景:可以和比較運算符一起使用,任何使用單一值的場景均可使用,不能傳回多行
關聯子查詢
關聯子查詢是之前我尤其疑惑的,不明白為什麼子查詢裡的條件會對外部查詢起作用,這次去查了下發現,雖然關聯條件寫在子查詢裡,但對外部查詢也起作用,相當于分組後每組的資料運作一次,原理詳見:

參考:https://www.cnblogs.com/heenhui2016/p/10574695.html
使用場景:在每個組裡進行比較時使用關聯子查詢
常用函數彙總
基本函數count,sum,avg,min,max
算術函數-
-
- 四舍五入:round(數值,保留小數位數)
- 絕對值:abs(數值)
- 求餘數:mod(被除數,除數)
-
-
-
- 字元串長度:length(字元串)
- 大小寫轉換:lower(),upper()
- 字元串拼接:concat(字元串1,字元串2)
- 字元串替換:replace(字元串,被替換字元串,用什麼字元串替換)
- 字元串截取:substring(字元串,截取起始位置,截取長度)
-
-
-
- 目前日期:current_date
- 目前時間:current_time
- 目前日期和時間:current_timestamp
- 擷取日期的年月日:year(日期),month(日期),day(日期)
- 日期對應星期幾:dayname(日期)
-
子查詢練習
練習網站:sqlzoo
world表格
思路:子查詢篩選出俄羅斯人口。外部查詢篩選出大于俄羅斯人口的國家
思路:子查詢篩選出英國人均gdp。外部查詢用where和标量子查詢篩選人均gdp和歐洲
思路:考察子查詢中in的用法
思路:考察标量子查詢的用法,和比較運算符相結合
思路:考察标量子查詢在select子句中的使用,以及concat,round函數
思路:運用子查詢中的all,同時注意存在null值時需要對資料進行篩選,因為null不參與計算
思路:運用關聯子查詢和all
思路:關聯子查詢,比較name的先後用<=all
思路:排除擁有大于25000000人口國家的洲
思路:運用子查詢中的all,關聯子查詢同時注意排除自身