Oracle学习笔记<5>

组函数(多值函数)

数据库中函数的分类:
1)单值函数 Single Rows Functions
特点:n条数据参与函数处理,最终得到n条结果。
2)多值函数(组函数) Multiple Rows Functions
特点:n条数据参与函数处理,得到的结果可能小于n。


1.常见的组函数
avg 计算平均值
max 计算最大值
min 计算最小值
sum 计算代数和
count 计算某个字段非空字段值的总数量

2.组函数语法
select 函数名(字段名)
from 表名
where 条件
[group by 要分组的字段]
[having 分组之后的查询条件];

group by如果不出现,则视为将表中的所有数据分为一个大组。
最终的组函数运算只有一个结果。


关键字:
1)group by 用来指定分组的依据,
例如:group by 字段A
在分组时就会把所有字段A的值相等的
数据分为一组。
2)having
做限定性查询的。
功能类似于where。

位置
1)group by关键字出现在where子句的后面。
2)having 出现在group by后面。
六大关键字书写顺序:
select .. 5
from .. 1
where .. 2
group by .. 3
having .. 4
order by.. 6

注意:
1)出现在select后面的字段,
要么是组函数,要么是出现在group by后面的字段。
即分组的依据字段。
2)where和having的区别
where发生在分组之前,
定义的是有关单值筛选的条件。
在where后面不允许出现组函数。
having发生在分组之后,
定义的是有关小组的筛选条件。
在having后面不允许出现单值条件判断。

练习:
1.查看各个部门的最高工资
select max(salary)
from s_emp
group by dept_id;
2.查看各个部门的员工数
count函数 计算某个字段非空字段值的数量

count(*) 把所有字段的字段值数量都计算出来,
取最大的为查询结果。
count(1)

3.查询各个部门各个职称的平均薪水和最大薪水,并且平均薪水大于2000的部门id;
根据多个字段进行分组:
group by 字段1,字段2...
分组时将所有出现在group by后面的字段值都相等的数据
分为一组。
select avg(salary),max(salary),dept_id
from s_emp
group by dept_id,title
having avg(salary) > 1000;


4.查询title中不包含vp字符串的每个职位的平均薪水和总薪水,并对平均薪水进行降序排列,并且每个职位的总薪水大于5000?
select avg(salary),sum(salary)
from s_emp
where title not like '%vp%'
group by title
having sum(salary) > 5000
order by avg(salary) desc;

作业:
1)查询所有员工的平均工资,最高工资最低工资,工资总和,还有有多少个员工?
select avg(salary),max(salary),min(salary),
sum(salary),count(*)
from s_emp;
2)查询每个部门的平均工资?对平均工资降序排序.平均工资大于1400.
select avg(salary)
from s_emp
group by dept_id
having avg(salary) > 1400
order by avg(salary) desc;
3)查看各个部门的最高工资
select dept_id,max(salary)
from s_emp
group by dept_id;
4)查看各个部门的员工数
select count(*)
from s_emp
group by dept_id;
5)查询各个部门各个职称的平均薪水和最大薪水,
并且平均薪水大于2000的部门id。
select avg(salary),max(salary),dept_id
from s_emp
group by dept_id,title
having avg(salary) > 2000;
6)查询title中不包含vp字符串的每个职位的平
均薪水,并对平均薪水进行降序排列,并且每个职位
的总薪水大于5000。
select avg(salary)
from s_emp
where title not like '%vp%'
group by title
having sum(salary) > 5000
order by avg(salary) desc;

8)查看每个区域部门数?
区域-部门:1对多
select count(*)
from s_dept
group by region_id;

查询每个部门的员工数?
select count(*)
from s_emp
group by dept_id;
9)查询南美地区的部门数?
区域名字 = 南美
select count(*)
from s_dept d,s_region r
where d.region_id = r.id
and r.name = 'South America';
10)查询南美地区工资大于1400的员工的信息?
三表查询
select e.id,e.last_name,e.salary
from s_emp e,s_dept d,s_region r
where e.dept_id = d.id
and d.region_id = r.id
and r.name = 'South America'
and e.salary > 1400;

方式二:子查询(嵌套查询)
select id,last_name,salary
from s_emp
where dept_id in(select d.id
from s_dept d,s_region r
where d.region_id = r.id
and r.name = 'South America');

SQL:查询所有工作在南美区域的部门id?
select d.id
from s_dept d,s_region r
where d.region_id = r.id
and r.name = 'South America';


原文地址:https://www.cnblogs.com/weixinyu98/p/9999395.html