Oracle Day3 多行函数多表查询
Posted wentaokyle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Day3 多行函数多表查询相关的知识,希望对你有一定的参考价值。
1.多行函数
- Sum avg max min count
- 组函数具有滤空的作用(添加nvl屏蔽该功能)
- 分组groupby
- 多行分组
- 分组过滤
- where 和分组过滤的区别(having)
- 分组的增强(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以上是关于Oracle Day3 多行函数多表查询的主要内容,如果未能解决你的问题,请参考以下文章