总结:SQL练习【SQL经典练习题】

作者: 夜希辰 | 来源:发表于2018-12-26 00:45 被阅读35次
    好像今天圣诞节

    刚刷完SQL练习【SQL经典练习题】,本篇文章将对我不牢固的知识做简单汇总。
    没对比就没标准,当练习超经典SQL练习题,做完这些你的SQL就过关了时才知道自己以前练习的SQL是最基础的内容。至于文章内容这里不做描述,感兴趣可以自己练习。

    #20.查询scores中选学一门以上课程的同学中分数为非最高分成绩的记录。##
    select * from scores group by sno
    having count(cno) >1
    and
    degree != max(degree) ;
    
    #21.查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
    select * from scores 
    group by cno 
    having cno = 3105 and degree >
    (select degree from scores where sno = 109 and cno = 3105);
    
    #22.查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
    select sno,sname,sbirthday from students
    where sbirthday = 
    (select sbirthday from students where sno = 108);
    
    #24.查询选修某课程的同学人数多于5人的教师姓名。为什么是模棱两可的?为什么分组直接用cno不行,需要用a.cno或者b.cn
    select * from
    (select * from coursers) a
    inner join
    (select * from scores) b
    on a.cno = b.cno 
    inner join
    (select * from teachers) c
    on a.tno = c.tno
    group by a.cno
    having count(sno) > 5;
    

    24给我的教训在表连接的时候在做条件选择和查询的时候指定列名出自哪张表

    #26.查询存在有85分以上成绩的课程Cno.
    
    我的代码:
    select cno,degree from scores
    group by cno
    having max(degree) > 85;
    
    题主代码:
    SELECT distinct Cno
    FROM Scores
    WHERE Degree>85;
    

    26绝对是自己的逻辑问题,为什么要按课程分组直接筛选大于85分成绩的同学的课程号就可以啦。看见distinct可能是天真的我想用group by 选择有几个cno
    逻辑问题!

    #28.查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。  
    (我没有理解到题意……笨死……)
    select tname,prof from teachers
    where depart = '计算机系' and prof not in
    (select distinct prof from teachers where depart = '电子工程系');
    
    #29.查询选修编号为“3-105“课程且成绩至少高于任意选修编号为“3-245”的同学的成绩的Cno、Sno和Degree,并按Degree从高到低次序排序。
    我的代码:
    select cno,sno,degree from scores
    where cno = 3105 and degree >
    (select min(degree) from scores where cno = 3245)
    order by degree desc;
    
    题主代码:
    SELECT Cno,Sno,Degree
    FROM Scores
    WHERE Cno='3-105' AND Degree > ANY(SELECT Degree 
    FROM Scores
    WHERE Cno='3-245')
    ORDER BY Degree DESC;
    

    29任意不能用最小值吗不能用min吗?第一次见any,方法自己还是会的,可能有些函数用的少

    #31.查询所有教师和同学的name、sex和birthday.
    我的代码:(感觉好可爱的自己)
    select tname,tsex,tbirthday,sname,ssex,sbirthday from
    (select * from teachers) a
    inner join
    (select * from coursers) b
    on a.tno = b.tno
    inner join
    (select * from scores) c
    on c.cno = b.cno
    inner join 
    (select * from students) d
    on d.sno = c.sno;
    
    题主代码:
    select sname,ssex,sbirthday from students
    union
    select tname,tsex,tbirthday from teachers;
    
    #32.查询所有“女”教师和“女”同学的name、sex和birthday.
    select sname,ssex,sbirthday from students where ssex = '女'
    union
    select tname,tsex,tbirthday from teachers where tsex = '女';
    

    31原谅我已经把union已经忘了,现在还不是很会用……

    #33.查询成绩比该课程平均成绩低的同学的成绩表。???不明白不懂
    
    题主代码:
    SELECT s1.*
    FROM Scores AS s1 INNER JOIN (
        SELECT Cno,AVG(Degree) AS aDegree
        FROM Scores
        GROUP BY Cno) s2
    ON(s1.Cno=s2.Cno AND s1.Degree<s2.aDegree); 
    

    33下来在看一下吧,明天上班路上复习。第一次见on可以连接多个条件,并且不是等号是小于符号

    #34.查询所有任课教师的Tname和Depart.?????
    题主代码:
    select * from coursers;
    SELECT Tname,Depart
    FROM Teachers
    WHERE Tno IN(
        SELECT Tno
        FROM Coursers);
    
    #35.查询所有未讲课的教师的Tname和Depart. 
    SELECT Tname,Depart
    FROM Teachers
    WHERE Tno NOT IN(SELECT Tno FROM Coursers);
    

    34绝对是没明白意思,任课老师,老师还有不上课的吗?这里居然是让我筛选哪些老师上课(PS:表中有些老师不上课……)

    吐槽……简直颠覆本宝宝的常识,有不上课的老师吗?

    #36.查询至少有2名男生的班号。
    我的代码:
    SELECT Class,COUNT(1) AS boyCount
    FROM Students
    WHERE Ssex='男'
    GROUP BY Class
    HAVING boyCount>=2;
    
    题主代码:
    select class,ssex,count(1) as boycount from students where
    ssex = '男' group by class
    having count(ssex) >= 2;
    

    36count的位置不同吧,第一次见count(1),居然不对字段进行操作的,是否有count(2),下来去操作下

    #38.查询Student表中每个学生的姓名和年龄。
    我的代码:
    select curtime();  #现在的时间
    select curdate();  #现在的日期
    
    select sname,year(now()) - year(Sbirthday) as sage 
    from students;
    
    题主代码:
    SELECT Sname,YEAR(NOW())-YEAR(Sbirthday) AS Sage
    FROM Students;
    

    38完全是时间的基础知识掌握不牢固

    #43.查询和“李军”同性别的所有同学的Sname.
    我的代码:
    select sname from students
    where ssex = 
    (select ssex from students where sname = '李军');
    
    题主代码:
    SELECT s1.Sname
    FROM Students AS s1 INNER JOIN Students AS s2
    ON(s1.Ssex=s2.Ssex)
    WHERE s2.Sname='李军';
    
    #44.查询和“李军”同性别并同班的同学Sname.
    我的代码:
    select * from students
    where ssex = 
    (select ssex from students where sname = '李军')
    and class =
    (select class from students where sname = '李军');
    
    题主代码:
    SELECT s1.Sname
    FROM Students AS s1 INNER JOIN Students AS s2
    ON(s1.Ssex=s2.Ssex AND s1.Class=s2.Class)
    WHERE s2.Sname='李军';
    
    #45.查询所有选修“计算机导论”课程的“男”同学的成绩表
    我的代码:
    (可爱的我,这么勤劳联结这么多张表……不知疲劳)
    select sname,degree,cname,ssex from
    (select * from coursers) a
    inner join
    (select * from scores) b
    on a.cno = b.cno
    inner join
    (select * from students) c
    on b.sno = c.sno
    where cname = '计算机导论' and ssex = '男';
    
    题主代码:
    SELECT * FROM Scores
    WHERE Sno IN
    (SELECT Sno FROM Students WHERE Ssex='男') 
    AND Cno IN (SELECT Cno FROM Coursers WHERE Cname='计算机导论');
    

    43、44、45是每任何问题的,只是感觉题主的代码和我的不一样。不知道是不是我的方法有问题。

    好啦,之前练习的SQL练习【SQL经典练习题】就总结到这里了……

    20181225学习时间
    7:00——7:30
    6:00——7:10
    9:30——12:30
    仰卧起坐100,1点睡觉,6点20起床,6点50开始学习

    相关文章

      网友评论

        本文标题:总结:SQL练习【SQL经典练习题】

        本文链接:https://www.haomeiwen.com/subject/jshclqtx.html