oracle的表的数据管理3 -- 复杂查询
2013-11-29 21:17
537 查看
数据分组 – max,min,avg,sum,count
Eg: 数据分组查询,熟练应用max,min,avg,sum,count | |
1. (min max) | SQL> select min(sal),max(sal) fromemp; MIN(SAL) MAX(SAL) 800 5000 查询出最大工资和最少工资 |
2. (min max) | SQL> select ename,sal fromemp where sal=(select max(sal) from emp); ENAME SAL KING 5000.00 查询出员工中工资最高的人(子查询) |
3. (avg sum) | SQL> select avg(sal),sum(sal) fromemp; AVG(SAL) SUM(SAL) 2073.21428 29025 查询员工的平均工资和总工资 |
4. (count) | SQL> select count(ename) from emp; COUNT(ENAME) 14 查询员工总人数 |
5. (avg 子查询) | SQL> select * from emp where sal>(selectavg(sal) from emp); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 查询出工资高于平均工资的人的信息 |
Groupby 和having子句
1. Groupby 用于对查询的结果分组统计2. Having 子句用于限制分组的显示结果
Eg:groupby和having语句的熟练应用。注意group by后可以跟多个条件 | |
1.( Group by) | SQL> selectDEPTNO,avg(sal),sum(sal) from emp group by DEPTNO order byDEPTNO; DEPTNO AVG(SAL) SUM(SAL) 10 2916.66666 8750 20 2175 10875 查询每个部门的平均工资和最高工资 |
2. (group by) | SQL> selectDEPTNO,avg(sal),job from emp group by DEPTNO,job order by DEPTNO; DEPTNO AVG(SAL) JOB 10 1300 CLERK 10 2450 MANAGER 10 5000 PRESIDENT查询每个部门的每种岗位的平均工资和最低工资 |
3. (group By, having) | SQL> selectdeptno,avg(sal) from emp group by deptno having avg(sal)<(select avg(sal) fromemp); DEPTNO AVG(SAL) 30 1566.66666 查询出部门平均工资低于平均工资的部门及其平均工资 |
4. 如果在select语句中同时包含group by、having和order by,那么他们的顺序是group by→having→order by
5. 在选择列中如果有列、表达式和分组函数,那么至少有一个要出现在group by字句中,否则则会出错。 ---(oracle11g测试分组条件可以不出现在查询字段中)
Oracle的多表查询
---基于2个或两个以上的表的查询
Eg:表的联力查询 | |
1. (a1.no= a2.no) | 显示雇员名,雇员工资和所在部门的名称 |
SQL> select ename,sal,DNAME from emp,dept whereemp.DEPTNO = dept.DEPTNO; ENAME SAL DNAME CLARK 2450.00 ACCOUNTING SCOTT 3000.00 RESEARCH WARD 1250.00 SALES | |
2. (and ) | 显示部门号为10的部门名和员工和工资 |
SQL> select ename,sal,DNAME from emp,dept whereemp.DEPTNO = dept.DEPTNO and emp.deptno=10; ENAME SAL DNAME CLARK 2450.00 ACCOUNTING | |
3. (between and) | 显示雇员的性命,工资及其工资的级别 – (添加表salgrade) |
SQL> select ename,sal,grade from emp,salgradewhere emp.sal between salgrade.losal andsalgrade.hisal; ENAME SAL GRADE SMITH 800.00 1 MILLER 1300.00 2 ALLEN 1600.00 3 JONES 2975.00 4 KING 5000.00 5 注:where内容可where (emp.sal>salgrade.losal andemp.sal | |
4. (order by) | 显示雇员名,工资以及部门名,并按部门排序 |
SQL> select ename,sal,dname from emp,dept whereemp.deptno=dept.deptno order by dept.dname; ENAME SAL DNAME MILLER 1300.00ACCOUNTING KING 5000.00 ACCOUNTING FORD 3000.00 RESEARCH |
自连接查询
自连接是指在同一张表的连接查询
Eg:显示员工的上级领导的姓名--- 同表联立当成2个表来考虑就可以了 |
SQL> selecta1.empno,a1.ename,a1.mgr,a2.empno,a2.ename from emp a1,emp a2 wherea1.mgr=a2.empno; EMPNO ENAME MGR EMPNO ENAME 7902 FORD 7566 7566JONES 7788 SCOTT 7566 7566JONES |
子查询
---- 子查询是指嵌入在其他sql语句中的select语句单行子查询
---- 只返回单行数据的子查询Eg:查询与SMITH同一部门的所有员工 |
SQL> select ename,DEPTNO from emp whereDEPTNO=(select DEPTNO from emp whereename='SMITH'); ENAME DEPTNO SMITH 20 SCOTT 20 |
多行子查询
---- 返回多行数据的子查询Eg:查询和部门10的工作相同的雇员的姓名、工作和部门号 |
SQL> select ename,job,deptno from empwhere job in (select distinct job from empwhere deptno=10); ENAME JOB DEPTNO CLARK MANAGER 10 BLAKE MANAGER 30 JONES MANAGER 20 |
Eg:查询出工资比部门20的所有员工的工资高的员工 |
SQL> select ename,sal,deptno from emp wheresal> all (select sal from empwhere deptno=30); ENAME SAL DEPTNO JONES 2975.00 20 SCOTT 3000.00 20 |
Eg:显示工资比20部门任意一个员工工资的员工 |
SQL> select ename,sal,deptno from emp wheresal> any (select sal from empwhere deptno=30); ENAME SAL DEPTNO KING 5000.00 10 FORD 3000.00 20 |
多列子查询
--- where后的条件是一一对应的,实际是两个条件的and连接Eg:查询出与'SMITH'部门和岗位一样的员工信息 |
SQL> selectename,job,deptno from emp where (deptno,job)=(select deptno,job from emp whereename='SMITH'); ENAME JOB DEPTNO ADAMS CLERK 20 |
From中的子查询被认定为一个内嵌试图,并且应该取别名
Eg:显示高于自己部门平均工资的员工信息 |
SQL> selectename,sal,mysal,a1.deptno from emp a1,(select deptno,avg(sal) mysal from emp group bydeptno) a2 wherea1.deptno=a2.deptno anda1.sal>a2.mysal; ENAME SAL MYSAL DEPTNO ALLEN 1600.00 1566.66666 30 JONES 2975.00 2175 20 |
分页查询 ----- 非常重要
Rownum分页a. (select * from emp) 建立内嵌试图
b. 显示rownum。(这里的rownum是oracle自带分配的)
Eg | SQL> select ename,job,sal,rownum rn from(select * from emp) a1; ENAME JOB SAL RN SMITH CLERK 800.00 1 ALLEN SALESMAN 1600.00 2 WARD SALESMAN 1250.00 3 |
d. Oracle采用二分法筛选,所以需要先筛选出1-10.,在筛选出6-10
e. 如需改变查询列时,只需改变最里层的select的就可以了
f. 如需排序,也只需修改最里层的select视图就可以了
Eg: 在第一次的筛选中要用rownum,第二次要用别名rn |
SQL> select * from (select a1.*,rownum rn from (selectename,job,sal from emp) a1 where rownum<=10) wherern>=6; ENAME JOB SAL RN BLAKE MANAGER 2850.00 6 CLARK MANAGER 2450.00 7 SCOTT ANALYST 3000.00 8 |
按分析函数分页
利用查询结果来创建新表
Eg:创建一个部门平均工资表从emp表中生成 |
SQL> create table avgsal (deptno,avgsal) as select deptno,avg(sal) fromemp group by deptno; Table created SQL> select * from avgsal; DEPTNO AVGSAL 30 1566.66666 20 2175 10 2916.66666 |
合并查询 ---- 比较麻烦,但效率较高
Ag:在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号:union all,union,intersect,minusa. Union
Union用于取得两个结果集的合集Eg:查询sal大于2500并且部门为20的员工,实际效果等同于and |
SQL> select ename,deptno,sal from emp wheresal>2500 2 union select ename,deptno,sal from emp where deptno=20; ENAME DEPTNO SAL ADAMS 20 1100.00 BLAKE 30 2850.00 FORD 20 3000.00 JONES 20 2975.00 KING 10 5000.00 |
b. Unionall
注: union all与union用法相同,但他的效果是缺两个集合的全集(不会合并相同的)c. Intersect
Intersect是用于取两个集合的交集Eg: 对于分页查询同样可以采用这种方法 |
SQL> select * from (select ename,job,sal,rownumrn from emp) where rownum<=10 2 intersect select * from (selectename,job,sal,rownum rn from emp) where rn>=6; ENAME JOB SAL RN BLAKE MANAGER 2850.00 6 CLARK MANAGER 2450.00 7 KING PRESIDENT 5000.00 9 SCOTT ANALYST 3000.00 8 TURNER SALESMAN 1500.00 10 |
d. Minus
Minus是取两个集合的差集(即取A集合减去与B集合重复的部分)union all, union,intersect,minus
Ag:A:(1,2,3)B:(3,4,5){
1. A minus B = (1,2)
2. A union B= (1,2,3,4,5)
3. A uniomall B = (1,2,3,3,4,5)
4. A intersect B = (3)
相关文章推荐
- oracle 数据库的管理工具 PL/SQL_Developer 的简易使用 与Java 连接并查询显示出数据
- Oracle表的管理 复杂查询
- Num43 oracle(子查询: 集合查询:处理数据:创建和管理表: 其他数据库对象)
- DSG-SnapArchiving-Oracle历史数据归档管理和查询技术简述
- Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)
- Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)
- oracle的表的数据管理2 -- 基本查询
- Oracl数据库管理方面的资料(查询sga,查看oracle数据库名称sid,查看oracle数据库名称,查看表空间,修改表空间名称,数据库管理,sqlPlus数据显示)
- 表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询) 1.Oracle表的管理
- 【白皮书】SnapArchiving - Oracle历史数据归档与查询管理软件
- ORACLE用户常用数据字典的查询方法
- ORACLE 百万行数据查询优化
- ORACLE在使用distinct可能因为查询的列过少导致数据丢失的问题
- 解析Oracle数据扫描 Oracle SQL查询优化 提高局部范围数据扫描执行性能的原理
- oracle 管理 之 数据备份
- oracle 查询表数据慢,暂时解决方法
- oracle的查询数据表(五)
- ORACLE查询字段中含有空格的数据
- 复杂查询语句的使用,Oracle
- oracle查询表中字段里数据是否有重复