日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sql where中用case_从零学会SQL:求职面试题(汇总)

發(fā)布時間:2024/10/5 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql where中用case_从零学会SQL:求职面试题(汇总) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目的數(shù)據(jù)表來自前面系列文章教程創(chuàng)建的4個表:學(xué)生表、成績表、課程表、教師表。

一、簡單查詢

1. 查詢姓“猴”的學(xué)生名單

2. 查詢姓名中最后一個字是“猴”的學(xué)生名單

3. 查詢姓名中帶“猴”的學(xué)生名單

4. 查詢姓“孟”老師的個數(shù)

二、匯總分析

  • 查詢課程編號為“0002”的總成績
  • 2. 查詢選了課程的學(xué)生人數(shù)


    分組:

  • 查詢各科成績最高和最低的分, 以如下的形式顯示:課程號,最高分,最低分
  • 2. 查詢每門課程被選修的學(xué)生數(shù)

    3. 查詢男生、女生人數(shù)


    分組結(jié)果的條件:

  • 查詢平均成績大于60分學(xué)生的學(xué)號和平均成績
  • 查詢至少選修兩門課程的學(xué)生學(xué)號
  • 查詢同名同姓學(xué)生名單并統(tǒng)計同名人數(shù)
  • 查詢不及格的課程并按課程號從大到小排列
  • 查詢每門課程的平均成績,結(jié)果按平均成績升序排序,平均成績相同時,按課程號降序排列
  • 檢索課程號為“0004”且分?jǐn)?shù)小于60的學(xué)生學(xué)號,結(jié)果按按分?jǐn)?shù)降序排列
  • 統(tǒng)計每門課程的學(xué)生選修人數(shù)(超過2人的課程才統(tǒng)計)
  • 要求輸出課程號和選修人數(shù),查詢結(jié)果按人數(shù)降序排序,若人數(shù)相同,按課程號升序排序

    8. 查詢兩門以上不及格課程的同學(xué)的學(xué)號及其“不及格課程”平均成績

    三、復(fù)雜查詢

  • 查詢所有課程成績小于60分學(xué)生的學(xué)號、姓名
  • 方法1:子查詢

    方法2:多表查詢

    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é)生選修該課程取得的成績):

    • 分組取每組最大值
    案例:按課程號分組取成績最大值所在行的數(shù)據(jù)

    子查詢結(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個。

    • 分組取每組最小值
    案例:按課程號分組取成績最小值所在行的數(shù)據(jù)


    同樣的使用關(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ù)再介紹。

    四、多表查詢

  • 查詢所有學(xué)生的學(xué)號、姓名、選課數(shù)、總成績
  • 2. 查詢平均成績大于85的所有學(xué)生的學(xué)號、姓名和平均成績

    3. 查詢學(xué)生的選課情況:學(xué)號,姓名,課程號,課程名稱

    左聯(lián)結(jié)(left join)

    內(nèi)聯(lián)結(jié)(inner join)

    【case表達(dá)式】:

  • 查詢出每門課程的及格人數(shù)和不及格人數(shù)
  • 解法 1因為輸出結(jié)果包含“課程名稱”列,所以牽涉到score和course兩張表。需要用到“聯(lián)結(jié)”。

    解法 2因為輸出結(jié)果不包含“課程名稱”列,只牽涉到score一張表,不需要用到“聯(lián)結(jié)”。

    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.com

    SQL語句執(zhí)行順序

    總結(jié)

    以上是生活随笔為你收集整理的sql where中用case_从零学会SQL:求职面试题(汇总)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。