您的位置:首页 > 博客中心 > 数据库 >

Oracle Day3 多行函数、多表查询

时间:2022-03-14 18:41

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                           *
 74 第 1 行出现错误: 
 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               *
180 第 1 行出现错误: 
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       *
201 第 3 行出现错误: 
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                                                                                                                                                                                                         
270                                                                                                                                                                                                         
271 
272 已选择13行。
273 
274 SQL> --break on deptno skip 2;去除deptno后相同的no,并空两行;
275 SQL> break on null;
276 SQL> /
277 
278     DEPTNO JOB                  SUM(SAL)                                                                                                                                                                
279 ---------- ------------------ ----------                                                                                                                                                                
280         10 CLERK                    1300                                                                                                                                                                
281         10 MANAGER                  2450                                                                                                                                                                
282         10 preSIDENT                5000                                                                                                                                                                
283         10                          8750                                                                                                                                                                
284         20 CLERK                    1900                                                                                                                                                                
285         20 ANALYST                  6000                                                                                                                                                                
286         20 MANAGER                  2975                                                                                                                                                                
287         20                         10875                                                                                                                                                                
288         30 CLERK                     950                                                                                                                                                                
289         30 MANAGER                  2850                                                                                                                                                                
290         30 SALESMAN                 5600                                                                                                                                                                
291 
292     DEPTNO JOB                  SUM(SAL)                                                                                                                                                                
293 ---------- ------------------ ----------                                                                                                                                                                
294         30                          9400                                                                                                                                                                
295                                    29025                                                                                                                                                                
296 
297 已选择13行。
298 
299 SQL> break on deptno skip 3;
300 SQL> /
301 
302     DEPTNO JOB                  SUM(SAL)                                                                                                                                                                
303 ---------- ------------------ ----------                                                                                                                                                                
304         10 CLERK                    1300                                                                                                                                                                
305            MANAGER                  2450                                                                                                                                                                
306            preSIDENT                5000                                                                                                                                                                
307                                     8750                                                                                                                                                                
308                                                                                                                                                                                                         
309                                                                                                                                                                                                         
310                                                                                                                                                                                                         
311         20 CLERK                    1900                                                                                                                                                                
312            ANALYST                  6000                                                                                                                                                                
313            MANAGER                  2975                                                                                                                                                                
314                                    10875                                                                                                                                                                
315 
316     DEPTNO JOB                  SUM(SAL)                                                                                                                                                                
317 ---------- ------------------ ----------                                                                                                                                                                
318                                                                                                                                                                                                         
319                                                                                                                                                                                                         
320                                                                                                                                                                                                         
321         30 CLERK                     950                                                                                                                                                                
322            MANAGER                  2850                                                                                                                                                                
323            SALESMAN                 5600                                                                                                                                                                
324                                     9400                                                                                                                                                                
325                                                                                                                                                                                                         
326                                                                                                                                                                                                         
327                                                                                                                                                                                                         
328                                    29025                                                                                                                                                                
329 
330 已选择13行。
331 
332 SQL> select sum(sal) from emp;
333 
334   SUM(SAL)                                                                                                                                                                                              
335 ----------                                                                                                                                                                                              
336      29025                                                                                                                                                                                              
337 
338 SQL> select sum(comm) from emp;
339 
340  SUM(COMM)                                                                                                                                                                                              
341 ----------                                                                                                                                                                                              
342       2200                                                                                                                                                                                              
343 
344 SQL> select sum(sal)/count(*) from emp;
345 
346 SUM(SAL)/COUNT(*)                                                                                                                                                                                       
347 -----------------                                                                                                                                                                                       
348        2073.21429                                                                                                                                                                                       
349 
350 SQL> select sum(sal)/count(sal) from emp;
351 
352 SUM(SAL)/COUNT(SAL)                                                                                                                                                                                     
353 -------------------                                                                                                                                                                                     
354          2073.21429                                                                                                                                                                                     
355 
356 SQL> select avg(sal) from emp;
357 
358   AVG(SAL)                                                                                                                                                                                              
359 ----------                                                                                                                                                                                              
360 2073.21429                                                                                                                                                                                              
361 
362 SQL> select max(sal),min(sal) from emp;
363 
364   MAX(SAL)   MIN(SAL)                                                                                                                                                                                   
365 ---------- ----------                                                                                                                                                                                   
366       5000        800                                                                                                                                                                                   
367 
368 SQL> select max(comm),min(comm) from emp;
369 
370  MAX(COMM)  MIN(COMM)                                                                                                                                                                                   
371 ---------- ----------                                                                                                                                                                                   
372       1400          0                                                                                                                                                                                   
373 
374 SQL> select deptno,sum(sal),avg(sal)
375   2  from emp
376   3  group by deptno;d
377   4  ;
378 group by deptno;d
379                *
380 第 3 行出现错误: 
381 ORA-00911: 无效字符 
382 
383 
384 SQL> select deptno,sum(sal),avg(sal)
385   2  from emp
386   3  group by deptno;
387 
388     DEPTNO   SUM(SAL)   AVG(SAL)                                                                                                                                                                        
389 ---------- ---------- ----------                                                                                                                                                                        
390         30       9400 1566.66667                                                                                                                                                                        
391                                                                                                                                                                                                         
392                                                                                                                                                                                                         
393                                                                                                                                                                                                         
394         20      10875       2175                                                                                                                                                                        
395                                                                                                                                                                                                         
396                                                                                                                                                                                                         
397                                                                                                                                                                                                         
398         10       8750 2916.66667                                                                                                                                                                        
399                                                                                                                                                                                                         
400                                                                                                                                                                                                         
401 
402 
403 SQL> select deptno,avg(sal),job
404   2  from emp
405   3  group by deptno,job;
406 
407     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
408 ---------- ---------- ------------------                                                                                                                                                                
409         20        950 CLERK                                                                                                                                                                             
410                                                                                                                                                                                                         
411                                                                                                                                                                                                         
412                                                                                                                                                                                                         
413         30       1400 SALESMAN                                                                                                                                                                          
414                                                                                                                                                                                                         
415                                                                                                                                                                                                         
416                                                                                                                                                                                                         
417         20       2975 MANAGER                                                                                                                                                                           
418                                                                                                                                                                                                         
419                                                                                                                                                                                                         
420 
421     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
422 ---------- ---------- ------------------                                                                                                                                                                
423                                                                                                                                                                                                         
424         30        950 CLERK                                                                                                                                                                             
425                                                                                                                                                                                                         
426                                                                                                                                                                                                         
427                                                                                                                                                                                                         
428         10       5000 preSIDENT                                                                                                                                                                         
429                                                                                                                                                                                                         
430                                                                                                                                                                                                         
431                                                                                                                                                                                                         
432         30       2850 MANAGER                                                                                                                                                                           
433                                                                                                                                                                                                         
434 
435     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
436 ---------- ---------- ------------------                                                                                                                                                                
437                                                                                                                                                                                                         
438                                                                                                                                                                                                         
439         10       1300 CLERK                                                                                                                                                                             
440                  2450 MANAGER                                                                                                                                                                           
441                                                                                                                                                                                                         
442                                                                                                                                                                                                         
443                                                                                                                                                                                                         
444         20       3000 ANALYST                                                                                                                                                                           
445                                                                                                                                                                                                         
446                                                                                                                                                                                                         
447                                                                                                                                                                                                         
448 
449 已选择9行。
450 
451 SQL> select deptno,avg(sal),job
452   2  from emp
453   3  where deptno=20
454   4  group by deptno,job;
455 
456     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
457 ---------- ---------- ------------------                                                                                                                                                                
458         20        950 CLERK                                                                                                                                                                             
459                  2975 MANAGER                                                                                                                                                                           
460                  3000 ANALYST                                                                                                                                                                           
461                                                                                                                                                                                                         
462                                                                                                                                                                                                         
463                                                                                                                                                                                                         
464 
465 SQL> select deptno,avg(sal),job
466   2  from emp
467   3  group by deotno,job
468   4  having deptno=20;
469 group by deotno,job
470          *
471 第 3 行出现错误: 
472 ORA-00904: "DEOTNO": 标识符无效 
473 
474 
475 SQL> c /deotno/deptno;
476   3* group by deptno,job
477 SQL> /
478 
479     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
480 ---------- ---------- ------------------                                                                                                                                                                
481         20        950 CLERK                                                                                                                                                                             
482                  2975 MANAGER                                                                                                                                                                           
483                  3000 ANALYST                                                                                                                                                                           
484                                                                                                                                                                                                         
485                                                                                                                                                                                                         
486                                                                                                                                                                                                         
487 
488 SQL> select deptno,avg(sal),job
489   2  from emp
490   3  group by deptno,job
491   4  having avg(sal)>2000;
492 
493     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
494 ---------- ---------- ------------------                                                                                                                                                                
495         20       2975 MANAGER                                                                                                                                                                           
496                                                                                                                                                                                                         
497                                                                                                                                                                                                         
498                                                                                                                                                                                                         
499         10       5000 preSIDENT                                                                                                                                                                         
500                                                                                                                                                                                                         
501                                                                                                                                                                                                         
502                                                                                                                                                                                                         
503         30       2850 MANAGER                                                                                                                                                                           
504                                                                                                                                                                                                         
505                                                                                                                                                                                                         
506 
507     DEPTNO   AVG(SAL) JOB                                                                                                                                                                               
508 ---------- ---------- ------------------                                                                                                                                                                
509                                                                                                                                                                                                         
510         10       2450 MANAGER                                                                                                                                                                           
511                                                                                                                                                                                                         
512                                                                                                                                                                                                         
513                                                                                                                                                                                                         
514         20       3000 ANALYST                               

热门排行

今日推荐

热门手游