1. 程式人生 > >【Python全棧-後端開發】MySQL數據庫-練習題

【Python全棧-後端開發】MySQL數據庫-練習題

not 參考答案 參考 insert 編號 des 數學 event create

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”課程的成績;

創建數據:

-- 創建班級表
create table Class(
cid int primary key auto_increment ,
caption varchar(20)
);

insert into Class (caption) values
("三年二班"),
("一年三班"),
("三年一班");

-- 創建老師表
create table teacher(
tid int primary key auto_increment,
tname varchar(20)
);

insert into teacher (tname) values
("波多"),
("蒼空"),
("飯島");

-- 創建學生表
create table student(
sid int primary key auto_increment,
sname varchar (20),
gender varchar(10),
class_id TINYINT
);

insert into student (sname,gender,class_id) values
("鋼蛋","男",1),
("翠花","女",1),
("鴨蛋","女",2);

-- 創建課程表
create table course(
cid int primary key auto_increment,
cname varchar (20),
teacher_id INT
);

insert into course (cname,teacher_id) values
("生物",1),
("體育",1),
("物理",2);

-- 創建成績表
create table score(
sid int primary key auto_increment,
student_id INT,
teacher_id INT,
number int
);

insert into score (student_id,teacher_id,number) values
(1,1,60),
(1,2,59),
(2,2,100);

參考答案:

技術分享圖片
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
View Code

技術分享圖片

【Python全棧-後端開發】MySQL數據庫-練習題