聚合函數,分組查詢,連接查詢綜合例子

實例如下:
update users set classes='1' where id in('u001','u002','u003','u004');
update users set classes='2' where id in('u005','u006','u007');
users表的內容如下:
+------+-----------+------------+------+-------+---------+
| id | firstname | secondname | age | count | classes |
+------+-----------+------------+------+-------+---------+
| u001 | 張 | 飛 | 18 | 60 | 1 |
| u002 | 趙 | 雲 | 20 | 58 | 1 |
| u003 | 關 | 羽 | 22 | 80 | 1 |
| u004 | 劉 | 備 | 25 | 98 | 1 |
| u006 | 黃 | 蓋 | 18 | NULL | 2 |
| u005 | 王 | 子云 | 12 | 20 | 2 |
| u007 | 諸葛 | 亮 | 24 | 100 | 2 |
+------+-----------+------------+------+-------+---------+
查詢1班和2班的平均成績:
select avg(count) from users group by classes;
//上面這種做法也是錯誤的。原因是從表中數據可以看出,count列的值有null值,這樣的話聚合函數,求平均值的時候是不
會計算null值的。
select sum(count) from users group by classes;//各組count總和
select count(*) from users group by classes;//各組人員個數
select sum(count)/count(*) as avg from users group by classes;//各組count平均值
查詢班級平均成績不及格的班級詳細人員信息
select sum(count)/count(*) as avg from users group by classes;
select classes,sum(count)/count(*) as avg from users group by classes;->temp
(select classes,sum(count)/count(*) as avg from users group by classes)as temp
//查出班級的平均分數小於60的組 和平均分。
select classes,sum(count)/count(*) as avg from users group by classes having avg<60;-temp
//最終輸出結果的語句(將原來的表和臨時表做連接查詢)
select * from users,
(select classes,sum(count)/count(*) as avg from users group by classes having avg<60)as temp
 where users.classes=temp.classes;
//having 子句的作用。
1.聚合函數,一般用於分組查詢。
2.分組查詢中的select的數據項,只能是聚合函數,和分組的數據項本身。
比如,上面的group by classes中,在查詢中除了聚合函數以外,只可能出現classes數據項。
出現其它數據項,語法上,不會直接報錯,但是沒有任何意義。
3.對於having子句,只用於分組,是對分組查詢結果進行條件限制的。
也就是說在這個例子中,having子句中只能出現對classes的限定和聚合函數的值的限定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章