目录
1.分组函数
2.HAVING子句
3.SELECT语句执行过程
4.子查询
1.分组函数
(1)为什么要使用分组函数:
分组函数是对数据行的集合进行操作并按组给出一个结果,这个结果可直接输出,或者用来做判断条件。
(2)分组函数和单行函数的区别
单行函数:对单行数据进行操作,只返回一个值
分组函数:处理一组数据,返回一个值
(3)分组函数概念
分组函数是对表中一组记录进行操作,每组只返回一个结果,即首先要对表记录进行分组,然后再进行操作汇总,每组返回一个结果,分组时可能是整个表分为一组,也可能根据条件分成多组。
(4)分组函数常用到的五个函数
- MIN:返回每组中的最小值
- MAX:返回每组中的最大值
- SUM:计算每组的总和
- AVG:计算每组的平均值
- COUNT:计算每组的记录数
(4)语法
SELECT [column,] group_function(column)
FROM table
[WHERE condition]
[GROUP BY column]
[HAVING group_function(column)expression
[ORDER BY column| group_function(column)expression];
- 通过 GROUP BY 子句可将表中满足WHERE条件的记录按照指定的列划分成若干个小组;其中GROUP BY子句指定要分组的列
- GROUP BY子句还可以按多列分组
例子:
select count(mgr) from emp;
-- 因为emp表中有部分员工没有经理,所有该sql查询的是有经理的员工总数,而不是所有员工总数
select min(sal) from emp; -- 得到最低工资
select max(sal) from emp; -- 得到最高工资
select sum(comm) from emp; -- 计算所有员工的奖金总和
select avg(sal) from emp group by deptno;
-- 按照部门分组,查询每个部门的平均工资
select count(distinct deptno) from emp; -- 计算有多少个部门
-- 查询每个部门每个岗位的工资总和。
SELECT deptno, job, sum(sal)
FROM emp
GROUP BY deptno, job;
2.HAVING子句
(1)作用
排除组结果
(2)HAVING子句和WHERE子句的区别
①HAVING子句用于限制分组后的数据
②WHERE子句用于限制分组前的数据
(3)语法
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
(4)例子
-- 查询每个部门最高工资大于2900的部门编号,最高工资
select deptno 部门编号, max(sal)
from emp
group by deptno
having max(sal) > 2900;
3.SELECT语句执行过程
SELECT语句执行过程:
- 1.通过FROM子句中找到需要查询的表;
- 2.通过WHERE子句进行非分组函数筛选判断;
- 3.通过GROUP BY子句完成分组操作;
- 4.通过HAVING子句完成组函数筛选判断;
- 5.通过SELECT子句选择显示的列或表达式及组函数;
- 6.通过ORDER BY子句进行排序操作。
SELECT deptno,job,avg(sal) -- 5
FROM emp -- 1
WHERE job in ('SALESMAN','MANAGER','CLERK') -- 2
GROUP BY deptno,job -- 3
HAVING avg(sal)>1000 -- 4
ORDER BY 3 DESC; -- 6
-- 口诀(服务工还是我)
-- 服:FROM
-- 务:WHERE
-- 工:GROUP
-- 还:HAVING
-- 是:SELECT
-- 我:ORDER
4.子查询
(1)定义
括号内的查询叫做子查询,也叫内部查询,先于主查询执行。
(2)语法
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list FROM table);
括号内的查询叫做子查询,也叫内部查询,先于主查询执行。
子查询的结果被主查询(外部查询)
使用 expr operator包括比较运算符。
- 单行运算符:>、=、>=、<、<>、<=
- 多行运算符: IN、ANY、ALL
(3)子查询可以嵌套的子句
- WHERE子句
- HAVING子句
- FROM子句
(4)注意
- 子查询要用括号括起来
- 将子查询放在比较运算符的右边
- 对于单行子查询要使用单行运算符
- 对于多行子查询要使用多行运算符
(5)子查询使用指导
- 子查询要用括号括起来
- 将子查询放在比较运算符的右边
- 对于单行子查询要使用单行运算符
- 对于多行子查询要使用多行运算符
(6)子查询分类
- 单行子查询
- 多行子查询
- 多列子查询
(7)子查询中的空值
-- 查询不是经理的员工姓名
select ename 员工姓名
from emp
where empno not in(select mgr from emp);
上面的sql查询不到任何数据,因为子查询的结果中有一条空值,这条空值导致主查询没有记录返回。这是因为所有的条件和空值比较结果都是空值。因此无论什么时候只要空值有可能成为子查询结果集合中的一部分,就不能使用NOT IN 运算符。