SQL Server中的having(对分组后的信息过滤)

零、码仙励志

趁年轻去努力,别对不起你儿时吹的牛逼

一、建库和建表

create database scort
use scort
create table emp
(
	empno int primary key,
	ename nvarchar(10),
	sal int,
	deptno int
)
insert into emp values (7369,'smith',1800,20);
insert into emp values (7499,'allen',1500,10);
insert into emp values (7521,'ward',1600,30);
insert into emp values (7566,'jones',2000,30);
insert into emp values (7654,'martin',1800,10);
insert into emp values (7698,'blake',1800,30);

SQL Server中的having(对分组后的信息过滤)_第1张图片

二、having的用法

1.解释:having子句是用来对分组之后的信息进行过滤,因此使用having时通常都会先使用group by。

select deptno,avg(sal) from emp group by deptno having avg(sal)>1700
--查找不同deptno的平均sal,输出平均sal大于1700的

SQL Server中的having(对分组后的信息过滤)_第2张图片

2.如果没有使用group by但使用了having,则意味着对整体信息进行过滤,例:

select count(*) from emp having avg(sal)>1700

3.having子句出现的字段必须的是分组之后的组的整体信息,having子句不允许出现组内的详细信息

4. 尽管select字段中可以出现别名,但是having子句中不能出现字段的别名,只能使用字段最原始的名字!例:

select deptno,avg(sal) "平均sal" from emp group by deptno having avg(sal)>1700
--查找不同deptno的平均sal,输出平均sal大于1700的

SQL Server中的having(对分组后的信息过滤)_第3张图片

select deptno,avg(sal) "平均sal" from emp group by deptno having "平均sal">1700  --error

5. having和where的异同:

相同:
  都是对数据过滤,只保留有效的数据;
  where和having一样,  都不允许出现字段的别名;
  只允许出现最原始的字段的名字。

不同:
   where是对原始的记录过滤having是对分组之后的记录过滤;
   where必须的写在having的前面,顺序不可颠倒否则运行出错。

本篇博客来自于郝斌老师视频教程的总结以及笔记的整理,仅供学习交流,切勿用于商业用途,如有侵权,请联系博主删除,博主QQ:194760901 

你可能感兴趣的:(Sql,Server)