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