【Oracle】Oracle的sql分组查询查询

一、介绍

有一张用户表,查询表结构语句如下:

select dbms_metadata.get_ddl('TABLE','USERS') from dual;

表结构如下:

  CREATE TABLE "PMSS"."USERS" 
   (    "ID" NUMBER(10,0) NOT NULL ENABLE, 
    "NAME" VARCHAR2(40), 
    "AGE" NUMBER(10,0), 
    "DEPT" VARCHAR2(10), 
    "SALARY" NUMBER(10,0), 
    "BIRTHDAY" DATE, 
     PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "PMSS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "PMSS" 

表截图
这里写图片描述

二、查询
1、总计各个部门有多少人?

SELECT count(1),dept FROM users
WHERE 1=1
GROUP BY dept;

查询结果
这里写图片描述

2、查询各个部门薪资比部门平均水平高的人员记录
首先,我们先查各个部门平均工资:
这里写图片描述

然后,我们在查询个人工资比自己部门平均工资大的:
这里写图片描述

sql语句如下:

SELECT u.* FROM USERS u,
(
SELECT u.DEPT,avg(u.SALARY) as avgSalary FROM USERS u
GROUP BY u.DEPT
) a
WHERE 1=1
AND u.DEPT=a.DEPT
AND u.SALARY>a.avgSalary;

三、分析
我们来分析下,为什么不能这么写:
这里写图片描述

1、首先,小括号里面的句子,叫做子查询,系统默认子查询出来的结果,是一个结果集,其本质就是一张表;
2、FROM后面跟的一定是个表或者结果集;所以,子查询结果,一定只能放在FROM后面;
4、整个句子查询的主题是:
这里写图片描述
当第一行执行完,所有人的工资都查询出来了,但是,接下来要子查询了,这里有两种理解:
第一种:第一行红色框内的表示并列的逗号,并列的是两个句子,而不是两张表;
第二种:第一行红色框内的表表示并列的逗号,并列的是两张表;
到底哪一种对呢?
第二种:
因为:
这里写图片描述
按照两个句子来查是查不出来的;

5、并且两边的结果集是乘的形式,如果没有限制条件会怎么样呢?
这里写图片描述
总计25条记录,没有限制条件,
5、限制条件:所以,筛选的时候,部门限制条件得加上;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶洲川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值