微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle数据库 —— SQL之select语句5

6 select语句

6.6 组函数与分组

6.6.1 组函数

对一组数据处理之后返回一个结果。

1、常见的组函数:count、max、min、sum、avg
  求s_emp表中的员工个数 工资的最大值 工资的最小值
    select count(id),max(salary),min(salary) from s_emp;
  求员工工资的和 和 员工工资的平均值
    select sum(salary),avg(salary) from s_emp;
    
2、组函数中可以使用distinct关键字
  select sum(distinct salary),avg(distinct salary) from s_emp;

3、组函数对NULL值的处理特点
  求提成的和和提成的平均值
    select sum(commission_pct),avg(commission_pct) from s_emp;

6.6.2 分组

1、group by 分组标准;
  按照部门编号把员工数据分组,并统计部门人数
    select dept_id,count(id) from s_emp group by dept_id;
    select count(id) from s_emp where dept_id is null;
  按照部门号分组统计每个组的平均工资
    select dept_id,avg(salary) from s_emp group by dept_id;

2、对组数据进行过滤 — having
  要求显示平均工资大于2000的
    select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>2000;

3、sql的执行顺序
  select dept_id,avg(salary) asal from s_emp group by dept_id having asal>2000;
第 1 行出现错误:
ORA-00904: “ASAL”: 标识符无效
select dept_id,avg(salary) asal from s_emp group by dept_id having avg(salary)>2000 order by asal;

->from->where->group by->having-> select->order by

4、按照部门号分组 统计每个部门的人数 显示人数大于1的部门
列出dept_id 人数 部门名
  select dept_id,count(id) from s_emp group by dept_id having count(dept_id)>1;
  select dept_id,count(e.id),name from s_emp e,s_dept d where e.dept_id=d.id group by dept_id,name having count(e.id)>1;

/在分组语句中select后的字段要么是分组标准,要么是经过合适的组函数处理过的,没有第三种可能/
  select dept_id,max(name) from s_emp e,s_dept d where e.dept_id=d.id group by dept_id having count(e.id)>1;
因为有可能部门ID不一样,但部门名一样
DEPT_ID COUNT(E.ID) MAX(NAME)
  42    3     Operations
  34    2     Sales
  43    2     Operations
  44    2     Operations
  31    2     Sales
  50    2     Administration
  41    4     Operations

  select dept_id,s_dept d where e.dept_id=d.id(+) group by dept_id having count(e.id)>1;/显示空部门/

6.7 子查询

一个查询的结果作为另一个查询的基础。

a、子查询用在where后
  /找出所有的领导员工编号/
  select distinct manager_id from s_emp;
  谁是领导?
  select id,first_name from s_emp where id in(select distinct manager_id from s_emp);
  谁是普通员工?not in(注意null,和null比判断不了,返回假)
  select id,first_name from s_emp where id not in(select distinct manager_id from s_emp /* where manager_id is not null */);
  select id,first_name from s_emp where id not in(select distinct manager_id from s_emp where manager_id is not null);

b、子查询用在having后
  按照部门号分组,求每个部门的平均工资
  要求显示大于50部门的平均工资的部门
  select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>(select avg(salary) from s_emp where dept_id=50);

c、子查询用在from后面(分页技术中会用到)   任何一条sql都对应内存中一张表   select id,first_name name,salary from s_emp;   select name,salary from (select id,salary from s_emp) where salary>1000;

原文地址:https://www.jb51.cc/oracle/211708.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐