Oracle Day3 多行函数多表查询

Posted wentaokyle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Day3 多行函数多表查询相关的知识,希望对你有一定的参考价值。

1.多行函数

  1. Sum avg max min count 
  2. 组函数具有滤空的作用(添加nvl屏蔽该功能)
  3. 分组groupby
  4. 多行分组
  5. 分组过滤
  6. where 和分组过滤的区别(having)
  7. 分组的增强(rollup)

  break on deptno skip 2;

  break on null;

 

  1 SQL>  -- 计算一下每一个月要发多少工资,不含奖金
  2 SQL> select sum(sal) from emp;
  3 
  4   SUM(SAL)                                                                                                                                                                                              
  5 ----------                                                                                                                                                                                              
  6      29025                                                                                                                                                                                              
  7 
  8 SQL> select sal from emp;
  9 
 10        SAL                                                                                                                                                                                              
 11 ----------                                                                                                                                                                                              
 12        800                                                                                                                                                                                              
 13       1600                                                                                                                                                                                              
 14       1250                                                                                                                                                                                              
 15       2975                                                                                                                                                                                              
 16       1250                                                                                                                                                                                              
 17       2850                                                                                                                                                                                              
 18       2450                                                                                                                                                                                              
 19       3000                                                                                                                                                                                              
 20       5000                                                                                                                                                                                              
 21       1500                                                                                                                                                                                              
 22       1100                                                                                                                                                                                              
 23 
 24        SAL                                                                                                                                                                                              
 25 ----------                                                                                                                                                                                              
 26        950                                                                                                                                                                                              
 27       3000                                                                                                                                                                                              
 28       1300                                                                                                                                                                                              
 29 
 30 已选择14行。
 31 
 32 SQL> -- 计算一下每年发的奖金的和
 33 SQL> select sum(comm) from emp;
 34 
 35  SUM(COMM)                                                                                                                                                                                              
 36 ----------                                                                                                                                                                                              
 37       2200                                                                                                                                                                                              
 38 
 39 SQL> select comm from emp;
 40 
 41       COMM                                                                                                                                                                                              
 42 ----------                                                                                                                                                                                              
 43                                                                                                                                                                                                         
 44        300                                                                                                                                                                                              
 45        500                                                                                                                                                                                              
 46                                                                                                                                                                                                         
 47       1400                                                                                                                                                                                              
 48                                                                                                                                                                                                         
 49                                                                                                                                                                                                         
 50                                                                                                                                                                                                         
 51                                                                                                                                                                                                         
 52          0                                                                                                                                                                                              
 53                                                                                                                                                                                                         
 54 
 55       COMM                                                                                                                                                                                              
 56 ----------                                                                                                                                                                                              
 57                                                                                                                                                                                                         
 58                                                                                                                                                                                                         
 59                                                                                                                                                                                                         
 60 
 61 已选择14行。
 62 
 63 SQL> -- 多行函数自动虑空
 64 SQL> -- 计算一下公司的平均工资
 65 SQL> select sum(sal)/count(*) from emp;
 66 
 67 SUM(SAL)/COUNT(*)                                                                                                                                                                                       
 68 -----------------                                                                                                                                                                                       
 69        2073.21429                                                                                                                                                                                       
 70 
 71 SQL> select sum(sal)/count(sal)) from emp;
 72 select sum(sal)/count(sal)) from emp
 73                           *
 741 行出现错误: 
 75 ORA-00923: 未找到要求的 FROM 关键字 
 76 
 77 
 78 SQL> select sum(sal)/count(sal) from emp;
 79 
 80 SUM(SAL)/COUNT(SAL)                                                                                                                                                                                     
 81 -------------------                                                                                                                                                                                     
 82          2073.21429                                                                                                                                                                                     
 83 
 84 SQL> select avg(sal) from emp;
 85 
 86   AVG(SAL)                                                                                                                                                                                              
 87 ----------                                                                                                                                                                                              
 88 2073.21429                                                                                                                                                                                              
 89 
 90 SQL> -- 计算一下平均奖金
 91 SQL> select sum(comm)/count(*) from emp;
 92 
 93 SUM(COMM)/COUNT(*)                                                                                                                                                                                      
 94 ------------------                                                                                                                                                                                      
 95         157.142857                                                                                                                                                                                      
 96 
 97 SQL> select sum(comm)/count(comm) from emp;
 98 
 99 SUM(COMM)/COUNT(COMM)                                                                                                                                                                                   
100 ---------------------                                                                                                                                                                                   
101                   550                                                                                                                                                                                   
102 
103 SQL> select avg(comm) from emp;
104 
105  AVG(COMM)                                                                                                                                                                                              
106 ----------                                                                                                                                                                                              
107        550                                                                                                                                                                                              
108 
109 SQL>  -- 多行函数的虑空并不是在所有的场合都适用,如果你不希望他的虑空起作用你可以采用函数的嵌套来屏蔽该功能
110 SQL> select sum(comm)/count(*),avg(nvl(comm,0)) from emp;
111 
112 SUM(COMM)/COUNT(*) AVG(NVL(COMM,0))                                                                                                                                                                     
113 ------------------ ----------------                                                                                                                                                                     
114         157.142857       157.142857                                                                                                                                                                     
115 
116 SQL> -- 查询工资最高和最低的员工信息
117 SQL> select max(sal),min(sal) from emp;
118 
119   MAX(SAL)   MIN(SAL)                                                                                                                                                                                   
120 ---------- ----------                                                                                                                                                                                   
121       5000        800                                                                                                                                                                                   
122 
123 SQL> select max(comm),min(comm) from emp;
124 
125  MAX(COMM)  MIN(COMM)                                                                                                                                                                                   
126 ---------- ----------                                                                                                                                                                                   
127       1400          0                                                                                                                                                                                   
128 
129 SQL> -- 分组
130 SQL> -- 求每一个部门的工资总和 和平均工资
131 SQL> select deptno,sum(sal),avg(sal)
132   2  from emp
133   3  group by deptno;
134 
135     DEPTNO   SUM(SAL)   AVG(SAL)                                                                                                                                                                        
136 ---------- ---------- ----------                                                                                                                                                                        
137         30       9400 1566.66667                                                                                                                                                                        
138         20      10875       2175                                                                                                                                                                        
139         10       8750 2916.66667                                                                                                                                                                        
140 
141 SQL> -- 统计部门的平均工资,部门号,岗位
142 SQL> select deptno,avg(sal),job
143   2  from emp
144   3  group by deptno,job;
145 
146     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
147 ---------- ---------- ------------------                                                                                                                                                                
148         20        950 CLERK                                                                                                                                                                             
149         30       1400 SALESMAN                                                                                                                                                                          
150         20       2975 MANAGER                                                                                                                                                                           
151         30        950 CLERK                                                                                                                                                                             
152         10       5000 PRESIDENT                                                                                                                                                                         
153         30       2850 MANAGER                                                                                                                                                                           
154         10       1300 CLERK                                                                                                                                                                             
155         10       2450 MANAGER                                                                                                                                                                           
156         20       3000 ANALYST                                                                                                                                                                           
157 
158 已选择9行。
159 
160 SQL>  -- group by 后面必须要跟select后面没有在多行函数里面的字段
161 SQL> -- 分组函数的过滤
162 SQL> -- 统计部门号为20的部门下的所有职位的平均工资
163 SQL> select deptno,avg(sal),job
164   2  from emp
165   3  where deptno=20
166   4  group by deptno,job;
167 
168     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
169 ---------- ---------- ------------------                                                                                                                                                                
170         20        950 CLERK                                                                                                                                                                             
171         20       2975 MANAGER                                                                                                                                                                           
172         20       3000 ANALYST                                                                                                                                                                           
173 
174 SQL> select deptno,avga(sal),job
175   2  from emp
176   3  group by deptno,job
177   4  having deptno=20;
178 select deptno,avga(sal),job
179               *
1801 行出现错误: 
181 ORA-00904: "AVGA": 标识符无效 
182 
183 
184 SQL> c /avga(sal)/avg(sal);
185   1* select deptno,avg(sal),job
186 SQL> /
187 
188     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
189 ---------- ---------- ------------------                                                                                                                                                                
190         20        950 CLERK                                                                                                                                                                             
191         20       2975 MANAGER                                                                                                                                                                           
192         20       3000 ANALYST                                                                                                                                                                           
193 
194 SQL> -- 统计平均工资大于2000的部门
195 SQL> select deptno,avg(sal)
196   2  from emp
197   3  where avg(sal) >2000
198   4  group by deptno,job;
199 where avg(sal) >2000
200       *
2013 行出现错误: 
202 ORA-00934: 此处不允许使用分组函数 
203 
204 
205 SQL> select deptno,avg(sal)
206   2  from emp
207   3  group by deptno
208   4  having avg(sal)>2000;
209 
210     DEPTNO   AVG(SAL)                                                                                                                                                                                   
211 ---------- ----------                                                                                                                                                                                   
212         20       2175                                                                                                                                                                                   
213         10 2916.66667                                                                                                                                                                                   
214 
215 SQL> --1. where和having都可以用来做条件的过滤操作,但是where后面不能跟分组函数,having后面可以跟分组函数
216 SQL> -- 2 尽量使用where 因为他的效率更高
217 SQL> select deptno,job,sum(sal)
218   2  from emp
219   3  group by rollup(deptno,job);
220 
221     DEPTNO JOB                  SUM(SAL)                                                                                                                                                                
222 ---------- ------------------ ----------                                                                                                                                                                
223         10 CLERK                    1300                                                                                                                                                                
224         10 MANAGER                  2450                                                                                                                                                                
225         10 PRESIDENT                5000                                                                                                                                                                
226         10                          8750                                                                                                                                                                
227         20 CLERK                    1900                                                                                                                                                                
228         20 ANALYST                  6000                                                                                                                                                                
229         20 MANAGER                  2975                                                                                                                                                                
230         20                         10875                                                                                                                                                                
231         30 CLERK                     950                                                                                                                                                                
232         30 MANAGER                  2850                                                                                                                                                                
233         30 SALESMAN                 5600                                                                                                                                                                
234 
235     DEPTNO JOB                  SUM(SAL)                                                                                                                                                                
236 ---------- ------------------ ----------                                                                                                                                                                
237         30                          9400                                                                                                                                                                
238                                    29025                                                                                                                                                                
239 
240 已选择13行。
241 
242 SQL> break on deptno skip 2;
243 SQL> /
244 
245     DEPTNO JOB                  SUM(SAL)                                                                                                                                                                
246 ---------- ------------------ ----------                                                                                                                                                                
247         10 CLERK                    1300                                                                                                                                                                
248            MANAGER                  2450                                                                                                                                                                
249            PRESIDENT                5000                                                                                                                                                                
250                                     8750                                                                                                                                                                
251                                                                                                                                                                                                         
252                                                                                                                                                                                                         
253         20 CLERK                    1900                                                                                                                                                                
254            ANALYST                  6000                                                                                                                                                                
255            MANAGER                  2975                                                                                                                                                                
256                                    10875                                                                                                                                                                
257                                                                                                                                                                                                         
258 
259     DEPTNO JOB                  SUM(SAL)                                                                                                                                                                
260 ---------- ------------------ ----------                                                                                                                                                                
261                                                                                                                                                                                                         
262         30 CLERK                     950                                                                                                                                                                
263            MANAGER                  2850                                                                                                                                                                
264            SALESMAN                 5600                                                                                                                                                                
265                                     9400                                                                                                                                                                
266                                                                                                                                                                                                         
267                                                                                                                                                                                                         
268                                    29025                                                                                                                                                                
269                                                                                                             

以上是关于Oracle Day3 多行函数多表查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 多表查询

Oracle OCP提纲

Oracle 多表查询

oracle 多表更新update,返回多行

Oracle入门第三天(上)——多表查询与分组函数

Oracle笔记 多表查询