mysql中的where和having和where区别子句的区别

5476人阅读
mysql(8)
Where 是一个约束声明,使用约束来自数据库的数据,是在结果返回之前起作用的,中不能使用聚合函数。
Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在中可以使用聚合函数。
在查询过程中聚合语句要比子句优先执行。而子句在查询过程中执行优先级高于聚合语句。
下面用一个例子进一步说明问题。假设有数据表:
CREATE TABLE
`test`.`salary_info` (
`id` int(10) unsigned NOT NULL auto_increment,
`deparment` varchar(16) NOT NULL default '',
`name` varchar(16) NOT NULL default '',
`salary` int(10) unsigned NOT NULL default '0',
PRIMARY KEY
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
例1:要查找平均工资大于3000的部门
则语句应为:
select deparment, avg(salary) as average from salary_info
group by deparment having average & 3000此时只能使用,而不能使用。一来,我们要使用聚合语句;二来,我们要对聚合后的结果进行筛选(),因此使用会被告知有误。
例:要查询每个部门工资大于的员工个数
sql语句应为:
select deparment, count(*) as c from salary_info
where salary & 3000 group by deparment此处的不可用进行替换,因为是直接对库中的数据进行筛选,而非对结果集进行筛选。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:368922次
积分:3817
积分:3817
排名:第7194名
原创:65篇
评论:40条
(1)(3)(1)(4)(1)(5)(6)(2)(1)(1)(1)(2)(1)(3)(2)(1)(1)(5)(2)(3)(2)(1)(4)(4)(6)(4)(1)(1)(2)(6)关于mysql中
group by ,
语句的区别与运用
关于mysql中
group by ,
语句的区别与运用
最近一直在忙着和数据库有关的一些工作,这几天在写存储过程的时候,一些mysql的语句突然感觉有些不太明白,就是group & by & , &order & by &,where & , &having这些语句,这次通过一个实例来总结和归纳一下,这几个语句的用法,仅供以后参考学习。
一. & 首先以字面形式阐述一下这几个语句的功能:
& & group &by:从英文上理解 &就是分组的意思。需要和 &聚合函数(例如:max(),count(),avg()等)配合使用,使用时至少有一个分组标识字段(例如某一列的列名)。
& & oder &by :从英文上理解就是排序。一般后面跟上某一列的列名,然后查询到的数据会以该列的大小顺序进行排序显示,默认的是ASC(从小到大排列),desc(大到小排列)
& & where: 对查询到的内容进行筛选,where后面跟上限定条件,where使用在分组和排序之后。
& & having:作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
二. &下面来看一个例子:
& & & &首先建立一张,表名为STAFF.
& & 1.假如我们要列出每个部门最高薪水的结果(group &by的使用)。
& & & & 结果显示两列,分别是查询语句中需要的两个列,group by后面指定按照dept分组,正好为三组。注意select语句后面的两个查询对象需要用逗号隔开。
& & 2. 假如我们要按照日期从小到大列出表的信息(order &by 的使用)。
& & & & 如显示结果数据按照日期的大小从小到大依次列出。
& & 3.假如我们只想显示开发部们的信息(where的使用).
& & & 如上显示结果,where后边的限定条件为开发部(字符使用单引号)。
& & 4.假如我们使用group by &分组过后,如1中,如果想筛选出分组后max(salary)大于3000的一组。
& & 如上结果所示,筛选出分组后需要列出的组。
& 5. &下面来在一个例子中综合使用这几个语句。
& & & 假如我们要倒序显示日期大于 中 ,每个部门中工资最高且大于2000的数据。
以上就是关于这几个语句的具体使用,仅供学习交流,有错忘指出。
我的热门文章
即使是一小步也想与你分享oracle中where 子句跟having子句中的区别 - 数据库当前位置:& &&&oracle中where 子句跟having子句中的区别oracle中where 子句跟having子句中的区别&&网友分享于:&&浏览:2次oracle中where 子句和having子句中的区别
1.where 不能放在GROUP BY 后面2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE3.WHERE 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以 Where和Having都是对查询结果的一种筛选,说的书面点就是设定条件的语句。下面分别说明其用法和异同点。注:本文使用字段为oracle数据库中默认用户scott下面的emp表,sal代表员工工资,deptno代表部门编号。一、聚合函数&&& 说明前我们先了解下聚合函数:聚合函数有时候也叫统计函数,它们的作用通常是对一组数据的统计,比如说求最大值,最小值,总数,平均值(MAX,MIN,COUNT, AVG)等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。简单举个例子:SELECT SUM(sal) FROM emp,这里的SUM作用是统计emp表中sal(工资)字段的总和,结果就是该查询只返回一个结果,即工资总和。通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。二、where子句&&& where自居仅仅用于从from子句中返回的值,from子句返回的每一行数据都会用where子句中的条件进行判断筛选。where子句中允许使用比较运算符(&,&,&=,&=,&&,!=|等)和逻辑运算符(and,or,not)。由于大家对where子句都比较熟悉,在此不在赘述。三、having子句&&& having子句通常是与order by 子句一起使用的。因为having的作用是对使用group by进行分组统计后的结果进行进一步的筛选。举个例子:现在需要找到部门工资总和大于10000的部门编号?第一步: select deptno,sum(sal) from筛选结果如下:DEPTNO&& SUM(SAL)------ ----------&&& 30&&&&&& 9400&&& 20&&&&& 10875&&& 10&&&&&& 8750可以看出我们想要的结果了。不过现在我们如果想要部门工资总和大于10000的呢?那么想到了对分组统计结果进行筛选的having来帮我们完成。第二步: select deptno,sum(sal) from emp group by deptno having sum(sal)&10000;筛选结果如下:DEPTNO&& SUM(SAL)------ ----------&&& 20&&&&& 10875当然这个结果正是我们想要的。四、下面我们通过where子句和having子句的对比,更进一步的理解它们。&&& 在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行,简单的理解为只有有了统计结果后我才能执行筛选啊。where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count),因为它是一句一句筛选的。HAVING子句可以让我们筛选成组后的对各组数据筛选。,而WHERE子句在聚合前先筛选记录。如:现在我们想要部门号不等于10的部门并且工资总和大于8000的部门编号?我们这样分析:通过where子句筛选出部门编号不为10的部门,然后在对部门工资进行统计,然后再使用having子句对统计结果进行筛选。select deptno,sum(sal) from emp where deptno!='10' group by deptnohaving sum(sal)&8000; 筛选结果如下:DEPTNO&& SUM(SAL)------ ----------&&& 30&&&&&& 9400&&& 20&&&&& 10875不做太多解释了,这个简单的小例子能够很好的说明where和having的作用。五、异同点&&&& 它们的相似之处就是定义搜索条件,不同之处是where子句为单个筛选而having子句与组有关,而不是与单个的行有关。&&&& 最后:理解having子句和where子句最好的方法就是基础select语句中的那些句子的处理次序:where子句只能接收from子句输出的数据,而having子句则可以接受来自group by,where或者from子句的输入。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 having和where区别 的文章

 

随机推荐