单行函数 聚合函数 分组的使用

单行函数

select *|字段名 别名,… from 数据来源 where 条件 or|and 条件…

Union,并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序;
Union All,全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序 ;
Intersect,交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus,差集(减去重复) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序

以员工表,部门表为例:

--查询30部门的员工或 者薪资>2000
select * from emp where deptno = 30 or sal > 2000;
select * from emp where deptno = 30
Union
select * from emp where sal > 2000;
select * from emp where deptno = 30
Union All
select * from emp where sal > 2000;

--查询不存在员工的部门的部门编号
select deptno from dept
Minus
select distinct deptno from emp;
--查询公司所有部门的部门编号
select deptno from dept;

--查询公司中有员工存在的部门的 部门编号
select distinct deptno from emp;

--like 模糊匹配  %任意个任意字符     _一个任意字符
select * from emp where ename like 'SMITH';  --精确匹配
--查询公司中员工姓名 以A开头的员工信息
select * from emp where ename like 'A%';
--查询公司中员工姓名 第二个字符为A的员工信息
select * from emp where ename like '_A%';
--查询公司中员工姓名 中存在%的员工   escape('a');  转义字符
select * from emp where ename like '%\%%' escape('\');

聚合函数

也称为:组函数,多行函数

排序: 先确定结果集然后对于结果集中的数据进行排序
select 数据 from 数据来源 where 条件 order by 排序字段1,排序字段…; desc 降序 asc升序(默认)
from where select order by

–组函数|聚合函数|多行函数 : 对结果集进行组函数计算
–多行记录返回一个结果
–count(条件) sum(条件) max() min() avg()
–注意: 组函数不能和非分组字段一起使用,例如where

-- 统计一下一共有多少个员工
select count(empno) from emp;
select count(deptno) from emp;
select count(*) from emp;
select count(1) from emp;  --伪列  相当于为每条数据的后面添加一个伪列字段 1

-- 统计一共有几个部门 
select count(1) from dept;

-- 统计有员工存在的部门总数
--查询有员工存在的部门编号的结果集,对这个结果集求个数
select count(distinct deptno) from emp;
select count(1)
  from dept
 where deptno in (select distinct deptno from emp);


-- 统计20部门一共有多少人
select count(deptno|1|*..) from emp where deptno =20;

-- 计算本公司每个月一共要在工资上花费多少钱
select sum(sal) from emp;

-- 计算20部门每个月的工资花销
select sum(sal) from emp where deptno = 20;

-- 查询本公司的最高工资和最低工资
select max(sal) from emp;
select min(sal) from emp;

--查看30部门的最高工资和最低工资
select max(sal),min(sal) from emp where deptno = 30;

-- avg 平均工资
select avg(sal) from emp;

-- 请查询出 20部门的平均工资
select avg(sal) from emp where deptno = 20;


-- 计算出所有员工的奖金总和  null 不参与运算
select sum(comm) from emp  where comm is not null;

-- 统计一共有多少个员工 null 不参与运算
-- 统计有奖金的员工有几个
select count(comm) from emp;


--查询 最高薪水的员工姓名, 及薪水
select max(sal) from emp;
select ename from emp where sal = (select max(sal) from emp);

-- 查询工资低于平均工资的员工编号,姓名及工资
select empno,ename,sal from emp where sal < (select avg(sal) from emp);

分组

分组: group by 分组字段

查询公式:select 数据 from 数据来源 where 行过滤条件 group by 分组字段1,… having 过滤组信息(以组为单位过滤) order by 排序字段…;
执行流程: from – where --group by --having --select – order by

注意:
1)select 后如果出现了组函数|分了组,组函数不能与非分组字段,可以与其他组函数或分组字段一起使用
2)where 后不能使用组函数 因为还没有组,执行流程问题

--求出所有有员工存在的部门编号
select deptno from emp group by deptno;

-- 找出20部门和30部门的最高工资 
--20部门和30部门中的所有员工中的最高工资 
select max(sal) from emp where deptno in (30,20);
--找出20部门和30部门中每个部门的最高工资 
select max(sal),deptno from emp where deptno in (30,20) group by deptno;  --先过滤 后分组
select max(sal),deptno from emp group by deptno having deptno in (30,20); --先分组再过滤

-- 求出每个部门的平均工资
--数据: 每组的平均薪资
--来源: 员工表 
--条件: 一个部门一个部门求平均薪资  ,一个部门一个值  以部门为单位 如果不分组组函数对所有满足条件的数据进行计算,如果分组了,以组为单位
select avg(sal),deptno from emp group by deptno;

-- 求出每个部门员工工资高于1000的的部门平均工资
--数据: 部门平均工资
--来源: 员工表 
--条件: sal>1000 以部门为单位:按照部门进行分组
select avg(sal),deptno from emp where sal>1000 group by deptno;

-- 求出10和20部门部门的哪些工资高于1000的员工的平均工资
select avg(sal),deptno from emp where sal>1000 group by deptno having deptno in(10,20);
--不推荐使用,效率相对较低
select * from (select avg(sal),deptno from emp where sal>1000 group by deptno) where deptno in(10,20);

-- 找出每个部门的最高工资
select max(sal) from emp group by deptno;


-- 求出每个部门的平均工资高于2000的部门编号和平均工资
select avg(sal),deptno from emp group by deptno having avg(sal)>2000 ;
select * from (select avg(sal) avg_sal,deptno from emp group by deptno) where avg_sal>2000;

你可能感兴趣的:(单行函数 聚合函数 分组的使用)