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,我们会在尽快处理。