你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Mysql第四天笔记03——高级查询

2021/12/31 8:52:22

目录

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包括比较运算符。

  • 单行运算符:>=>=<<><=
  • 多行运算符: INANYALL 

(3)子查询可以嵌套的子句

  • WHERE子句
  • HAVING子句
  • FROM子句

(4)注意

  • 子查询要用括号括起来
  • 将子查询放在比较运算符的右边
  • 对于单行子查询要使用单行运算符
  • 对于多行子查询要使用多行运算符

(5)子查询使用指导

  • 子查询要用括号括起来
  • 将子查询放在比较运算符的右边
  • 对于单行子查询要使用单行运算符
  • 对于多行子查询要使用多行运算符

(6)子查询分类

  • 单行子查询
  • 多行子查询
  • 多列子查询 

 (7)子查询中的空值

-- 查询不是经理的员工姓名
select ename 员工姓名
from emp 
where empno not in(select mgr from emp);

上面的sql查询不到任何数据,因为子查询的结果中有一条空值,这条空值导致主查询没有记录返回。这是因为所有的条件和空值比较结果都是空值。因此无论什么时候只要空值有可能成为子查询结果集合中的一部分,就不能使用NOT IN 运算符。