文章目录
- MySQL中where和having的区别
- 区别
- 代码展示
- where的简单用法
- having的简单用法(需要用到分组)
- where无法使用聚合函数计算
MySQL中where和having的区别
Where 是⼀个约束声明,使⽤Where来约束来之数据库的数据,Where是在结果返回之前起作⽤的。
Having是⼀个过滤声明,是在查询返回结果集以后对查询结果进⾏的过滤操作。
区别
- 在sql语句中执行的顺序不同,同时使用时where优先于having;
- 用法不同,where是用于分组(group by)前进行条件过滤,而having是用于分组(group by)后进行条件过滤;
- 对聚合函数的使用条件不同,where不能使用聚合函数,而having可以使用聚合函数;在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。
代码展示
首先建两个表,部门表和员工表:
-- 部门表
create table dept(
deptno int primary key auto_increment, -- 部门编号
dname varchar(14) , -- 部门名字
loc varchar(13) -- 地址
) ;
-- 员工表
create table emp(
empno int primary key auto_increment,-- 员工编号
ename varchar(10), -- 员工姓名 -
job varchar(9), -- 岗位
mgr int, -- 直接领导编号
hiredate date, -- 雇佣日期,入职日期
sal int, -- 薪水
comm int, -- 提成
deptno int not null, -- 部门编号
foreign key (deptno) references dept(deptno)
);
insert into dept values(10,'财务部','北京');
insert into dept values(20,'研发部','上海');
insert into dept values(30,'销售部','广州');
insert into dept values(40,'行政部','深圳');
insert into emp values(7369,'刘一','职员',7902,'1980-12-17',800,null,20);
insert into emp values(7499,'陈二','推销员',7698,'1981-02-20',1600,300,30);
insert into emp values(7521,'张三','推销员',7698,'1981-02-22',1250,500,30);
insert into emp values(7566,'李四','经理',7839,'1981-04-02',2975,null,20);
insert into emp values(7654,'王五','推销员',7698,'1981-09-28',1250,1400,30);
insert into emp values(7698,'赵六','经理',7839,'1981-05-01',2850,null,30);
insert into emp values(7782,'孙七','经理',7839,'1981-06-09',2450,null,10);
insert into emp values(7788,'周八','分析师',7566,'1987-06-13',3000,null,20);
insert into emp values(7839,'吴九','总裁',null,'1981-11-17',5000,null,10);
insert into emp values(7844,'郑十','推销员',7698,'1981-09-08',1500,0,30);
insert into emp values(7876,'郭十一','职员',7788,'1987-06-13',1100,null,20);
insert into emp values(7900,'钱多多','职员',7698,'1981-12-03',950,null,30);
insert into emp values(7902,'大锦鲤','分析师',7566,'1981-12-03',3000,null,20);
insert into emp values(7934,'木有钱','职员',7782,'1983-01-23',1300,null,10);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
where的简单用法
如题:列出在部门 “销售部” 工作的员工的姓名,假定不知道销售部的部门编号。
select e.ename from emp e left join dept d on d.deptno = e.deptno where d.dname = '销售部';
- 1
having的简单用法(需要用到分组)
如题:列出最低薪金大于1500的各种工作。
SELECT job FROM emp GROUP BY job HAVING min(sal + IFNULL(comm,0)) > 1500 ;
- 1
where无法使用聚合函数计算
如题:列出薪金高于公司平均薪金的所有员工。。
思路一:使用where直接放聚合函数计算
select ename from emp where sal + IFNULL(comm,0) > avg(sal + IFNULL(comm,0)) ;-- where里面不能放聚合函数
- 1
报错,无法查找到。
思路二:使用select子查询
select ename from emp where sal + IFNULL(comm,0) > (select avg(sal + IFNULL(comm,0)) from emp );
- 1
成功。
结论:“Where”是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”;
“Having”是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用“聚合函数”。