一、介绍
有一张用户表,查询表结构语句如下:
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、限制条件:所以,筛选的时候,部门限制条件得加上;