写一个sql实现以下查询结果_SQL复杂查询—知识点梳理(四)
SQL復(fù)雜查詢學(xué)習(xí)大綱
一、視圖
1.1 什么是視圖
在數(shù)據(jù)庫里有很多表,表里存放的是實際數(shù)據(jù),而視圖中存放的是SQL查詢語句。當我們通過客戶端連接到數(shù)據(jù)庫,開始使用視圖時,視圖會先運行里面的SQL查詢語句,從表里查找出數(shù)據(jù)保存到一張臨時表中(當客戶端斷開與數(shù)據(jù)庫的連接,這張表會自動刪除,不是保存在數(shù)據(jù)庫里的表,因此是臨時表)。因此視圖本身不存放數(shù)據(jù),存放的是SQL查詢語句。
- 創(chuàng)建視圖
創(chuàng)建視圖的SQL語句:create view ... as ...<select查詢語句> ;
create view表示創(chuàng)建視圖
查詢語句列的順序要和視圖名稱括號里列的順序要一一對應(yīng)。如下圖,新建視圖“按性別匯總”,SQL查詢語句寫在as之后,查詢語句的列和視圖名稱括號里的列名稱可以不同,但他們的關(guān)系是一一對應(yīng)的。
- 創(chuàng)建視圖步驟
寫好創(chuàng)建視圖的SQL語句并運行—右擊左側(cè)“視圖”—刷新
1.2 如何使用視圖
用視圖名稱代替表名。表中的數(shù)據(jù)更新時,視圖也會隨之更新。
- 刪除視圖步驟
選中要刪除的視圖名稱右擊—“刪除視圖”
1.3 視圖有什么用
作用1:需要頻繁使用的SQL語句可以保存成視圖,不需要每次都重新輸入一遍。特別是在龐大的復(fù)雜查詢語句中,使用視圖可以提高效率。
作用2:視圖中的數(shù)據(jù)會隨著原表的變化自動更新,可以保證數(shù)據(jù)的最新狀態(tài)
作用3:視圖不需要保存數(shù)據(jù),可以節(jié)省存放數(shù)據(jù)設(shè)備的空間
1.4 注意事項
1)避免在已創(chuàng)建視圖的基礎(chǔ)上再創(chuàng)建視圖,多重視圖會降低SQL的性能和效率
2)不能往視圖里插入數(shù)據(jù),否則會報錯
二、子查詢
之前學(xué)習(xí)的查詢條件都是具體的數(shù)值,如“學(xué)習(xí)成績大于60分”,但如果查詢條件需要從表中獲取,如“成績大于平均成績的學(xué)生有哪些?”,這就需要用到子查詢。
2.1 什么是子查詢
子查詢就是一次性視圖。在SQL查詢子句中,直接寫定義視圖的SQL查詢語句,即在一個select查詢語句中嵌入另一個select查詢語句。下圖中的“按性別匯總”就是子查詢的名稱,由于該名稱是一次性的,不會像視圖名稱一樣保存在數(shù)據(jù)庫的硬盤中,在SQL查詢語句運行結(jié)束后就會消失,所以可以看成臨時表。
SQL運行順序——先運行子查詢,將子查詢的結(jié)果作為外部查詢的一部分,再運行外部的查詢語句
2.2 如何使用子查詢
子查詢除了放在form子句里,還可以放在where子句里,與運算符in、any、all一起使用,從而構(gòu)建出復(fù)雜的查詢條件。使用方法是在運算符in、any、all的括號里放入子查詢。
錯誤示例——查詢每門課程里成績最低的學(xué)號
正確示例——查詢每門課程里成績最低的學(xué)號
any和all
any、all關(guān)鍵字必須與一個比較運算符一起使用
any等同于some,用法相同
案例1—any的用法
案例2—all的用法
2.3 子查詢有什么用
2.4 注意事項
1)雖然在數(shù)學(xué)上a>3*all(b)等價于a/3>all(b),但是在數(shù)據(jù)庫里all代表的不是一個數(shù)字而是一個集合即得到的是N行數(shù)據(jù),因此不能寫成3*all(b)的形式
2)避免使用多層嵌套子查詢。因為子查詢的層數(shù)沒有限制,隨著子查詢層數(shù)越來越多,SQL語句越來越復(fù)雜,性能變差并且不好維護。
3)as關(guān)鍵字及子查詢名稱可以省略。盡量不要省略更有利于讀懂。
SQL運行順序
三、標量子查
什么是標量子查詢
由于在where子句中不能使用匯總函數(shù),因此報錯,此時可以使用標量子查詢
子查詢可以返回一行或多行數(shù)據(jù),標量子查詢就是在子查詢的基礎(chǔ)上做了特殊限制,必須且只能返回一行一列的查詢結(jié)果,即返回的是單一的值。如下圖返回的只有一行一列即平均成績這個單一值,它是一個標量子查詢。或者查詢的是表中某一行某一列的值,返回的也是單一的值,因此標量子查詢可以和比較運算符一起使用
案例
如何使用標量子查詢
標量子查詢的書寫位置并不僅僅局限于where子句,通常任何使用單一值的地方都可以使用標量子查詢
標量子查詢有什么用
可以和比較運算符及between、in、or等關(guān)鍵字一起使用實現(xiàn)復(fù)雜的查詢條件
注意事項
該子查詢不能返回多行結(jié)果,如果返回多行結(jié)果那就不再是標量子查詢而是普通子查詢,因此也不能用在比較運算符中
四、關(guān)聯(lián)子查詢
什么是關(guān)聯(lián)子查詢及如何使用關(guān)聯(lián)子查詢
可以依據(jù)子查詢是否執(zhí)行多次,從而將子查詢劃分為關(guān)聯(lián)子查詢和非關(guān)聯(lián)子查詢
按課程號分組后得到每門課程的平均成績,要查找出每門課程大于對應(yīng)課程平均成績的學(xué)生,需要在每個組里而不是整個表中進行比較,此時就需要用到關(guān)聯(lián)子查詢
這里起到關(guān)鍵作用的就是關(guān)聯(lián)條件。在子查詢里有個where子句的條件,意思是按課程號對成績表進行分組,同一組里的數(shù)據(jù)和這一組的平均成績進行比較,由于作為比較對象的都是同一張表score,為了更好區(qū)分,此處使用s1、s2兩個別名。在使用關(guān)聯(lián)子查詢時,需要使用如下圖紅框中表的別名來表示表的列名。
關(guān)聯(lián)條件一定要寫在子查詢里。在下圖例子中,表別名s2只在子查詢中有效,因此表別名s2能看到表別名s1,表別名s1看不到表別名s2
關(guān)聯(lián)子查詢有什么用
當每個組里進行比較時使用關(guān)聯(lián)子查詢,關(guān)聯(lián)子查詢是在子查詢里有了一個關(guān)聯(lián)條件
五、用SQL解決業(yè)務(wù)問題
案例
看懂SQL報錯信息
使用排除法逐一查找錯誤之處。如下圖出現(xiàn)報錯,可以先選中子查詢檢查是否出現(xiàn)報錯,若子查詢出現(xiàn)報錯則說明問題出在子查詢中;若子查詢運行正常則說明問題出在子查詢外部。
六、各種函數(shù)
七、補充知識
concat函數(shù)及round函數(shù)
concat函數(shù)為字符串連接函數(shù)
round函數(shù)用于把數(shù)值字段四舍五入為指定的小數(shù)位數(shù),用法:round(數(shù)值,返回的小數(shù)位數(shù))
非null值的表現(xiàn)形式
關(guān)聯(lián)子查詢(關(guān)聯(lián)子查詢里的group by可以省略)
案例一
案例二
案例三
案例四
topN問題
- 分組取每組最大值
- 分組取每組最小值
- 每組最大的N條記錄
八、練習(xí)
Chestnut-J:SQL復(fù)雜查詢—練習(xí)(四)?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的写一个sql实现以下查询结果_SQL复杂查询—知识点梳理(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不一样 使用别名 数据字段和bean_【
- 下一篇: linux cmake编译源码,linu