SQL經典面試50題
非標准答案,SQL語句歡迎留言討論
40題按年份計算年齡,42題跨年查詢暫未解決,有寫出來的朋友還請賜教!!
表結構
學生表 Student(SId,Sname,Sage,Ssex) -- SId 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別
課程表 Course(CId,Cname,TId) -- CId 課程編號,Cname 課程名稱,TId 教師編號
教師表 Teacher(TId,Tname) -- TId 教師編號,Tname 教師姓名
成績表 SC(SId,CId,score) -- SId 學生編號,CId 課程編號,score 分數
SQL經典面試50題
- 查詢" 01 "課程比" 02 "課程成績高的學生的信息及課程分數
1.1 查詢同時存在" 01 "課程和" 02 "課程的情況
1.2 查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null )
1.3 查詢不存在" 01 "課程但存在" 02 "課程的情況
-
查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績
-
查詢在 SC 表存在成績的學生信息
-
查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績(沒成績的顯示為 null )
4.1 查有成績的學生信息
-
查詢「李」姓老師的數量
-
查詢學過「張三」老師授課的同學的信息
-
查詢沒有學全所有課程的同學的信息
-
查詢至少有一門課與學號為" 01 "的同學所學相同的同學的信息
-
查詢和" 01 "號的同學學習的課程 完全相同的其他同學的信息
-
查詢沒學過"張三"老師講授的任一門課程的學生姓名
-
查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
-
檢索" 01 "課程分數小於 60,按分數降序排列的學生信息
-
按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
-
查詢各科成績最高分、最低分和平均分:
以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
- 按各科成績進行排序,並顯示排名, Score 重復時保留名次空缺
15.1 按各科成績進行排序,並顯示排名, Score 重復時合並名次
- 查詢學生的總成績,並進行排名,總分重復時保留名次空缺
16.1 查詢學生的總成績,並進行排名,總分重復時不保留名次空缺
-
統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所占百分比
-
查詢各科成績前三名的記錄
-
查詢每門課程被選修的學生數
-
查詢出只選修兩門課程的學生學號和姓名
-
查詢男生、女生人數
-
查詢名字中含有「風」字的學生信息
-
查詢同名同性學生名單,並統計同名人數
-
查詢 1990 年出生的學生名單
-
查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
-
查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績
-
查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數
-
查詢所有學生的課程及分數情況(存在學生沒成績,沒選課的情況)
-
查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
-
查詢不及格的課程
-
查詢課程編號為 01 且課程成績在 80 分以上的學生的學號和姓名
-
求每門課程的學生人數
-
成績不重復,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
-
成績有重復的情況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
-
查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
-
查詢每門功成績最好的前兩名
-
統計每門課程的學生選修人數(超過 5 人的課程才統計)。
-
檢索至少選修兩門課程的學生學號
-
查詢選修了全部課程的學生信息
-
查詢各學生的年齡,只按年份來算
-
按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一
-
查詢本周過生日的學生
-
查詢下周過生日的學生
-
查詢本月過生日的學生
-
查詢下月過生日的學生
創建表&插入數據
#create CREATE TABLE student(sid VARCHAR(10),sname VARCHAR(10),sage datetime,ssex VARCHAR(10));#學生表 CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),tid VARCHAR(10));#科目表 CREATE TABLE teacher(tid VARCHAR(10),tname VARCHAR(10));#教師表 CREATE TABLE score(sid VARCHAR(10),cid VARCHAR(10),score DECIMAL(5,2));#成績表 #DECIMAL(5,2)規定了存儲的值將不會超過5位數字,開且小數點后面有2位數字。
注:未避免占用篇幅,測試數據插入放在文章最后
練習題(采用分步法)
1.查詢" 01 "課程比" 02 "課程成績高的學生的信息及課程分數
思路:①構建 學生編號+課程01成績+課程02成績 的表 ②根據查詢到的" 01 "課程比" 02 "課程成績高的學生ID查詢對應學生信息
-- ①構建 學生編號+課程01成績+課程02成績 的表 SELECT a.sid FROM (SELECT sid,cid,score FROM score WHERE cid='01') AS a INNER JOIN (SELECT sid,cid,score FROM score WHERE cid='02') AS b ON a.sid = b.sid WHERE a.score > b.score; -- ②查詢對應學生姓名及成績 SELECT a.sid,c.sname,c.ssex,c.sage,a.score as ascore,b.score as bscore FROM (SELECT sid,cid,score FROM score WHERE cid='01') AS a INNER JOIN (SELECT sid,cid,score FROM score WHERE cid='02') AS b ON a.sid = b.sid INNER JOIN student AS c ON c.sid = a.sid WHERE a.score > b.score;
查詢結果:
#查詢" 01 "課程比" 02 "課程成績高的學生的信息及課程分數 SELECT * FROM student RIGHT JOIN ( SELECT t1.sid,class1,class2 FROM (SELECT sid,score as class1 FROM Score WHERE Score.cid = '01')as t1, (SELECT sid,score as class2 FROM Score WHERE Score.cid = '02')as t2 WHERE t1.sid = t2.sid AND t1.class1 > t2.class2)r ON student.sid = r.sid; SELECT c.sid,c.sname,c.sage,c.ssex,s.score01,s.score02 FROM ( SELECT a.sid,a.score as score01,b.score as score02 FROM (SELECT sid,score FROM Score WHERE Score.cid = '01')as a, (SELECT sid,score FROM Score WHERE Score.cid = '02')as b WHERE a.sid = b.sid AND a.score > b.score) AS s LEFT JOIN student AS c ON c.sid = s.sid;
1.1 查詢同時存在" 01 "課程和" 02 "課程的情況
#查詢同時存在" 01 "課程和" 02 "課程的情況(字段去重及字段重命名只需將*替換為字段) SELECT * FROM (SELECT * FROM score WHERE cid = '01') AS a INNER JOIN (SELECT * FROM score WHERE cid = '02') AS b ON a.sid = b.sid;
1.2 查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null )
#查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null ),201921只有課程1無課程2 SELECT * FROM (SELECT * FROM score WHERE cid = '01') AS a LEFT JOIN (SELECT * FROM score WHERE cid = '02') AS b ON a.sid = b.sid;-- LEFT JOIN左連接查詢結果顯示左表中所有數據
1.3 查詢不存在" 01 "課程但存在" 02 "課程的情況
SELECT * FROM score sc WHERE sc.sid NOT IN (SELECT sid FROM score s2 WHERE s2.cid = '01') AND sc.cid = '02';-- 正確(5條記錄)
錯誤語句:
2.查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績
#①查詢平均分大於等於60 SELECT AVG(sc.score),sc.sid FROM score AS sc GROUP BY sc.sid HAVING AVG(sc.score)>=60; #②查詢學生信息 SELECT * FROM student s,(SELECT AVG(sc.score),sc.sid FROM score AS sc GROUP BY sc.sid HAVING AVG(sc.score)>=60) scs WHERE s.sid = scs.sid; #②查詢學生信息(去重字段) SELECT S.sid,S.sname,S.sage,S.ssex,scs.avgscore FROM student s, (SELECT AVG(sc.score) AS avgscore,sc.sid FROM score AS sc GROUP BY sc.sid HAVING AVG(sc.score)>=60) scs WHERE s.sid = scs.sid;
3.查詢在 Score 表存在成績的學生信息
#201922無成績信息 SELECT * FROM student s WHERE s.sid IN (SELECT sc.sid FROM score sc); SELECT * from student S,Score SC where S.sid = SC.sid; #SELECT DISTINCT 列名稱 FROM 表名稱 返回唯一不同的值(去重) SELECT DISTINCT S.* from student S,Score SC where S.sid = SC.sid; #查詢有成績的學生信息 #IN()適合B表比A表數據小的情況;EXISTS()適合B表比A表數據大的情況 SELECT * from student S WHERE S.sid in (SELECT SC.sid from score SC); SELECT * from student S where exists (SELECT SC.sid from score SC WHERE S.sid = SC.sid);
4.查詢所有同學的學生編號、學生姓名、選課總數、所有課程的成績總和
SELECT s.sid,s.sname,scs.countcourse,scs.sumscore FROM student s, (SELECT sc.sid,COUNT(sc.cid) as countcourse,SUM(sc.score) as sumscore FROM score sc GROUP BY sc.sid) scs WHERE s.sid = scs.sid;-- select中的列要與group by的分組列對應
#沒選課的學生信息也顯示,並按選課總數降序排序 SELECT s.sid,s.sname,scs.countcourse,scs.sumscore FROM student s LEFT JOIN (SELECT sc.sid,COUNT(sc.cid) as countcourse,SUM(sc.score) as sumscore FROM score sc GROUP BY sc.sid) scs ON s.sid = scs.sid ORDER BY scs.countcourse DESC;
5.查詢「李」姓老師的數量
SELECT count(t.tid) FROM teacher t WHERE t.tname LIKE "李%";
6.查詢學過「張三」老師授課的同學的信息
#①查詢張三老師的課程 select DISTINCT(c.cid),c.cname from course C,teacher T where C.tid = T.tid and T.tname = "張三"; #②查詢對應學生信息 SELECT DISTINCT S.* from student S,score SC,course C,teacher T WHERE T.tid = C.tid and C.cid = SC.cid and SC.sid = S.sid and T.tname = "張三";
7.查詢沒有學全所有課程的同學的信息
SELECT * from student S where S.sid not in (SELECT SC.sid from score SC GROUP BY SC.sid having count(SC.cid) = (select count(cid) from course));
8.查詢至少有一門課與學號為" 201921 "的同學所學相同的同學的信息
SELECT * FROM student s,score sc WHERE s.sid = sc.sid AND sc.cid IN (SELECT sc.cid FROM score sc WHERE sc.sid = "201921");-- 201921 只學了01課程
9.查詢和" 201923 "號(201924、201927)的同學學習的課程完全相同的其他同學的信息!!!!!!
#方法1--查詢錯誤:25、28--201925、201928在學生表中為重復值(刪除重復值后查詢無誤) # 1. 先找出201923的所有課程 # 2. 找出學過201923沒有學過的課程的學生,排除 # 3. group by統計每個學生的所選課程數 # 4. group by后的篩選需要用having語句 篩選出課程數相同的 SELECT S.*,COUNT( * ) AS course_count FROM student S,score SC WHERE S.sid = SC.sid AND S.sid NOT IN ( SELECT DISTINCT S.sid FROM student S,score SC WHERE S.sid = SC.sid AND SC.cid NOT IN (SELECT SC.cid FROM score SC WHERE SC.sid = "201923") ) GROUP BY s.sid HAVING course_count = (SELECT count( * ) FROM score sc WHERE sc.SId = '201923');
#方法2:將課程ID拼接 # 1. 針對每個學生拼接出他的課程列表,作為臨時表temp # 2. 找出01號學生的課程列表字符串 # 3. 找出臨時表temp中課程列表與01號相同且不為01號的sid # 4. 從學生表中根據sid找出數據 #GROUP_CONCAT將group by產生的同一個分組中的值連接起來,返回一個字符串結果.語法:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] ) SELECT
DISTINCT * FROM student WHERE sid IN ( SELECT sid FROM ( SELECT sc.sid, GROUP_CONCAT( sc.cid ORDER BY sc.cid ) courselist FROM score sc GROUP BY sc.sid ) temp WHERE courselist = ( SELECT group_concat( sc.cid ORDER BY sc.cid ) FROM score sc WHERE sc.SId = '201923' ) AND temp.sid != '201923' );
10.查詢沒學過"張三"老師講授的任一門課程的學生姓名
SELECT DISTINCT s.sname FROM student s,score sc WHERE s.sid = sc.sid AND sc.sid NOT IN (SELECT sc.sid FROM course c,teacher t,score sc WHERE c.tid = t.tid AND t.tname = "張三" AND sc.cid = c.cid);
11.查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績(201926、201927)
#執行順序:from-where-group by-having-select-order by #從成績表中選取score小於60的,並group by sid,having count 大於1 SELECT SC.sid,S.sname,avg(SC.score) FROM score SC,student S WHERE SC.sid = S.sid and SC.score < 60 GROUP BY SC.sid HAVING count(SC.cid)>1;-- 28也在查詢結果中:201925、201928在學生表中為重復值
12.檢索" 02 "課程分數小於 60,按分數降序排列的學生信息
SELECT DISTINCT s.*,sc.score FROM student s,score sc WHERE sc.score < 60 AND sc.cid = "02" AND s.sid = sc.sid ORDER BY sc.score DESC;
-- 查詢最后可以設置排序方式,語法為ORDER BY ***** DESC\ASC(order by默認采用升序(asc),如果存在 where 子句,那么 order by 必須放到where 語句后面);DISTINCT作用於單列
13.按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
SELECT sc.*,a.avgscore FROM score sc LEFT JOIN (SELECT sc.sid,avg(sc.score) as avgscore FROM score sc GROUP BY sc.sid) a ON sc.sid =a.sid ORDER BY a.avgscore DESC; #① sum,avg,count等等都屬於統計函數,是需要經過分組之后才能統計出來的; #② 平均數與原始數據需要同時顯示:使用group by除統計函數之外,查詢字段與分組字段必須一一對應
#select field1,field2,count(*) from a group by field1,field2,若group by 后面的字段不全,則數據也不全 SELECT SC.sid,SC.cid,SC.score,avg(SC.score) as avgscore from score SC GROUP BY SC.sid,SC.cid,SC.score ORDER BY avgscore desc;-- 該語句計算的是單門課程的均值
14.查詢各科成績最高分、最低分和平均分,以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率.及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90.要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
SELECT SC.cid, max( SC.score ) AS 最高分, min( SC.score ) AS 最低分, avg( SC.score ) AS 平均分, count( * ) AS 選修人數, sum( CASE WHEN SC.score >= 60 THEN 1 ELSE 0 END ) / count( * ) AS 及格率, sum( CASE WHEN SC.score >= 70 AND SC.score < 80 THEN 1 ELSE 0 END ) / count( * ) AS 中等率, sum( CASE WHEN SC.score >= 80 AND SC.score < 90 THEN 1 ELSE 0 END ) / count( * ) AS 優良率, sum( CASE WHEN SC.score >= 90 THEN 1 ELSE 0 END ) / count( * ) AS 優秀率 FROM score SC GROUP BY SC.cid ORDER BY count( * ) DESC, SC.cid ASC;
15.按各科成績進行排序,並顯示排名, Score 重復時保留名次空缺!!!!!!
#①使用窗口函數:row_number(),rank(),dense_rank() #語法:rank() over(PARTITION BY 分組字段 ORDER BY 排序字段) SELECT *,rank() over(PARTITION BY cid ORDER BY score DESC) as ran FROM score; #②左連接方法 SELECT a.cid,a.sid,a.score,count(b.score)+1 as ran FROM score as a LEFT JOIN score as b ON a.score < b.score AND a.cid = b.cid GROUP BY a.cid,a.sid,a.score ORDER BY a.cid,ran ASC;-- 思路:比當前分數更高的有幾個
16.查詢學生的總成績,並進行排名,總分重復時不保留名次空缺!!!!!!
#方法一:使用窗口函數 SELECT *, sum(score) as sscore, dense_rank() over(ORDER BY sum(score) DESC) as ran FROM score GROUP BY sid; #方法二:使用自定義變量 #自定義變量: 申明變量:SET @crank =0; 對變量進行賦值:@crank := @crank +1 ,賦值操作符 =或:= 使用:查找,比較 運算等 , 作用域:針對於當前會話(連接)有效,作用域同於會話變量 SET @crank=0; SELECT q.sid,total,@crank:=@crank +1 as ran FROM (SELECT sc.sid,sum(sc.score) as total FROM score sc GROUP BY sc.sid ORDER BY total DESC) as q;-- rank不可作為變量名
17.統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所占百分比!!!!!!
SELECT sc.cid,c.cname,count(*) as sump, sum(CASE WHEN sc.score <= 100 and sc.score > 85 THEN 1 ELSE 0 END) as "[100-85]", sum(CASE WHEN sc.score <= 85 and sc.score > 70 THEN 1 ELSE 0 END) as "[85-70]", sum(CASE WHEN sc.score <= 70 and sc.score > 60 THEN 1 ELSE 0 END) as "[70-60]", sum(CASE WHEN sc.score <= 60 THEN 1 ELSE 0 END) as "[60-0]" , sum(CASE WHEN sc.score <= 100 and sc.score > 85 THEN 1 ELSE 0 END)/count(*) as p1, sum(CASE WHEN sc.score <= 85 and sc.score > 70 THEN 1 ELSE 0 END)/count(*) as p2, sum(CASE WHEN sc.score <= 70 and sc.score > 60 THEN 1 ELSE 0 END)/count(*) as p3, sum(CASE WHEN sc.score <= 60 THEN 1 ELSE 0 END)/count(*) as p4 FROM score sc LEFT JOIN course c ON sc.cid = c.cid GROUP BY sc.cid;
18.查詢各科成績前三名的記錄
SELECT * FROM (SELECT sc.*,row_number() over(PARTITION BY cid ORDER BY score DESC) as ran FROM score sc) a WHERE a.ran in(1,2,3);#非並列排名
19.查詢每門課程被選修的學生數
SELECT c.cname,count(sc.sid) FROM course c,score sc WHERE sc.cid = c.cid GROUP BY sc.cid;
20.查詢出只選修兩門課程的學生學號和姓名
SELECT s.sname,s.sid FROM student s WHERE s.sid IN (SELECT sc.sid FROM score sc GROUP BY sc.sid HAVING count(sc.cid) = 2);-- 嵌套查詢 SELECT s.sname,s.sid FROM student s,score sc WHERE s.sid = sc.sid GROUP BY sc.sid HAVING count(*) =2;-- 聯合查詢
21.查詢男生、女生人數
SELECT ssex,count(*) as sn FROM student GROUP BY ssex;
22.查詢名字中含有「王」字的學生信息
SELECT * FROM student WHERE sname LIKE "%王%";
23.查詢同名學生名單,並統計同名人數
SELECT sname,count(*) "同名人數" FROM student GROUP BY sname HAVING count(*) >1;
24.查詢 2001 年出生的學生名單
SELECT * FROM student WHERE YEAR(sage) = 2001;
25.查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
SELECT sc.cid, avg(sc.score) as avgscore, c.cname FROM score sc,course c WHERE sc.cid = c.cid GROUP BY sc.cid ORDER BY avg(sc.score) DESC,sc.cid ASC;
26.查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績
SELECT sc.sid, avg(sc.score) as avgscore, s.sname FROM score sc,student s WHERE sc.sid = s.sid GROUP BY sc.sid HAVING avgscore >= 85;-- having也可以用來截取結果表
27.查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數
SELECT s.sname,sc.score FROM student s,score sc,course c WHERE s.sid=sc.sid AND c.cid = sc.cid AND c.cname = "數學" AND sc.score <60;
28.查詢所有學生的課程及分數情況(存在學生沒成績,沒選課的情況:李四、張三)
SELECT s.sname,sc.cid,sc.score FROM student s LEFT JOIN score sc ON s.sid = sc.sid;
29.查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
SELECT s.sname,c.cname,sc.score FROM student s,course c,score sc WHERE s.sid=sc.sid AND c.cid=sc.cid AND sc.score>70;
30.查詢存在不及格的課程
-- 可以用group by 來取唯一,也可以用distinct SELECT cid FROM score WHERE score<60 GROUP BY cid; SELECT DISTINCT cid FROM score WHERE score<60;
31.查詢課程編號為 01 且課程成績在 80 分及以上的學生的學號和姓名
SELECT s.sname,sc.sid,sc.score FROM student s,score sc WHERE sc.cid = "01" AND sc.score > 80 AND s.sid =sc.sid;
32.求每門課程的學生人數
SELECT c.cname,sc.cid,count(sc.sid) as snum FROM course c,score sc WHERE c.cid = sc.cid GROUP BY sc.cid;
33.成績不重復,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
SELECT s.sname,sc.sid,sc.score FROM student s,score sc,course c,teacher t WHERE s.sid=sc.sid AND sc.cid=c.cid AND t.tid=c.tid AND t.tname="張三" ORDER BY sc.score DESC limit 0,1; -- order之后限制查詢結果數;limit 1 與limit 0,1效果相同,若為limit 0,2則表示從第一行開始取兩行數據
34.成績有重復的情況下,查詢選修「王五」老師所授課程的學生中,成績最高的學生信息及其成績!!!!!!
SELECT s.sname,sc.sid,sc.score FROM student s,score sc,course c,teacher t WHERE s.sid=sc.sid AND sc.cid=c.cid AND t.tid=c.tid AND t.tname="王五" ORDER BY sc.score DESC;-- 原數據:最高分sid為201903,cid為02,score為100 UPDATE score SET score = 100 WHERE sid = "201915" AND cid = "02"; -- 修改原數據后:201903、201915並列第一(100分) -- 查詢到最高分數,限制條件為 分數 = 最高分 SELECT s.sname,s.sage,s.ssex,sc.sid,sc.score FROM student s,score sc,course c,teacher t WHERE s.sid=sc.sid AND sc.cid=c.cid AND t.tid=c.tid AND t.tname="王五" AND sc.score =( SELECT max(sc.score) FROM student s,score sc,course c,teacher t WHERE s.sid=sc.sid AND sc.cid=c.cid AND t.tid=c.tid AND t.tname="王五");
35.查詢不同課程成績相同的學生的學生編號、課程編號、學生成績!!!!!!
#插入一學生數據(202001 3門課程成績相同) 注:實際業務中使用外鍵限制無學生信息的學生成績插入表中,此處僅作練習 INSERT INTO Score(sid,cid,score) VALUE ('202001','01','99'), ('202001','02','99'), ('202001','03','99');
#INNER JOIN(用group by取唯一) SELECT sc.sid,sc.cid,sc.score FROM score sc INNER JOIN score sc2 ON sc.sid = sc2.sid AND sc.cid != sc2.cid AND sc.score = sc2.score GROUP BY cid,sid ORDER BY sid;-- 使用inner join;201903(01 03相同 但02 不同) 201912(02 03相同 但 02 不同)
36.查詢每門功成績最好的前兩名(同18題)--分組排序問題
SELECT * FROM (SELECT sc.*,row_number() over (PARTITION BY sc.cid ORDER BY sc.score DESC) as pm FROM score sc)a WHERE a.pm IN (1,2);
37.統計每門課程的學生選修人數(超過 5 人的課程才統計)
SELECT cid,count(sid) AS 選修人數 FROM score GROUP BY cid HAVING 選修人數>5;
38.檢索至少選修兩門課程的學生學號
SELECT sid,count(cid) as cs FROM score GROUP BY sid HAVING cs >=2;
39.查詢選修了全部課程的學生信息
SELECT s.* FROM score sc,student s WHERE sc.sid=s.sid GROUP BY sc.sid HAVING count(sc.cid) = (SELECT DISTINCT count(cid) FROM course);
40.查詢各學生的年齡,只按年份來算(若未到生日則虛增一歲)!!!!!!
備注:該題未解決
SELECT s.sname,FLOOR((DATEDIFF(CURRENT_DATE(),s.sage)/365.2422)) as age,s.sage FROM student s;-- 該方法未到生日的年齡未虛增 select student.*,year(curdate())-year(sage)+c.a as 年齡 from student, (select sid, (case when month(curdate())<month(sage) and day(curdate())<day(sage) then -1 else 0 end) as a from student) c where student.sid = c.sid;-- 該方法未到生日的年齡未虛增
#年齡計算參考:https://www.jianshu.com/p/64b53c26bea1
41.按照出生日期來算,當前月日 < 出生年月的月日則年齡減一!!!!!!
SELECT
s.sname,
TIMESTAMPDIFF(year,s.sage,CURRENT_DATE()) AS age,
s.sage
FROM student s;-- 當前日期為2020-4-21,魯韋昌馬的出生日期為1994-07-22,俞任袁柳的出生日期為1994-01-16,按照此方法計算,前者為25歲(未滿),后者為26歲(已滿) SELECT
s.sname,
ROUND((DATEDIFF(now(),s.sage)/365.2422)) as age,
s.sage
FROM student s;-- 當前日期為2020-4-21,孔曹嚴華的出生日期為1994-05-23,戚謝鄒喻的出生日期為1994-11-30,按照此方法計算,前者(未滿但快滿)快滿歲則年齡為26(虛增1歲),后者還遠未滿,年齡為25,該方法最接近按照出生日期精確計算的年齡
42.查詢本周過生日的學生!!!!!!
備注:跨年查詢未解決
select *from Student where WEEKOFYEAR(CONCAT(YEAR(CURRENT_DATE),'-',MONTH(Sage),'-',DAY(Sage))) = WEEKOFYEAR(CURRENT_DATE);
43.查詢下周過生日的學生!!!!!!
select *from Student where WEEKOFYEAR(CONCAT(YEAR(CURRENT_DATE),'-',MONTH(Sage),'-',DAY(Sage))) = WEEKOFYEAR(CURRENT_DATE)+1;
44.查詢本月過生日的學生
SELECT * FROM student WHERE MONTH(student.sage) = MONTH(CURRENT_DATE());
45.查詢下月過生日的學生
SELECT * FROM student WHERE MONTH(student.sage) = MONTH(CURRENT_DATE())+1;
#以上若出現跨年查詢則應該使用 SELECT * FROM student WHERE MONTH(DATE_SUB(sage,INTERVAL 1 month)) = MONTH(CURRENT_DATE);-- 出生日期減1月,若為1994-12,則值變為1993-12 select sid from Student where (case when month(CURDATE())=12 then 1 else month(CURDATE())+1 end) = month(sage);
插入數據
#populate #1.更新成績表 #插入單條數據(注:若values值按順序排列,字段名可省略,最好加上字段名) INSERT into student(sid,sname,sage,ssex) values('201901','趙錢孫李','1993/9/8','男'); #插入多行數據 INSERT into student(sid,sname,sage,ssex) values ('201902','馮陳褚衛','1993-04-19','男'), ('201903','朱秦尤許','1991-10-21','女'), ('201904','孔曹嚴華','1994-05-23','男'), ('201905','戚謝鄒喻','1994-11-30','男'), ('201906','雲蘇潘葛','1991-08-29','女'), ('201907','魯韋昌馬','1994-07-22','男'), ('201908','俞任袁柳','1994-01-16','男'), ('201909','費廉岑薛','1993-03-24','女'), ('201910','滕殷羅畢','1993-07-04','男'), ('201911','周吳鄭王','1994-11-03','男'), ('201912','蔣沈韓楊','1992-09-05','女'), ('201913','何呂施張','1992-09-02','男'), ('201914','金魏陶姜','1994-03-18','男'), ('201915','柏水竇章','1994-12-05','女'), ('201916','奚范彭郎','1994-01-22','男'), ('201917','苗鳳花方','1993-03-09','男'), ('201918','酆鮑史唐','1992-09-27','女'), ('201919','雷賀倪湯','1994-08-22','男'), ('201920','郝鄔安常','1993-01-18','男'); INSERT into student(sid,sname,sage,ssex) values ('201921','張三','1993-04-20','男'); INSERT into student(sid,sname,sage,ssex) values ('201922','李四','1995-01-20','女'); INSERT into student(sid,sname,sage,ssex) values ('201923','王二','1995-01-20','男'), ('201924','趙四','1995-03-20','男'); INSERT into student(sid,sname,sage,ssex) values ('201925','王五','1995-01-20','女'); INSERT into student(sid,sname,sage,ssex) values ('201926','孫錢','1995-01-20','男'), ('201927','三一','1995-03-20','男'); INSERT into student(sid,sname,sage,ssex) values ('201928','妙妙','1995-01-20','女'); #2.更新課程表 insert into course values ('01','數學','01'), ('02','語文','03'), ('03','英語','01'); #3.更新教師表 INSERT INTO teacher VALUES('01','張三'),('02','李四'),('03','王五'); #4.更新成績表 INSERT INTO Score VALUE ('201901','01','68'), ('201902','01','92'), ('201903','01','94'), ('201904','01','79'), ('201905','01','64'), ('201906','01','80'), ('201907','01','91'), ('201908','01','86'), ('201909','01','95'), ('201910','01','68'), ('201911','01','96'), ('201912','01','73'), ('201913','01','62'), ('201914','01','81'), ('201915','01','82'), ('201916','01','65'), ('201917','01','99'), ('201918','01','84'), ('201919','01','90'), ('201920','01','71'), ('201901','02','93'), ('201902','02','93'), ('201903','02','100'), ('201904','02','76'), ('201905','02','61'), ('201906','02','70'), ('201907','02','62'), ('201908','02','94'), ('201909','02','77'), ('201910','02','87'), ('201911','02','91'), ('201912','02','63'), ('201913','02','73'), ('201914','02','96'), ('201915','02','97'), ('201916','02','93'), ('201917','02','60'), ('201918','02','70'), ('201919','02','61'), ('201920','02','81'), ('201901','03','86'), ('201902','03','99'), ('201903','03','94'), ('201904','03','81'), ('201905','03','100'), ('201906','03','85'), ('201907','03','86'), ('201908','03','66'), ('201909','03','68'), ('201910','03','88'), ('201911','03','79'), ('201912','03','63'), ('201913','03','74'), ('201914','03','67'), ('201915','03','91'), ('201916','03','77'), ('201917','03','80'), ('201918','03','96'), ('201919','03','68'), ('201920','03','83'); INSERT INTO Score VALUE ('201921','01','80'); INSERT INTO Score VALUE ('201922','01','90'); INSERT INTO Score VALUE ('201923','02','90'),('201923','03','89'), ('201924','02','70'),('201924','03','80'); INSERT INTO Score VALUE ('201925','02','90'); INSERT INTO Score VALUE ('201926','01','50'),('201926','02','49'),('201926','03','20'), ('201927','02','50'),('201927','03','58'); INSERT INTO Score VALUE ('201928','02','50');
持續更新補充
有任何問題歡迎批評指正,郵箱 fanyu1601@163.com