zoukankan      html  css  js  c++  java
  • MySQL笔试题搜罗

    一、有表如下

    +------+---------+--------+  
    | name | subject | score |  
    +------+---------+--------+  
    | 张三 | 数学    |     80 |  
    | 张三 | 语文    |     53 |  
    | 张三 | 英语    |     59 |  
    | 李四 | 数学    |     55 |  
    | 李四 | 语文    |     56 |  
    | 李四 | 英语    |     50 |  
    | 王五 | 数学    |    100 |  
    | 王五 | 语文    |     90 |  
    +------+---------+--------+ 
    

    只用一个select语句查询:不及格科目大于或等于2科的学生,的平均分(所有科目的平均分)。
    要点:
    1、要统计每个学生不及格科目的个数。
    2、计算平均分。
    误解一:使用count统计。count永远是统计的所有行!

    正解:用sum统计。先计算所有人的平均分,再筛选。

    mysql> select name,avg(score),sum(score < 60) as cnt from student group by name having cnt >= 2;  
    +------+------------+-----+  
    | name | avg(score) | cnt |  
    +------+------------+-----+  
    | 张三 | 64.0000    | 2   |  
    | 李四 | 53.6667    | 3   |  
    +------+------------+-----+  
    2 rows in set</span>  
    

    sum(score < 60) 就是统计 挂科数目。

    having 是用于筛选的,这里不用用where。where只能用于存在的列。
    二、还是上面的表,查询出每个学生最大分数的科目及分数

    mysql> select * from student where score in(select max(score) from student group by name);  
    +------+---------+-------+  
    | name | subject | score |  
    +------+---------+-------+  
    | 张三 | 数学    |    80 |  
    | 李四 | 语文    |    56 |  
    | 王五 | 数学    |   100 |  
    +------+---------+-------+  
    3 rows in set
    

    三、
    一个班级表(class),其中的属性有:id, class_name
    一个学生表(student),其中的属性有:id, student_name, class_id
    一个成绩表(score),其中的属性有:id, student_id, course_name, score
    通过一条sql语句找出各个班级的各个科目的平均成绩,按从大到小排序。

    select a.class_name, c.course_name, avg(c.score) as avg
    from class a, student b, score c
    where a.id=b.class_id and b.id=c.student_id
    group by a.class_name, c.course_name
    order by avg desc;
    

    需要注意的地方:
    (1)avg() 求完平均值后要用as对求得的平均值列命名。
    (2)在where后跟多个条件语句的时候,记得使用and 或者 or来连接。
    (3)group by 后跟多个列进行分组时,用逗号分开,其表达的意思是先按第一个属性列中的元素进行分组,在分完组的基础上再根据第二个属性列中的元素进行分组。
    (4)desc表示从大到小(降序),asc表示从小到大(升序)。
    (5)order by 后要写清楚根据那个属性进行升序或者降序进行排序的。
    附加一条不在上面出现的值得注意的点:
    (1)order by 后跟多个属性时,用逗号隔开,其表达的意思是先根据第一个属性进行升(降)序进行排序,当第一个属性中有相同的值存在的时候,再对这些相同值对应的数据根据第二个属性进行升(降)序进行排序。

  • 相关阅读:
    深入浅出Win32多线程程序设计【2】线程控制
    深入浅出Win32多线程程序设计【1】基本概念
    在两个ASP.NET页面之间传递值
    Javascript基础
    DataGrid的几个小技巧
    推荐取代Visio的中国人的软件——Edraw
    ASP.NET如何防范SQL注入攻击
    软件版本号规定原则
    三层体系结构总结(三)
    .Net工具 .NET文档生成工具2.2
  • 原文地址:https://www.cnblogs.com/songziqing/p/5999572.html
Copyright © 2011-2022 走看看