一、where过滤条件不能使用聚集函数
1、需求:显示sc 表中成绩大于平均成绩的记录
2、错误写法:select * FROM sc WHERE score>avg(score),这种写法是错的
3、正确写法:select * from sc where score>(select avg(score) from sc ),需要多一个子查询,或许有更方便的方法,可能我没有想到(菜鸟...)
二、group by高级用法
需求:求sc表中,选修3门课的学生所占比例
可能我们一开始,会直接通过group by sid having count(sid)=3去筛选选修3门课的学生,接下来下一步再去统计sc表的sid总数,那样写出来的语句可能就是:
SELECT t1.total,count(t2.sid) as 3_total, count(t2.sid)/t1.total from
(SELECT COUNT(DISTINCT sid) as total from sc) as t1,
(select sid from sc GROUP BY sid having COUNT(sid)=3) as t2
但是更好的语句:
select count(*) ,
count(if(t1.total=3,1,null)),
count(if(t1.total=3,1,null))/count(*)
from (SELECT sid,count(sid) as total FROM sc GROUP BY sid)t1
三、Mysql的执行顺序
开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果
努力努力再努力,认真做练习,不断总结不断深化,才能真正掌握!
第一次写简书,排版美观还不会优化,见谅见谅~~
网友评论