--- tags: database --- # 12/27 1 查詢每門功課成績最好的前兩名,顯示課程名稱、姓名、名次及分數; ``` SELECT c.c_name,s.s_name,a.r_result,a.num FROM ( SELECT s_no,c_no,r_result,RANK() OVER (PARTITION BY c_no ORDER BY r_result DESC) AS num FROM results )a ,students as s ,classes as c where a.NUM <= 2 and s.s_no = a.s_no and c.c_no = a.c_no ``` 2 查詢跟「林進財」同學修完全相同課程的其他同學的學號、姓名; ``` SELECT s.s_no,s.s_name FROM students as s,classes as c,results as r WHERE s.s_name <>'林進財' and c.c_no in (SELECT r.c_no FROM results as r,students as s WHERE r.s_no=s.s_no and s.s_name='林進財' ) and s.s_no=r.s_no and c.c_no=r.c_no and r.s_no in ( SELECT r.s_no FROM results as r ,students as s WHERE s.s_no=r.s_no GROUP BY r.s_no HAVING COUNT(r.s_no)=(SELECT COUNT(r.c_no) FROM results as r,students as s WHERE r.s_no=s.s_no and s.s_name='林進財') ) GROUP BY s.s_no,s.s_name HAVING COUNT(s.s_no)=(SELECT COUNT(r.c_no) FROM results as r,students as s WHERE r.s_no=s.s_no and s.s_name='林進財') ``` 3 請計算男、女生的平均年齡,顯示性別、平均年齡。 ``` SELECT s.s_sex,AVG(DATEDIFF(YEAR,s.s_birthday,GETDATE())) FROM students as s GROUP BY s.s_sex ``` 4 請查詢 1980 年以前出生的學生名單。 ``` SELECT * FROM students as s WHERE YEAR(s.s_birthday)<'1980' ``` 5 查詢各課程分數大於該課程平均成績的所有學生的學號、姓名和課程、成績; ``` SELECT s.s_no,s.s_name,c.c_name,r.r_result FROM students as s, (SELECT AVG(r.r_result) as avgr,R.c_no FROM results as r GROUP BY r.c_no ) as a,results as r,classes as c WHERE r.r_result>a.avgr and r.c_no=a.c_no and c.c_no=r.c_no and r.s_no=s.s_no ```