欢迎投稿

今日深度:

Oracle的sql分组查询实例讲解,oraclesql实例讲解

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、限制条件:所以,筛选的时候,部门限制条件得加上;

www.htsjk.Com true http://www.htsjk.com/oracle/24470.html NewsArticle Oracle的sql分组查询实例讲解,oraclesql实例讲解 一、介绍 有一张用户表,查询表结构语句如下: select dbms_metadata.get_ddl(TABLE,USERS) from dual; 表结构如下: CREATE TABLE PMSS.USERS ( ID NUMBER(10,0)...
评论暂时关闭