Oracle的sql分组查询实例讲解,oraclesql实例讲解
一、介绍
有一张用户表,查询表结构语句如下:
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、限制条件:所以,筛选的时候,部门限制条件得加上;
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。