标题:mysql学习第8天having用法以where区别

-------------------------------------------------------------------------------------------------------------------------------

时间:2012/4/24 18:41:05

-------------------------------------------------------------------------------------------------------------------------------

内容:

前面已经学会了利用select from where 表达式

例如我要选成绩不及格的学生名单
select name,score from class where sroce<60
我们还可以进行多条件查询
例如在上面的再加个限制条件只要男学生的不及格的名单 必经女生爱面子嘛
select name,score from class where sroce<60 and sex like 'f%'
但是如果先进行了计算先生成了一列 再对这个新生成的列进行赛选 where就力不从心了
例如
select name,avg(math_score,yuwen_sroce,english_sorcre) as  avg_score from class where avg_score<60
这句话就是错的 报错是 avg_score是不知道的列,原因是 where的执行顺序优先与avg,所以当我们用where avg_score还没诞生  因为我们一旦使用了where 语句先会对每行进行判断 是不是符合
如果符合 在进行后面的运算,所以没法 就要用having ,这样我们直接对结果进行筛选 而不是先筛选 再计算
where和having的区别是
where是先从硬盘读取数据在赛选 再结算 列出
having是先计算 在再选

对一行数据进行计算 新生成一列 需要用列名加符号例如语文分数+数学分数+英语分数



对一列数据记性计算就可以用公式 sum(语文分数+数学分数+英语分数)甚至是
select socre<100,name,id 这样也可以的

前面已经学会了利用select from where 表达式
例如我要选成绩不及格的学生名单
select name,score from class where sroce<60
我们还可以进行多条件查询
例如在上面的再加个限制条件只要男学生的不及格的名单 必经女生爱面子嘛
select name,score from class where sroce<60 and sex like 'f%'
但是如果先进行了计算先生成了一列 再对这个新生成的列进行赛选 where就力不从心了
例如
select name,avg(math_score,yuwen_sroce,english_sorcre) as  avg_score from class where avg_score<60
这句话就是错的 报错是 avg_score是不知道的列,原因是 where的执行顺序优先与avg,所以当我们用where avg_score还没诞生  因为我们一旦使用了where 语句先会对每行进行判断 是不是符合
如果符合 在进行后面的运算,所以没法 就要用having ,这样我们直接对结果进行筛选 而不是先筛选 再计算
where和having的区别是
where是先从硬盘读取数据在赛选 再结算 列出
having是先计算 在再选

对一行数据进行计算 新生成一列 需要用列名加符号例如语文分数+数学分数+英语分数



对一列数据记性计算就可以用公式 sum(语文分数+数学分数+英语分数)甚至是
select socre<100,name,id 这样也可以的