sql where中用case_从零学会SQL:求职面试题(汇总)
一、簡單查詢
1. 查詢姓“猴”的學(xué)生名單
2. 查詢姓名中最后一個字是“猴”的學(xué)生名單
3. 查詢姓名中帶“猴”的學(xué)生名單
4. 查詢姓“孟”老師的個數(shù)
二、匯總分析
2. 查詢選了課程的學(xué)生人數(shù)
分組:
2. 查詢每門課程被選修的學(xué)生數(shù)
3. 查詢男生、女生人數(shù)
分組結(jié)果的條件:
8. 查詢兩門以上不及格課程的同學(xué)的學(xué)號及其“不及格課程”平均成績
三、復(fù)雜查詢
2. 查詢沒有學(xué)全所有課的學(xué)生的學(xué)號、姓名
條件:沒有學(xué)全所有課,也就是該學(xué)生選修的課程數(shù) ? 總的課程數(shù)。解法1:用到了兩個子查詢解法2:用到了一個左聯(lián)結(jié)和一個子查詢解法1不對,因為沒把學(xué)號為0004的王思聰考慮進(jìn)去,王思聰選了門課程也是符合題意“沒有學(xué)全所有課”的。所以,解法2才是正確的。子查詢和聯(lián)結(jié)(join)都可以實現(xiàn)兩張表之間的連接,但之間的包含又有所不同,需要好好理解體會。(比如此題,student和score表,對于“學(xué)號”這一列,子查詢<解法1的第一個子查詢>不包括“0004 王思聰”;而左聯(lián)結(jié) left join 以student表為主表,把“0004王思聰”考慮進(jìn)去)
3. 查詢出只選修了兩門課程的全部學(xué)生的學(xué)號和姓名
4. 1990年出生的學(xué)生名單
【面試題類型】top N問題
工作中會經(jīng)常遇到這樣的業(yè)務(wù)問題:① 如何找到每個類別下用戶最喜歡的產(chǎn)品是哪個?
② 如果找到每個類別下用戶點擊最多的5個商品是什么?
這類問題其實就是常見的:分組取每組最大值、最小值,每組最大的N條(top N)記錄。
面對該類問題,如何解決呢?下面我們通過成績表的例子來給出答案。成績表是學(xué)生的成績,里面有學(xué)號(學(xué)生的學(xué)號),課程號(學(xué)生選修課程的課程號),成績(學(xué)生選修該課程取得的成績):
- 分組取每組最大值
子查詢結(jié)果多于1行,報錯使用“關(guān)聯(lián)子查詢”來解決
我們可以使用分組(group by)和匯總函數(shù)得到每個組里的一個值(最大值,最小值,平均值等)。但是無法得到成績最大值所在行的數(shù)據(jù)。
select 課程號,max(成績) as 最大成績 from score group by 課程號;我們可以使用關(guān)聯(lián)子查詢來實現(xiàn):
select * from score as a where 成績 = ( select max(成績) from score as b where b.課程號 = a.課程號);上面查詢結(jié)果課程號“0001”有2行數(shù)據(jù),是因為最大成績80有2個。
- 分組取每組最小值
同樣的使用關(guān)聯(lián)子查詢來實現(xiàn)
select * from score as a where 成績 = ( select min(成績) from score as b where b.課程號 = a.課程號);- 每組最大的N條記錄
使用union all 將每組選出的數(shù)據(jù)合并到一起注:圖中的3對()不能省略。(綠色箭頭所示)
第1步,查出有哪些組
我們可以按課程號分組,查詢出有哪些組,對應(yīng)這個問題里就是有哪些課程號。select 課程號,max(成績) as 最大成績 from score group by 課程號;第2步:先使用order by子句按成績降序排序(desc),然后使用limt子句返回topN(對應(yīng)這個問題返回的成績前兩名)
-- 課程號'0001' 這一組里成績前2名 select * from score where 課程號 = '0001' order by 成績 desc limit 2;同樣的,可以寫出其他組的(其他課程號)取出成績前2名的sql。
第3步:使用union all 將每組選出的數(shù)據(jù)合并到一起
(select * from score where 課程號 = '0001' order by 成績 desc limit 2) union all (select * from score where 課程號 = '0002' order by 成績 desc limit 2) union all (select * from score where 課程號 = '0003' order by 成績 desc limit 2);前面我們使用order by子句按某個列降序排序(desc)得到的是每組最大的N個記錄。
如果想要達(dá)到每組最小的N個記錄,將order by子句按某個列升序排序(asc)即可。
求topN的問題還可以使用自定義變量來實現(xiàn),這個在后續(xù)再介紹。四、多表查詢
2. 查詢平均成績大于85的所有學(xué)生的學(xué)號、姓名和平均成績
3. 查詢學(xué)生的選課情況:學(xué)號,姓名,課程號,課程名稱
左聯(lián)結(jié)(left join)內(nèi)聯(lián)結(jié)(inner join)【case表達(dá)式】:
2. 使用分段[100-85],[85-70],[70-60],[?60]來統(tǒng)計各科成績,分別統(tǒng)計:各分?jǐn)?shù)段人數(shù),課程號和課程名稱
注意:成績的分段區(qū)間兩側(cè)需要加上單引號‘’3. 查詢課程號為0003且課程成績在80分以上的學(xué)生的學(xué)號和姓名
where子句用于篩選數(shù)據(jù),having是分組以后才使用,對分組(group by)結(jié)果的數(shù)據(jù)進(jìn)行篩選,兩者的使用目的不一樣。一般來說,having子句是配合group by使用的。
如果不使用 GROUP BY 子句,則 HAVING 的行為與 WHERE 子句一樣。
where中不能使用聚合函數(shù)(sum,min,max,avg,count);在having中可以使用聚合函數(shù)。
五、行列互換
下面是學(xué)生的成績表(表名score,列名:學(xué)號、課程號、成績)
使用sql實現(xiàn)將該表行轉(zhuǎn)列為下面的表結(jié)構(gòu):
【面試題類型總結(jié)】這類題目屬于行列如何互換,解題思路如下:
【解答】
1)第1步,使用常量列輸出目標(biāo)表的結(jié)構(gòu)
可以看到查詢結(jié)果已經(jīng)和目標(biāo)表非常接近了select 學(xué)號,'課程號0001','課程號0002','課程號0003' from score;2)第2步,使用case表達(dá)式,替換常量列為對應(yīng)的成績
select 學(xué)號, (case 課程號 when '0001' then 成績 else 0 end) as '課程號0001', (case 課程號 when '0002' then 成績 else 0 end) as '課程號0002', (case 課程號 when '0003' then 成績 else 0 end) as '課程號0003' from score;在這個查詢結(jié)果中,每一行表示了某個學(xué)生某一門課程的成績。比如第一行是'學(xué)號0001'選修'課程號
00001'的成績,而其他兩列的'課程號0002'和'課程號0003'成績?yōu)?。
每個學(xué)生選修某門課程的成績在下圖的每個方塊內(nèi)。我們可以通過分組,取出每門課程的成績。3)第3步,分組
分組,并使用最大值函數(shù)max取出上圖每個方塊里的最大值select 學(xué)號, max(case 課程號 when '0001' then 成績 else 0 end) as '課程號0001', max(case 課程號 when '0002' then 成績 else 0 end) as '課程號0002', max(case 課程號 when '0003' then 成績 else 0 end) as '課程號0003' from score group by 學(xué)號;這樣我們就得到了目標(biāo)表(行列互換):
附【前面的SQL系列文章】:
① 從零學(xué)會SQL:入門(實操演示):
黃綠橙:從零學(xué)會SQL:入門(實操演示)?zhuanlan.zhihu.com② 從零學(xué)會SQL:簡單查詢(實操演示):
黃綠橙:從零學(xué)會SQL:簡單查詢(實操演示)?zhuanlan.zhihu.com③ 從零學(xué)會SQL:匯總分析(實操演示):
黃綠橙:從零學(xué)會SQL:匯總分析(實操演示)?zhuanlan.zhihu.com④ 從零學(xué)會SQL:復(fù)雜查詢(實操演示):
黃綠橙:從零學(xué)會SQL:復(fù)雜查詢(實操演示)?zhuanlan.zhihu.com⑤ 從零學(xué)會SQL:多表查詢(實操演示):
黃綠橙:從零學(xué)會SQL:多表查詢(實操演示)?zhuanlan.zhihu.comSQL語句執(zhí)行順序
總結(jié)
以上是生活随笔為你收集整理的sql where中用case_从零学会SQL:求职面试题(汇总)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos 上传jar 命令_cent
- 下一篇: 18款帝豪gl车机升级_好看又实用的20