sql 练习(四)

作者: 叨叨侠爱叨叨 | 来源:发表于2017-10-27 16:55 被阅读42次

    环境是mysql

    练习数据见SQL:练习的前期准备
    sql 练习(一)
    sql 练习(二)
    sql 练习(三)
    31、查询所有“女”教师和“女”同学的name、sex和birthday.

    SELECT sname,ssex,sbirthday
      FROM student
     WHERE ssex = '女'
      UNION 
    SELECT tname,tsex,tbirthday 
      FROM teacher
     WHERE tsex = '女'
    

    32、查询成绩比该课程平均成绩低的同学的成绩表。

    SELECT a.sno,a.cno,a.degree 
      FROM score a
      LEFT JOIN (
            SELECT AVG(degree) degree,cno
              FROM score
             GROUP BY cno)b
        ON a.cno=b.cno
     WHERE a.degree< b.degree
     
     
    SELECT Sno,Cno,degree 
      FROM Score a 
     WHERE degree<(SELECT AVG(degree) FROM score b WHERE a.Cno=b.Cno)
    

    33、查询所有任课教师的Tname和Depart.

    SELECT tname,depart
      FROM teacher
     WHERE tno IN(SELECT tno FROM course )
     
     SELECT tname,depart 
       FROM teacher a 
      WHERE EXISTS (SELECT * FROM course b WHERE a.tno=b.tno)
    

    34、查询所有未讲课的教师的Tname和Depart.

    SELECT tname,depart 
      FROM Teacher 
     WHERE tno  NOT IN(SELECT tno FROM course)
    

    35、查询至少有2名男生的班号。

    SELECT class 
      FROM Student 
     WHERE Ssex='男' 
     GROUP BY class 
    HAVING COUNT(SSex)>=2 
    

    36、查询不姓王的同学信息

    SELECT *
      FROM student 
     WHERE sname NOT LIKE '王%'
    

    37、查询Student表中每个学生的姓名和年龄。

    SELECT Sname,(YEAR(NOW())-YEAR(Sbirthday)) age
      FROM student
    

    38、查询Student表中最大和最小的Sbirthday日期值。

    SELECT MAX(sbirthday),MIN(sbirthday)
      FROM student 
    

    39、以班号和年龄从大到小的顺序查询Student表中的全部记录。

    SELECT *
      FROM student
     ORDER BY sbirthday ASC,class DESC
    

    40、查询“男”教师及其所上的课程。

    SELECT a.tname,b.cname 
      FROM teacher  a 
      JOIN course b
        ON a.tno = b.tno
     WHERE a.tsex ='男'
    

    41、查询最高分同学的Sno、Cno和Degree列。

    SELECT * 
      FROM score 
     WHERE degree=(SELECT MAX(degree)FROM score)
    

    42、查询所有选修“计算机导论”课程的“男”同学的成绩表。

    SELECT sno,degree
      FROM score
     WHERE sno IN (SELECT sno FROM student WHERE ssex='男')
       AND cno IN (SELECT cno FROM course WHERE cname='计算机导论')  
    

    43、查询和“李军”同性别的所有同学的Sname.

    SELECT sname
      FROM student
     WHERE ssex=(SELECT ssex FROM student WHERE sname='李军')
    

    44、查询日期

    SELECT *
      FROM teacher 
     WHERE tbirthday=STR_TO_DATE('1972-05-05 00:00:00','%Y-%m-%d')
    

    相关文章

      网友评论

      • 蛋总Maximus:另外请问一下作者,第32题第2个解法对我来说是很amazing了,能不能请作者在题目下方或者评论里头具体解释一下原理呢?非常感谢!
      • 蛋总Maximus:作者您好,第42题有一个不需要子查询的解法,我也放上来希望采纳~要点就是外联了course和student两张表:

        select * from score
        join course on course.cno=score.cno
        join student on student.sno=score.sno
        where course.cname='计算机导论' and student.ssex='男';
        叨叨侠爱叨叨:二者都可以,在子查询里面限制了部分数据效率会更高点。
      • 蛋总Maximus:作者您好,我认为第41题可能题目表述不清,但是我们日常生活中查询最高分同学的话肯定是会对不同课程分别查询的,因此我建议您也可以参考一下以下解法:
        select c.sname, a.sno, a.cno, a.degree
        from score a
        join (select cno, max(degree) as max_deg
        from score group by cno) b
        on b.cno=a.cno
        join student c on c.sno=a.sno
        where a.degree=b.max_deg;

        您的sql 练习教程帮助了我很多,在此特地感谢您!希望以后有更多的好文章与教程分享~

      本文标题:sql 练习(四)

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