![]()
总结:where -> group by -> having -> order by -> limit 顺序不能错!!
要求:查询出2门及2门以上不及格者的平均成绩 ## 一种错误做法 mysql> select name,count(score<60) as k,avg(score) from stu group by name having k>=2; +------+---+------------+ | name | k | avg(score) | +------+---+------------+ | 张三 | 3 | 60.0000 | | 李四 | 2 | 50.0000 | +------+---+------------+ 2 rows in set (0.00 sec) #加上赵六后错误暴露 mysql> insert into stu -> values -> ('赵六','A',100), -> ('赵六','B',99), -> ('赵六','C',98); Query OK, 3 rows affected (0.05 sec) Records: 3 Duplicates: 0 Warnings: 0 #错误显现 mysql> select name,count(score<60) as k,avg(score) from stu group by name having k>=2; +------+---+------------+ | name | k | avg(score) | +------+---+------------+ | 张三 | 3 | 60.0000 | | 李四 | 2 | 50.0000 | | 赵六 | 3 | 99.0000 | +------+---+------------+ 3 rows in set (0.00 sec) 错误:count() 括号无论写什么 都是算出总行数!所以不能计算score<60的行数!! 正确 :
因为十八哥说: 列就是变量 变量是可以运算的! 然后这里的列是score<60 这个列逐行经过运算,得到是否为真的结果!所以记住 列是变量 可以运算 逐行运算。
注意:一开始又会以为用count(score<60) 是错误的 它是计算行数的~
总结:where -> group by -> having -> order by -> limit
顺序不能错!!列是变量,变量是可以运算的!! 一行一行的运算!每一行就是变量的不同值。 例如score<60 都可以作为一个列, 返回的运算后的结果 真的返回1 假返回0!
查询的发生过程!解剖group by where having的用法!+面试题
最新推荐文章于 2022-08-15 22:57:40 发布