1、 数据库表
表设计来源于:https://blog.csdn.net/xiaoyoupei/article/details/111305352
数据相同,只是对备注增加了修改,学习SQL基础的可以看原博主的帖子。
此处粘贴修改后的数据:
# 创建员工表
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp`
(
`EMPNO` int(4) NOT NULL COMMENT '工号',
`ENAME` varchar(10) DEFAULT NULL COMMENT '姓名',
`JOB` varchar(9) DEFAULT NULL COMMENT '工作岗位',
`MGR` varchar(10) DEFAULT NULL COMMENT '部门经理',
`HIREDATE` date DEFAULT NULL COMMENT '受雇日期',
`SAL` int(7) DEFAULT NULL COMMENT '薪金',
`COMM` int(7) DEFAULT NULL COMMENT '奖金',
`DEPTNO` int(2) DEFAULT NULL COMMENT '部门编号',
PRIMARY KEY (`EMPNO`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
# 添加数据
insert into `emp`(`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`)
values ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800', null, '20'),
('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600', '300', '30'),
('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250', '500', '30'),
('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975', null, '20'),
('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250', '1400', '30'),
('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850', null, '30'),
('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450', null, '10'),
('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000', null, '20'),
('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000', null, '10'),
('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500', '0', '30'),
('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100', null, '20'),
('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950', null, '30'),
('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000', null, '20'),
('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300', null, '10');
# 部门表 增加数据
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`
(
`DEPTNO` int(2) NOT NULL COMMENT '部门编号',
`DNAME` varchar(14) DEFAULT NULL COMMENT '部门名称',
`LOC` varchar(13) DEFAULT NULL COMMENT '部门所在地址',
PRIMARY KEY (`DEPTNO`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
insert into `dept`(`DEPTNO`, `DNAME`, `LOC`)
values ('10', 'ACCOUNTING', 'NEW YORK'),
('20', 'RESEARCH', 'DALLAS'),
('30', 'SALES', 'CHICAGO'),
('40', 'OPERATIONS', 'BOSTON');
2、Having 功能介绍
说到Having 和 Where的功能类似,都是对查询的数据进行过滤。
这里说到了,有了where,为什么还需要having ,这里可以看作对where 功能的增强。
having 应用于 查询结果后的二次过滤,我们不能使用两个where,having 就是第二个where的作用。
3、示例
3.1、示例1:求除SALES 部分外其他的部门各有多少人
SELECT
deptno,
count( * ) AS count
FROM emp
GROUP BY deptno
HAVING deptno != (
SELECT deptno FROM dept
WHERE dname = 'sales'
)
结果:
以上就是having的简单用法,结果很直观。
但是其实这个SQL可以不使用Having,只使用where也可以得到结果:
SELECT
count( * ),
t2.dname,
t1.deptno
FROM
emp t1
LEFT JOIN dept t2 ON t1.deptno = t2.deptno
WHERE
t2.dname != 'sales'
GROUP BY
t1.deptno
3.2、示例2:求人数多于3人的部门
SELECT
deptno,
count( * ) AS count
FROM emp
GROUP BY deptno
HAVING count > 3
这个时候就需要使用了,因为必须先分组,再过滤。
4、总结
Having 在SQL中还是很有必要的,但是使用的时候需要注意,如果可以只使用where,就不要使用having。