程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql筆試題一:查詢where having以及統計函數的使用

mysql筆試題一:查詢where having以及統計函數的使用

編輯:MySQL綜合教程

mysql筆試題一:查詢where having以及統計函數的使用   題目:   有表如下:   www.2cto.com   只用一個select語句查詢:不及格科目大於或等於2科的學生,的平均分(所有科目的平均分)。   [sql]  <span style="font-size:18px;">mysql> select * from student;   +------+---------+--------+   | name | subject | score |   +------+---------+--------+   | 張三 | 數學    |     80 |   | 張三 | 語文    |     53 |   | 張三 | 英語    |     59 |   | 李四 | 數學    |     55 |   | 李四 | 語文    |     56 |   | 李四 | 英語    |     50 |   | 王五 | 數學    |    100 |   | 王五 | 語文    |     90 |   +------+---------+--------+   8 rows in set</span>     要點:  www.2cto.com   1、要統計每個學生不及格科目的個數。    2、計算平均分。   誤解一:使用count統計。count永遠是統計的所有行!   正解:用sum統計。先計算所有人的平均分,再篩選。   [sql]  <span style="font-size:18px;">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只能用於存在的列。   當然也可以用 子查詢 左鏈接, 這樣反到麻煩了。   題目2:還是上面的表。   查詢每個學生的最大分數的科目及分數。   誤解1:   [sql]  mysql> select *,max(score) from student group by name;   +------+---------+-------+------------+   | name | subject | score | max(score) |   +------+---------+-------+------------+   | 張三 | 數學    |    80 |         80 |   | 李四 | 數學    |    55 |         56 |   | 王五 | 數學    |   100 |        100 |   +------+---------+-------+------------+   3 rows in set     雖然查出了最大分數,但顯示的科目是錯誤的。因為group by總是取第一條記錄。   正解:   1、where 子查詢 (先找到每個學生的最大分數, 在根據分數刷新出記錄)。   [sql]  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     2、from子查詢 (先排序,在group by 拿到第一個,即最大分數的那條記錄)   www.2cto.com   [sql]  mysql> select * from (select * from student order by score desc) as tmp group by name;   +------+---------+-------+   | name | subject | score |   +------+---------+-------+   | 張三 | 數學    |    80 |   | 李四 | 語文    |    56 |   | 王五 | 數學    |   100 |   +------+---------+-------+   3 rows in set     整兩種方法是有很大區別的,第二種只能取出一條記錄,如果最大分數相同的話。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved