MySQL Having使用

本文介绍了SQL中的Having子句,作为Where子句的补充,用于对查询结果进行二次过滤。通过示例展示了如何使用Having求除特定部门外的员工数量以及人数超过3人的部门。强调了在何时使用Having更为合适。
摘要由CSDN通过智能技术生成

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值