SQL中的where和having

时间:2024-10-22 08:59:30

文章目录

  • MySQL中where和having的区别
    • 区别
    • 代码展示
        • where的简单用法
        • having的简单用法(需要用到分组)
        • where无法使用聚合函数计算

MySQL中where和having的区别

Where 是⼀个约束声明,使⽤Where来约束来之数据库的数据,Where是在结果返回之前起作⽤的。
Having是⼀个过滤声明,是在查询返回结果集以后对查询结果进⾏的过滤操作。

区别

  1. 在sql语句中执行的顺序不同,同时使用时where优先于having;
  2. 用法不同,where是用于分组(group by)前进行条件过滤,而having是用于分组(group by)后进行条件过滤;
  3. 聚合函数的使用条件不同,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后面可以使用“聚合函数”。