sql嵌套查询返回多个字段_list4 SQL复杂查询
生活随笔
收集整理的這篇文章主要介紹了
sql嵌套查询返回多个字段_list4 SQL复杂查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
子查詢返回結果形式不同:
標量子查詢(結果集只有一行一列)列子查詢(結果集只有一列多行)
行子查詢(結果集有一行多列)
表子查詢(結果集一般為多行多列)
子查詢在主查詢中出現的位置不同:
select后面:僅僅支持標量子查詢
from后面:
支持表子查詢
where或having后面:★
標量子查詢(單行) √
列子查詢 (多行) √
行子查詢
exists后面(相關子查詢)
表子查詢
子查詢和操作符:
單行操作符<,>,=,<=,>=,<>和標量子查詢一起使用;any,all,in,not in和列子查詢一起使用,=any形式也可;
SELECT查詢養成去重的習慣SELECT distinct;
視圖和子查詢
視圖和子查詢是SQL查詢語句中功能性和靈活性更強的語句,可以理解成小模塊。那么,學習這種具有獨立功能的模塊,應該做到以下幾點——是什么。如何使用。為什么用。注意事項。舉例說明。
子查詢涉及到更多的條件,條件之間彼此牽連,難在分析清楚條件中內含的嵌套邏輯。
這一部分進階促使我意識到復雜SQL查詢需要更多的實戰和練習,才能加深理解,提高熟練度,要結合更多的案例才有可能駕輕就熟。
主要包括視圖,子查詢,使用它們解決問題的思路,常用函數
一、視圖(視圖很像origin里的模板,科研狗的胡言亂語.....)
- 視圖不存放實際數據,存放的是sql語句,能夠創建一個新的臨時表;
- 創建視圖時,視圖列名的順序應該和查詢語句中的列的順序對應;
練習
#創建視圖,按性別匯總人數
- 使用視圖時,查詢語句的字段名應該使用創建視圖時用的視圖列名。
練習
#使用視圖,使用“按性別匯總”視圖匯總各性別的人數
注意事項:
避免多個視圖嵌套,會影響SQL的性能;視圖中不能插入數據;
子查詢
- 在from子句中直接寫定義視圖的sql查詢語句,就形成了一個創建臨時表子查詢;
- 執行sql語句時,先運行內部sql子查詢語句,在運行外部sql查詢語句;
- 子查詢可以放在from子句中,也可以放在where子句中,視具體情況而定;
練習
#使用子查詢按性別匯總人數
- 使用子查詢時常常和in,all,any結合使用,....in(子查詢);....all(子查詢);....any(子查詢);.....between(子查詢) and(子查詢);
練習1
#找出每個課程里成績最低的學號,思路:1、按課程分組找到各自最低成績;2、查詢組內最低成績的學號,組內比較;(這是個關聯子查詢)
第一次查詢報錯,提示該子查詢中應該只包含一列;粗心多寫了課程號,顯然in不能這么用,其本質是等值判斷;修改后,查詢正常運行,但是查詢結果不正確,課程&amp;amp;amp;amp;#39;0002&amp;amp;amp;amp;#39;出現60和80兩個成績,該查詢結果是“查詢哪些學生的成績與各課程最低成績里任意一個相同”;更正如下:
其中,&amp;amp;amp;amp;#39;in&amp;amp;amp;amp;#39;也可以替換為&amp;amp;amp;amp;#39;=&amp;amp;amp;amp;#39;來判斷;練習2、3
#查詢哪些學生的成績比課程0002的全部成績里的任意一個高,思路分兩步:
子查詢中的最低成績是60#查詢哪些學生的成績比課程0002的全部成績都高,思路分兩步:
子查詢中最高成績為90注意事項:
- all,any(結果)中是集合,要避免算術運算誤用;
- 子查詢和視圖一樣避免嵌套,影響性能又難于理解;可以使用as為子查詢命名;
包含子查詢的SQL語句的運行順序:
標量子查詢——是指只返回一個值的子查詢,可作為單獨的一個結果使用。
- 它可能會用到分組函數,比如使用avg函數,但用了分組函數的子查詢未必就是標量子查詢,因為分組后可能有多個結果。
練習
#大于平均成績的學生的學號和成績
#成績位于差生<=60和優等生>80成績之間的學生的學號和成績
注意事項:
- 標量子查詢僅僅返回一個結果,所以不能錯誤的把分組函數和group by結合起來一起使用。
關聯子查詢——關聯子查詢有一點繞人,結合sql語句的執行順序和底層指令來理解
- 前面提到標量子查詢返回單一值;若是需要多個組里的內容自行比較,則需要分成多個組,而組內又需要單一值來實現算術比較時——這時即用到關聯子查詢。
練習
#查找每個課程中大于對應課程平均成績的學生
因為之前通讀過必知必會,此處乍一看關聯子查詢很像表的自連接,但是兩者并不相同,自連接是為了避免歧義導致SQL解析出錯;關聯條件實際上是通過外內表的關聯對內表列值進行過濾。
個人理解為,SQL進行列值比對時并不是各行同時進行比對,舉個例子:(以下圖為例)
s1.課程號的第一行'0001'逐一與s2.課程號的每一行進行匹配,并返回相匹配的行們,隨后接著向下執行group by子句等;s1.課程號的第二行'0002'逐一與s2.課程號的每一行進行匹配,并返回相匹配的行們,隨后接著向下執行group by子句等;
..........由此每次子查詢每次只返回單一值,與外部表相應列值進行比較。
- 該關聯條件每次篩選出和s1中某一行課程號同一組的課程號,因此子查詢只返回某一組相同課程號的一個平均成績。這個某一組就是由關聯條件限定出來的———這個where子句的機制,正是體現了1、SQL的語句執行順序;2、SQL中表之間過濾數據時怎么工作的;
- 上面例子中的關聯子查詢group by去掉也不影響查詢結果,group by使語句更規范更易于理解。它是一個內外分開執行的過程,類似for語句的嵌套循環,豁然開朗。
視圖、子查詢關系圖
常用函數——(SQL中很多函數可以在需要時搜索使用)
SQL ZOO練習
- 因為sql語句的豐富性,同樣的要求往往可以使用不同的思路解決。不同子句,異曲同工。
總結
以上是生活随笔為你收集整理的sql嵌套查询返回多个字段_list4 SQL复杂查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot 压测 50并发 线
- 下一篇: sql三张表的搜索要满足5种搜索条件的模