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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL面试50题

發布時間:2025/4/5 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL面试50题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1.查詢課程編號為“01”的課程比“02”的課程成績高的所有學生的學號(重點) SELECT a.s_id,a.s_score FROM (SELECT * FROM score WHERE c_id='01') as a INNER JOIN (SELECT * FROM score WHERE c_id='02') as b on a.s_id=b.s_id WHERE a.s_score>b.s_score; View Code 15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績(重點) SELECT a.s_id,a.s_name,avg(s_score) FROM student as a INNER JOIN score as b ON a.s_id=b.s_idWHERE a.s_id IN( SELECT s_id FROM score WHERE s_score<60 GROUP BY s_id HAVING COUNT(DISTINCT c_id)>=2) GROUP BY a.s_id,s_name View Code 16、檢索"01"課程分數小于60,按分數降序排列的學生信息 # 方法一:個人 SELECT * FROM student INNER JOIN (SELECT s_id,s_score FROM score WHERE c_id=01 AND s_score<60) as t on student.s_id=t.s_id ORDER BY s_score DESC;# 方法二:個人 SELECT * FROM student INNER JOIN score ON student.s_id=score.s_idWHERE s_score<60 AND c_id=01 ORDER BY s_score DESC;# 方法三: SELECT * FROM student as t INNER JOIN score as s on t.s_id=s.s_id WHERE s.c_id=01 AND s.s_score<60 ORDER BY s.s_score DESC ; View Code

?17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績(重重點與35一樣)

SELECT s_id "學號", max(CASE WHEN c_id=01 THEN s_score ELSE NULL END ) "語文", max(CASE WHEN c_id=02 THEN s_score ELSE NULL END ) "數學", max(CASE WHEN c_id=03 THEN s_score ELSE NULL END ) "英語", avg(s_score) "平均成績" FROM score GROUP BY s_id ORDER BY avg(s_score) DESC View Code

18.查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率

SELECT s.c_id "課程ID",c.c_name "課程名字", max(s.s_score) "最高分", min(s.s_score)"最低分", avg(s.s_score)"平均分", sum(CASE WHEN s.s_score>=60 THEN 1 ELSE 0 END )/count(s_id) "及格", sum(CASE WHEN s.s_score>=70 AND s.s_score<80 THEN 1 ELSE 0 END )/count(s_id) "中等", sum(CASE WHEN s.s_score>=80 AND s.s_score<90 THEN 1 ELSE 0 END )/count(s_id)"優良", sum(CASE WHEN s.s_score>=90 THEN 1 ELSE 0 END )/count(s_id) "優秀" FROM course AS c INNER JOIN score as s ON c.c_id=s.c_id GROUP BY c.c_id View Code SELECT c_id,avg(CASE WHEN s_score >= 0 AND s_score < 60 THEN 1.0 ELSE 0.0 END) "及格率",avg(CASE WHEN s_score >= 60 AND s_score < 70 THEN 1.0 ELSE 0.0 END) "中等率",avg(CASE WHEN s_score >= 70 AND s_score < 85 THEN 1.0 ELSE 0.0 END) "良好率",avg(CASE WHEN s_score >= 85 AND s_score < 100 THEN 1.0 ELSE 0.0 END) "優秀率" FROM score GROUP BY c_id; View Code

19、按各科成績進行排序,并顯示排名(重點row_number)

窗口函數可以進行排序,生成序列號等一般的聚合函數無法實現的高級操作。

窗口函數大體可以分為以下兩種:

1.能夠作為窗口函數的聚合函數(sum,avg,count,max,min)

2.rank,dense_rank,row_number等專用窗口函數。

語法的基本使用方法:使用rank函數

rank函數是用來計算記錄排序的函數
https://blog.csdn.net/qq_41805514/article/details/81772182

專用函數的種類:1.rank函數:計算排序時,如果存在相同位次的記錄,則會跳過之后的位次。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.dense_rank函數:同樣是計算排序,即使存在相同位次的記錄,也不會跳過之后的位次。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3.row_number函數:賦予唯一的連續位次。

??23、使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分數段人數:課程ID和課程名稱(重點和18題類似)

SELECT c.c_id "課程ID",c_name "課程名字", sum(CASE WHEN s_score<=100 and s_score>85 THEN 1 ELSE 0 END ) AS "[100,85]", sum(CASE WHEN s_score<=85 and s_score>70 THEN 1 ELSE 0 END ) "[85,70]", sum(CASE WHEN s_score<=70 and s_score>60 THEN 1 ELSE 0 END )"[70,60]", sum(CASE WHEN s_score<=60 THEN 1 ELSE 0 END )"<60"FROM score as s INNER JOIN course as c on s.c_id=c.c_id GROUP BY c.c_id,c.c_name; View Code SELECT c.c_id "課程ID",c_name "課程名字", count(CASE WHEN s_score<=100 and s_score>85 THEN 1 ELSE NULL END ) AS "[100,85]", count(CASE WHEN s_score<=85 and s_score>70 THEN 1 ELSE NULL END ) "[85,70]", count(CASE WHEN s_score<=70 and s_score>60 THEN 1 ELSE NULL END )"[70,60]", count(CASE WHEN s_score<=60 THEN 1 ELSE NULL END )"<60"FROM score as s INNER JOIN course as c on s.c_id=c.c_id GROUP BY c.c_id,c.c_name; View Code 24、查詢學生平均成績及其名次(同19題,重點) SELECT s_id,avg(s_score),rank() OVER (ORDER BY avg(s_score)) as ranking FROM score group by s_id# 不可加partition by,需使用group by View Code 25、查詢各科成績前三名的記錄(不考慮成績并列情況)(重點 與22題類似) 26、查詢每門課程被選修的學生數(不重點) 26、查詢每門課程被選修的學生數(不重點) SELECT c_name,COUNT(c.c_id) FROM score as s INNER JOIN course as c on s.c_id=c.c_id GROUP BY c_name;# 注:一般需要將select后的字段放在group by后面SELECT c.c_id,c.c_name,count(DISTINCT s.s_id) AS "數量" FROM score as s INNER JOIN course as c on s.c_id=c.c_id GROUP BY c.c_id,c.c_name; View Code 27、 查詢出只有兩門課程的全部學生的學號和姓名(不重點) # 方法一: SELECT s.s_id,s.s_name FROM student AS s INNER JOINscore as sc on s.s_id=sc.s_id GROUP BY s.s_id HAVING count(DISTINCT c_id)=2;# 錯誤 SELECT s.s_name,s.s_id FROM student AS s INNER JOINscore as sc on s.s_id=sc.s_id WHERE count(DISTINCT c_id)=2;# 方法二: SELECT s_id,s_name FROM student WHERE s_id in(SELECT s_id FROM score GROUP BY s_idHAVING count(DISTINCT c_id)=2); View Code 28、查詢男生、女生人數(不重點) # 方法一: SELECT s_sex,count(s_sex) FROM student GROUP BY s_sex; # 方法二: SELECT sum(CASE WHEN s_sex='男' THEN 1 ELSE 0 END ) "男生人數", sum(CASE WHEN s_sex='女' THEN 1 ELSE 0 END ) "女生人數" FROM student # 方法三: SELECT count(CASE WHEN s_sex='男' THEN 1 ELSE NULL END ) "男生人數", count(CASE WHEN s_sex='女' THEN 1 ELSE NULL END ) "女生人數" FROM student# 注:null對count來說是不計算個數的,所以后面不能寫0,只能用null View Code 35、查詢所有學生的課程及分數情況(重點) # 不對 SELECT s.s_id,s.s_name,c.c_name,sc.s_score FROM student as s INNER JOIN score as sc ON s.s_id=sc.s_id INNER JOIN course as c ON c.c_id=sc.c_id GROUP BY s.s_id,s.s_name# 正確做法:(行轉列) SELECT s.s_id,s.s_name, max(CASE WHEN c.c_name="語文" THEN s_score ELSE NULL END ) AS "語文", max(CASE WHEN c.c_name="數學" THEN s_score ELSE NULL END ) AS "數學", max(CASE WHEN c.c_name="英語" THEN s_score ELSE NULL END ) AS "英語" FROM student as s LEFT JOIN score as sc ON s.s_id=sc.s_id LEFT JOIN course as c ON c.c_id=sc.c_id GROUP BY s.s_id,s.s_name View Code

?

?36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數(重點)

# 錯誤處理方法: SELECT s.s_name,c.c_name,sc.s_score FROM student as s INNER JOIN score as sc on s.s_id=sc.s_id INNER JOIN course AS c ON c.c_id=sc.c_id GROUP BY s.s_id HAVING sc.s_score>70;# 正確處理方法: SELECT s.s_name,c.c_name,sc.s_score FROM student as s INNER JOIN score as sc on s.s_id=sc.s_id INNER JOIN course AS c ON c.c_id=sc.c_id WHERE sc.s_score>70; # 注:where 后面要跟的是數據表里的字段,where針對數據庫文件的發揮作用, # 而having只是根據前面查詢出來的結果集再次進行查詢,因此having是針對結果集發揮作用。 View Code 40、查詢選修“張三”老師所授課程的學生中成績最高的學生姓名及其成績(重要top) ? SELECT s.s_id,s.s_name,c.c_name,c.c_id,sc.s_score FROM student as s INNER JOIN score as sc ON s.s_id=sc.s_id INNER JOIN course as c ON sc.c_id=c.c_id INNER JOIN teacher as t ON t.t_id=c.t_id WHERE t.t_name="張三" ORDER BY sc.s_score DESC limit 0,1; # 0表示從0開始取,若為降序排列則0是第一位,1表示取幾條# SQL SERVER 中用top /* SELECT top 1 s.s_id,s.s_name,c.c_name,c.c_id FROM student as s INNER JOIN score as sc ON s.s_id=sc.s_id INNER JOIN course as c ON sc.c_id=c.c_id INNER JOIN teacher as t ON t.t_id=c.t_id WHERE t.t_name="張三" ORDER BY DESC */ View Code

總結

以上是生活随笔為你收集整理的SQL面试50题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。