6、MySQL測試題

MySQL測試題

一、表關系

表關系

請創建如下表,并創建相關約束

二、操作表

1、自行創建測試數據

2、查詢“生物”課程比“物理”課程成績高的所有學生的學號;

3、查詢平均成績大于60分的同學的學號和平均成績;

4、查詢所有同學的學號、姓名、選課數、總成績;

5、查詢姓“李”的老師的個數;

6、查詢沒學過“葉平”老師課的同學的學號、姓名;

7、查詢學過“001”并且也學過編號“002”課程的同學的學號、姓名;

8、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;

9、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;

10、查詢有課程成績小于60分的同學的學號、姓名;

11、查詢沒有學全所有課的同學的學號、姓名;

12、查詢至少有一門課與學號為“001”的同學所學相同的同學的學號和姓名;

13、查詢至少學過學號為“001”同學所選課程中任意一門課的其他同學學號和姓名;

14、查詢和“002”號的同學學習的課程完全相同的其他同學學號和姓名;

15、刪除學習“葉平”老師課的SC表記錄;

16、向SC表中插入一些記錄,這些記錄要求符合以下條件:①沒有上過編號“002”課程的同學學號;②插入“002”號課程的平均成績;

17、按平均成績從低到高顯示所有學生的“語文”、“數學”、“英語”三門的課程成績,按如下形式顯示: 學生ID,語文,數學,英語,有效課程數,有效平均分;

18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;

19、按各科平均成績從低到高和及格率的百分數從高到低順序;

20、課程平均分從高到低顯示(現實任課老師);

21、查詢各科成績前三名的記錄:(不考慮成績并列情況)

22、查詢每門課程被選修的學生數;

23、查詢出只選修了一門課程的全部學生的學號和姓名;

24、查詢男生、女生的人數;

25、查詢姓“張”的學生名單;

26、查詢同名同姓學生名單,并統計同名人數;

27、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;

28、查詢平均成績大于85的所有學生的學號、姓名和平均成績;

29、查詢課程名稱為“數學”,且分數低于60的學生姓名和分數;

30、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;

31、求選了課程的學生人數

32、查詢選修“楊艷”老師所授課程的學生中,成績最高的學生姓名及其成績;

33、查詢各個課程及相應的選修人數;

34、查詢不同課程但成績相同的學生的學號、課程號、學生成績;

35、查詢每門課程成績最好的前兩名;

36、檢索至少選修兩門課程的學生學號;

37、查詢全部學生都選修的課程的課程號和課程名;

38、查詢沒學過“葉平”老師講授的任一門課程的學生姓名;

39、查詢兩門以上不及格課程的同學的學號及其平均成績;

40、檢索“004”課程分數小于60,按分數降序排列的同學學號;

41、刪除“002”同學的“001”課程的成績;

1、自行創建測試數據
2、查詢“生物”課程比“物理”課程成績高的所有學生的學號;
思路:
獲取所有有生物課程的人(學號,成績) - 臨時表
獲取所有有物理課程的人(學號,成績) - 臨時表
根據【學號】連接兩個臨時表:
學號 物理成績 生物成績

然后再進行篩選

select A.student_id,sw,ty from

(select student_id,num as sw from score left join course on score.course_id = course.cid where course.cname = '生物') as A

left join

(select student_id,num  as ty from score left join course on score.course_id = course.cid where course.cname = '體育') as B

on A.student_id = B.student_id where sw > if(isnull(ty),0,ty);

3、查詢平均成績大于60分的同學的學號和平均成績;
思路:
根據學生分組,使用avg獲取平均值,通過having對avg進行篩選

select student_id,avg(num) from score group by student_id having avg(num) > 60

4、查詢所有同學的學號、姓名、選課數、總成績;

select score.student_id,sum(score.num),count(score.student_id),student.sname
from
score left join student on score.student_id = student.sid  
group by score.student_id

5、查詢姓“李”的老師的個數;

select count(tid) from teacher where tname like '李%'

select count(1) from (select tid from teacher where tname like '李%') as B

6、查詢沒學過“葉平”老師課的同學的學號、姓名;
思路:
先查到“李平老師”老師教的所有課ID
獲取選過課的所有學生ID
學生表中篩選

select * from student where sid not in (
select DISTINCT student_id from score where score.course_id in (
select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '李平老師'
)
)

7、查詢學過“001”并且也學過編號“002”課程的同學的學號、姓名;
思路:
先查到既選擇001又選擇002課程的所有同學
根據學生進行分組,如果學生數量等于2表示,兩門均已選擇

select student_id,sname from

(select student_id,course_id from score where course_id = 1 or course_id = 2) as B

left join student on B.student_id = student.sid group by student_id HAVING count(student_id) > 1

8、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;

同上,只不過將001和002變成 in (葉平老師的所有課)

9、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;
同第1題

10、查詢有課程成績小于60分的同學的學號、姓名;

select sid,sname from student where sid in (
select distinct student_id from score where num < 60
)

11、查詢沒有學全所有課的同學的學號、姓名;
思路:
在分數表中根據學生進行分組,獲取每一個學生選課數量
如果數量 == 總課程數量,表示已經選擇了所有課程

select student_id,sname
from score left join student on score.student_id = student.sid
group by student_id HAVING count(course_id) = (select count(1) from course)

12、查詢至少有一門課與學號為“001”的同學所學相同的同學的學號和姓名;
思路:
獲取 001 同學選擇的所有課程
獲取課程在其中的所有人以及所有課程
根據學生篩選,獲取所有學生信息
再與學生表連接,獲取姓名

select student_id,sname, count(course_id)
from score left join student on score.student_id = student.sid
where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id

13、查詢至少學過學號為“001”同學所有課的其他同學學號和姓名;
先找到和001的學過的所有人
然后個數 = 001所有學科 ==》 其他人可能選擇的更多

select student_id,sname, count(course_id)
from score left join student on score.student_id = student.sid
where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id having count(course_id) = (select count(course_id) from score where student_id = 1)

14、查詢和“002”號的同學學習的課程完全相同的其他同學學號和姓名;

個數相同
002學過的也學過

select student_id,sname from score left join student on score.student_id = student.sid where student_id in (
select student_id from score  where student_id != 1 group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1)
) and course_id in (select course_id from score where student_id = 1) group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1)

15、刪除學習“葉平”老師課的score表記錄;

delete from score where course_id in (
select cid from course left join teacher on course.teacher_id = teacher.tid where teacher.name = '葉平'
)

16、向SC表中插入一些記錄,這些記錄要求符合以下條件:①沒有上過編號“002”課程的同學學號;②插入“002”號課程的平均成績;
思路:
由于insert 支持
inset into tb1(xx,xx) select x1,x2 from tb2;
所有,獲取所有沒上過002課的所有人,獲取002的平均成績

insert into score(student_id, course_id, num) select sid,2,(select avg(num) from score where course_id = 2)
from student where sid not in (
select student_id from score where course_id = 2
)

17、按平均成績從低到高 顯示所有學生的“語文”、“數學”、“英語”三門的課程成績,按如下形式顯示: 學生ID,語文,數學,英語,有效課程數,有效平均分;

select sc.student_id,
(select num from score left join course on score.course_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy,
(select num from score left join course on score.course_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl,
(select num from score left join course on score.course_id = course.cid where course.cname = "體育" and score.student_id=sc.student_id) as ty,
count(sc.course_id),
avg(sc.num)
from score as sc
group by student_id desc        

18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;

select course_id, max(num) as max_num, min(num) as min_num from score group by course_id;

19、按各科平均成績從低到高和及格率的百分數從高到低順序;
思路:case when .. then

select course_id, avg(num) as avgnum,sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent from score group by course_id order by avgnum asc,percent desc;

20、課程平均分從高到低顯示(現實任課老師);

select avg(if(isnull(score.num),0,score.num)),teacher.tname from course
left join score on course.cid = score.course_id
left join teacher on course.teacher_id = teacher.tid

group by score.course_id

21、查詢各科成績前三名的記錄:(不考慮成績并列情況)

select score.sid,score.course_id,score.num,T.first_num,T.second_num from score left join
(
select
sid,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 3,1) as second_num
from
score as s1
) as T
on score.sid =T.sid
where score.num <= T.first_num and score.num >= T.second_num

22、查詢每門課程被選修的學生數;

select course_id, count(1) from score group by course_id;

23、查詢出只選修了一門課程的全部學生的學號和姓名;

select student.sid, student.sname, count(1) from score

left join student on score.student_id  = student.sid

group by course_id having count(1) = 1

24、查詢男生、女生的人數;

select * from
(select count(1) as man from student where gender='男') as A ,
(select count(1) as feman from student where gender='女') as B

25、查詢姓“張”的學生名單;

select sname from student where sname like '張%';

26、查詢同名同姓學生名單,并統計同名人數;

select sname,count(1) as count from student group by sname;

27、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;

select course_id,avg(if(isnull(num), 0 ,num)) as avg from score group by course_id order by avg     asc,course_id desc;

28、查詢平均成績大于85的所有學生的學號、姓名和平均成績;

select student_id,sname, avg(if(isnull(num), 0 ,num)) from score left join student on score.student_id = student.sid group by student_id;

29、查詢課程名稱為“數學”,且分數低于60的學生姓名和分數;

select student.sname,score.num from score
left join course on score.course_id = course.cid
left join student on score.student_id = student.sid
where score.num < 60 and course.cname = '生物'

30、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;

select * from score where score.student_id = 3 and score.num > 80

31、求選了課程的學生人數

select count(distinct student_id) from score

select count(c) from (
select count(student_id) as c from score group by student_id) as A

32、查詢選修“楊艷”老師所授課程的學生中,成績最高的學生姓名及其成績;

select sname,num from score
left join student on score.student_id = student.sid
where score.course_id in (select course.cid from course left join teacher on course.teacher_id = teacher.tid where tname='張磊老師') order by num desc limit 1;

33、查詢各個課程及相應的選修人數;

select course.cname,count(1) from score
left join course on score.course_id = course.cid
group by course_id;

34、查詢不同課程但成績相同的學生的學號、課程號、學生成績;

select DISTINCT s1.course_id,s2.course_id,s1.num,s2.num from score as s1, score as s2 where s1.num = s2.num and s1.course_id != s2.course_id;

35、查詢每門課程成績最好的前兩名;

select score.sid,score.course_id,score.num,T.first_num,T.second_num from score left join
(
select
sid,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num,
(select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 1,1) as second_num
from
score as s1
) as T
on score.sid =T.sid
where score.num <= T.first_num and score.num >= T.second_num

36、檢索至少選修兩門課程的學生學號;

select student_id from score group by student_id having count(student_id) > 1

37、查詢全部學生都選修的課程的課程號和課程名;

select course_id,count(1) from score group by course_id having count(1) = (select count(1) from student);

38、查詢沒學過“葉平”老師講授的任一門課程的學生姓名;

select student_id,student.sname from score
left join student on score.student_id = student.sid
where score.course_id not in (
select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '張磊老師'
)
group by student_id

39、查詢兩門以上不及格課程的同學的學號及其平均成績;

select student_id,count(1) from score where num < 60 group by student_id having count(1) > 2

40、檢索“004”課程分數小于60,按分數降序排列的同學學號;

select student_id from score where num< 60 and course_id = 4 order by num desc;

41、刪除“002”同學的“001”課程的成績;

delete from score where course_id = 1 and student_id = 2
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容