Oracle Day3 多行函数、多表查询
1.多行函数
- Sum avg max min count
- 组函数具有滤空的作用(添加nvl屏蔽该功能)
- 分组group by
- 多行分组
- 分组过滤
- where 和分组过滤的区别(having)
- 分组的增强(rollup)
break on deptno skip 2;
break on null;
SQL> -- 计算一下每一个月要发多少工资,不含奖金
SQL> select sum(sal) from emp; SUM(SAL)
----------
29025 SQL> select sal from emp; SAL
----------
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100 SAL
----------
950
3000
1300 已选择14行。 SQL> -- 计算一下每年发的奖金的和
SQL> select sum(comm) from emp; SUM(COMM)
----------
2200 SQL> select comm from emp; COMM
---------- 300
500 1400 0 COMM
---------- 已选择14行。 SQL> -- 多行函数自动虑空
SQL> -- 计算一下公司的平均工资
SQL> select sum(sal)/count(*) from emp; SUM(SAL)/COUNT(*)
-----------------
2073.21429
SQL> select sum(sal)/count(sal) from emp; SUM(SAL)/COUNT(SAL)
-------------------
2073.21429 SQL> select avg(sal) from emp; AVG(SAL)
----------
2073.21429 SQL> -- 计算一下平均奖金
SQL> select sum(comm)/count(*) from emp; SUM(COMM)/COUNT(*)
------------------
157.142857 SQL> select sum(comm)/count(comm) from emp; SUM(COMM)/COUNT(COMM)
---------------------
550 错误方法 SQL> select avg(comm) from emp; AVG(COMM)
----------
550 错误方法 SQL> -- 多行函数的虑空并不是在所有的场合都适用,如果你不希望他的虑空起作用你可以采用函数的嵌套来屏蔽该功能
SQL> select sum(comm)/count(*),avg(nvl(comm,0)) from emp; SUM(COMM)/COUNT(*) AVG(NVL(COMM,0))
------------------ ----------------
157.142857 157.142857 SQL> -- 查询工资最高和最低的员工信息
SQL> select max(sal),min(sal) from emp; MAX(SAL) MIN(SAL)
---------- ----------
5000 800 SQL> select max(comm),min(comm) from emp; MAX(COMM) MIN(COMM)
---------- ----------
1400 0 SQL> -- 分组
SQL> -- 求每一个部门的工资总和 和平均工资
SQL> select deptno,sum(sal),avg(sal)
2 from emp
3 group by deptno; DEPTNO SUM(SAL) AVG(SAL)
---------- ---------- ----------
30 9400 1566.66667
20 10875 2175
10 8750 2916.66667 SQL> -- 统计部门的平均工资,部门号,岗位
SQL> select deptno,avg(sal),job
2 from emp
3 group by deptno,job; DEPTNO AVG(SAL) JOB
---------- ---------- ------------------
20 950 CLERK
30 1400 SALESMAN
20 2975 MANAGER
30 950 CLERK
10 5000 PRESIDENT
30 2850 MANAGER
10 1300 CLERK
10 2450 MANAGER
20 3000 ANALYST 已选择9行。 SQL> -- group by 后面必须要跟select后面没有在多行函数里面的字段
SQL> -- 分组函数的过滤
SQL> -- 统计部门号为20的部门下的所有职位的平均工资
SQL> select deptno,avg(sal),job
2 from emp
3 where deptno=20
4 group by deptno,job; DEPTNO AVG(SAL) JOB
---------- ---------- ------------------
20 950 CLERK
20 2975 MANAGER
20 3000 ANALYST SQL> select deptno,avga(sal),job
2 from emp
3 group by deptno,job
4 having deptno=20;
select deptno,avga(sal),job
*
第 1 行出现错误:
ORA-00904: "AVGA": 标识符无效 SQL> c /avga(sal)/avg(sal);
1* select deptno,avg(sal),job
SQL> / DEPTNO AVG(SAL) JOB
---------- ---------- ------------------
20 950 CLERK
20 2975 MANAGER
20 3000 ANALYST SQL> -- 统计平均工资大于2000的部门
SQL> select deptno,avg(sal)
2 from emp
3 where avg(sal) >2000
4 group by deptno,job;
where avg(sal) >2000
*
第 3 行出现错误:
ORA-00934: 此处不允许使用分组函数 SQL> select deptno,avg(sal)
2 from emp
3 group by deptno
4 having avg(sal)>2000; DEPTNO AVG(SAL)
---------- ----------
20 2175
10 2916.66667 SQL> --1. where和having都可以用来做条件的过滤操作,但是where后面不能跟分组函数,having后面可以跟分组函数
SQL> -- 2 尽量使用where 因为他的效率更高
SQL> select deptno,job,sum(sal)
2 from emp
3 group by rollup(deptno,job); DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600 DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
30 9400
29025 已选择13行。 SQL> break on deptno skip 2;
SQL> / DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
10 CLERK 1300
MANAGER 2450
PRESIDENT 5000
8750 20 CLERK 1900
ANALYST 6000
MANAGER 2975
10875 DEPTNO JOB SUM(SAL)
---------- ------------------ ---------- 30 CLERK 950
MANAGER 2850
SALESMAN 5600
9400 29025 已选择13行。 SQL> --break on deptno skip 2;去除deptno后相同的no,并空两行;
SQL> break on null;
SQL> / DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600 DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
30 9400
29025 已选择13行。 SQL> break on deptno skip 3;
SQL> / DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
10 CLERK 1300
MANAGER 2450
PRESIDENT 5000
8750 20 CLERK 1900
ANALYST 6000
MANAGER 2975
10875 DEPTNO JOB SUM(SAL)
---------- ------------------ ---------- 30 CLERK 950
MANAGER 2850
SALESMAN 5600
9400 29025 已选择13行。 SQL> select sum(sal) from emp; SUM(SAL)
----------
29025 SQL> select sum(comm) from emp; SUM(COMM)
----------
2200 SQL> select sum(sal)/count(*) from emp; SUM(SAL)/COUNT(*)
-----------------
2073.21429 SQL> select sum(sal)/count(sal) from emp; SUM(SAL)/COUNT(SAL)
-------------------
2073.21429 SQL> select avg(sal) from emp; AVG(SAL)
----------
2073.21429 SQL> select max(sal),min(sal) from emp; MAX(SAL) MIN(SAL)
---------- ----------
5000 800 SQL> select max(comm),min(comm) from emp; MAX(COMM) MIN(COMM)
---------- ----------
1400 0 SQL> select deptno,sum(sal),avg(sal)
2 from emp
3 group by deptno; DEPTNO SUM(SAL) AVG(SAL)
---------- ---------- ----------
30 9400 1566.66667 20 10875 2175 10 8750 2916.66667 SQL> select deptno,avg(sal),job
2 from emp
3 group by deptno,job; DEPTNO AVG(SAL) JOB
---------- ---------- ------------------
20 950 CLERK 30 1400 SALESMAN 20 2975 MANAGER DEPTNO AVG(SAL) JOB
---------- ---------- ------------------ 30 950 CLERK 10 5000 PRESIDENT 30 2850 MANAGER DEPTNO AVG(SAL) JOB
---------- ---------- ------------------ 10 1300 CLERK
2450 MANAGER 20 3000 ANALYST 已选择9行。 SQL> select deptno,avg(sal),job
2 from emp
3 where deptno=20
4 group by deptno,job; DEPTNO AVG(SAL) JOB
---------- ---------- ------------------
20 950 CLERK
2975 MANAGER
3000 ANALYST SQL> select deptno,avg(sal),job
2 from emp
3 group by deotno,job
4 having deptno=20;
group by deotno,job
*
第 3 行出现错误:
ORA-00904: "DEOTNO": 标识符无效 /*
c:用来改错(只能改一个单词)
*/
SQL> c /deotno/deptno;
3* group by deptno,job
SQL> / DEPTNO AVG(SAL) JOB
---------- ---------- ------------------
20 950 CLERK
2975 MANAGER
3000 ANALYST SQL> select deptno,avg(sal),job
2 from emp
3 group by deptno,job
4 having avg(sal)>2000; DEPTNO AVG(SAL) JOB
---------- ---------- ------------------
20 2975 MANAGER 10 5000 PRESIDENT 30 2850 MANAGER DEPTNO AVG(SAL) JOB
---------- ---------- ------------------ 10 2450 MANAGER 20 3000 ANALYST SQL> select deptno,job,sum(sal)
2 from emp
3 group by rollup(deptno,job); DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
10 CLERK 1300
MANAGER 2450
PRESIDENT 5000
8750 20 CLERK 1900
ANALYST 6000
MANAGER 2975
10875 DEPTNO JOB SUM(SAL)
---------- ------------------ ---------- 30 CLERK 950
MANAGER 2850
SALESMAN 5600
9400 29025 已选择13行。 SQL> break on null;
SQL> / DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600 DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
30 9400
29025 已选择13行。 SQL> break on deptno skip 2;
SQL> / DEPTNO JOB SUM(SAL)
---------- ------------------ ----------
10 CLERK 1300
MANAGER 2450
PRESIDENT 5000
8750 20 CLERK 1900
ANALYST 6000
MANAGER 2975
10875 DEPTNO JOB SUM(SAL)
---------- ------------------ ---------- 30 CLERK 950
MANAGER 2850
SALESMAN 5600
9400 29025 已选择13行。 SQL> spool off;
2.多表查询
1)笛卡尔集
2)等值连接
3)非等值连接
4)外连接
5)内连接
6)层次查询(只能有一张表 connect by prior empno = mgr start with empno = 7839)
SQL> -- 查询所有部门的信息和部门下的所有员工信息
SQL> select e.empno,e.ename,job,d.deptno,d.dname
2 from emp e,dept d
3 where e.deptno=d.deptno; EMPNO ENAME JOB DEPTNO DNAME
---------- ------------------------------ ------------------ ---------- ----------------------------
7369 SMITH CLERK 20 RESEARCH 7499 ALLEN SALESMAN 30 SALES
7521 WARD SALESMAN SALES 7566 JONES MANAGER 20 RESEARCH 7654 MARTIN SALESMAN 30 SALES EMPNO ENAME JOB DEPTNO DNAME
---------- ------------------------------ ------------------ ---------- ----------------------------
7698 BLAKE MANAGER 30 SALES 7782 CLARK MANAGER 10 ACCOUNTING 7788 SCOTT ANALYST 20 RESEARCH 7839 KING PRESIDENT 10 ACCOUNTING EMPNO ENAME JOB DEPTNO DNAME
---------- ------------------------------ ------------------ ---------- ---------------------------- 7844 TURNER SALESMAN 30 SALES 7876 ADAMS CLERK 20 RESEARCH 7900 JAMES CLERK 30 SALES 7902 FORD ANALYST 20 RESEARCH EMPNO ENAME JOB DEPTNO DNAME
---------- ------------------------------ ------------------ ---------- ---------------------------- 7934 MILLER CLERK 10 ACCOUNTING 已选择14行。 SQL> select * from tab; TNAME TABTYPE CLUSTERID
------------------------------------------------------------ -------------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE SQL> select *from salgrade; GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999 SQL> -- 查询员工信息和员工的工资级别
SQL> select e.empno,e.sal,s.grade,s.losal,s.hisal
2 from emp e,salgrade s
3 where e.sal between s.losal and s.hisal; EMPNO SAL GRADE LOSAL HISAL
---------- ---------- ---------- ---------- ----------
7369 800 1 700 1200
7900 950 1 700 1200
7876 1100 1 700 1200
7521 1250 2 1201 1400
7654 1250 2 1201 1400
7934 1300 2 1201 1400
7844 1500 3 1401 2000
7499 1600 3 1401 2000
7782 2450 4 2001 3000
7698 2850 4 2001 3000
7566 2975 4 2001 3000 EMPNO SAL GRADE LOSAL HISAL
---------- ---------- ---------- ---------- ----------
7788 3000 4 2001 3000
7902 3000 4 2001 3000
7839 5000 5 3001 9999 已选择14行。 SQL> -- 不等值连接
SQL> -- 外连接
SQL> -- 统计每一个部门的人数
SQL> -- 显示部门号 部门名称 部门人数
SQL> select e.deptno,d.dname,count(*)
2 from emp e,dept d
3 where e.deptno=d.deptno
4 group by e.deptno,d.dname; DEPTNO DNAME COUNT(*)
---------- ---------------------------- ----------
10 ACCOUNTING 3 20 RESEARCH 5 30 SALES 6 SQL> select * from dept; DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> /*
SQL>
SQL> 外连接:分为左外连接和右外连接
SQL> 左外连接: where e.deptno = d.deptno(+) 不成立的时候,无论右边是否有数据与之对应,左边的都要显示
SQL> where e.deptno = d.depton(+)
SQL> 右外连接: where e.deptno(+) = d.deptno 不成立的时候,无论左边表是否有数据与之对应,右边的都会显示
SQL> where e.deptno(+) = d.deptno;
SQL> */
SQL> select d.deptno,d.dname,count(e.empno)
2 from emp e,dept d
3 where e.deptno(+)=d.deptno
4 group by d.deptno,d.deptname;
group by d.deptno,d.deptname
*
第 4 行出现错误:
ORA-00904: "D"."DEPTNAME": 标识符无效 SQL> c /d.deptname/d.dname;
4* group by d.deptno,d.dname
SQL> / DEPTNO DNAME COUNT(E.EMPNO)
---------- ---------------------------- --------------
10 ACCOUNTING 3 40 OPERATIONS 0 20 RESEARCH 5 30 SALES 6 SQL> select d.deptno,d.dname,count(e.empno)
2 from emp e,dept d
3 where e.deptno=d.deptno(+)
4 group by d.deptno,d.dname; DEPTNO DNAME COUNT(E.EMPNO)
---------- ---------------------------- --------------
10 ACCOUNTING 3 20 RESEARCH 5 30 SALES 6 SQL> select e.ename 领导名字,e.empno 领导id,p.ename 员工名字,p.empno 员工id
2 from emp e,emp p
3 where e.ename=p.mgr;
where e.ename=p.mgr
*
第 3 行出现错误:
ORA-01722: 无效数字 SQL> c /e.ename/e.empno;
3* where e.empno=p.mgr
SQL> / 领导名字 领导ID 员工名字 员工ID
-------------------- ---------- -------------------- ----------
FORD 7902 SMITH 7369
BLAKE 7698 ALLEN 7499
BLAKE 7698 WARD 7521
KING 7839 JONES 7566
BLAKE 7698 MARTIN 7654
KING 7839 BLAKE 7698
KING 7839 CLARK 7782
JONES 7566 SCOTT 7788
BLAKE 7698 TURNER 7844
SCOTT 7788 ADAMS 7876
BLAKE 7698 JAMES 7900 领导名字 领导ID 员工名字 员工ID
-------------------- ---------- -------------------- ----------
JONES 7566 FORD 7902
CLARK 7782 MILLER 7934 已选择13行。 SQL> select count(*) from emp e,emp p
2 where e.empno=p.mgr; COUNT(*)
----------
13 SQL> select count(*) from emp e,emp p; COUNT(*)
----------
196 SQL> -- 内连接只能做数据量小的表,对于大表用层次查询
SQL> -- 层次查询
SQL> select ename 领导名字,empno 领导id
2 from emp
3 connect by prior empno=mgr
4 start with mgr is null; 领导名字 领导ID
-------------------- ----------
KING 7839
JONES 7566
SCOTT 7788
ADAMS 7876
FORD 7902
SMITH 7369
BLAKE 7698
ALLEN 7499
WARD 7521
MARTIN 7654
TURNER 7844 领导名字 领导ID
-------------------- ----------
JAMES 7900
CLARK 7782
MILLER 7934 已选择14行。
Oracle Day3 多行函数、多表查询的更多相关文章
- Oracle笔记(六) 多表查询
最近看了李兴华的oracle视频,这是网上别人做的笔记非常细致,分享给大家,第六篇 原创地址:http://www.cnblogs.com/mchina/archive/2012/09/07/2651 ...
- Oracle 数据库基础学习 (五) 多表查询
多表查询:查询结果需要用到两个或者以上表,此时需要多表连接,产生多表查询 1.内连接(等值连接) 示例:将两个表内容连接显示 select * from dept d, emp e where d.d ...
- Oracle笔记(1)--emp表查询(1)
(1)截取函数--TRUNC() 的用法 SELECT TRUNC(789.652) 截取小数, TRUNC(789.652,2) 截取两位小数, TRUNC(789.652,-2) 取整 FROM ...
- oracle学习篇四:多表查询
-----------------产生笛卡儿积------------------------------------ select * from emp,dept; --不带条件时,记录数为14*4 ...
- oracle SQL多表查询
SQL多表查询 1.集合理论 1.1 什么是集合 具有某种特定性质的事物的总体. 集合的特性:无序性.互异性.确定性. 一个集合可以小到从一个表中取出一行中的一列. 1 ro ...
- SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)
SQL Fundamentals || Oracle SQL语言 一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查 ...
- Mysql(三):多表查询和存储程序
今天内容: ● 多表查询(内连接 外连接 子查询) ● 存储程序(存储过程 函数) 多表查询 同时从多张数据表中查取到需要的数据即是多表查询. 多表查询时,参与查询的表中每条数据进行组合,这种效果 ...
- Python学习day44-数据库(单表及多表查询)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等
count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age ...
随机推荐
- [转]Delphi中QuotedStr介绍及使用
转自:http://www.360doc.com/content/13/0524/09/7873422_287679198.shtml 使用S:string; qry2.SQL.add('select ...
- 在GNU/Linux下使用命令行自动挂载与卸载USB磁盘
在命令行环境下如果每次都是靠手动敲入mount与umount命令来挂载与卸载USB磁盘是件很麻烦的事情.尤其是mount命令的参数非常多.比如,磁盘的分区类型(vfat.ntfs等),挂载的目录节点, ...
- Openjudge-NOI题库-字符串移位包含问题
题目描述 Description 对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串. 给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次 ...
- CSS绑定
css绑定会对元素的CSS类进行操作.在某些情况下这将非常有用,例如:当数值是负的时将其高亮显示. (注:如果如果不想直接更改CSS类,而是只要改其中一个样式,则需要使用style绑定) 示例:使用静 ...
- openvpn环境搭建
以下为服务端.客户端下载安装包,在CentOS 6.5部署,也可以找到相关下载源 openvpn-2.2.2.tar.gz,openvpn-2.1.3-install.rar,(https://git ...
- AVAudioPlayer的锁屏播放控制和锁屏播放信息显示
在设置这个锁屏之前,首先得设置应用支持后台音乐播放,TAGETS->Info->Required background modes->App plays audio or strea ...
- SQLServer中的变量:局部变量,全局变量
SQLServer中的全局变量 变量 Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量.局部变量 局部变量是一个能够拥有特定数据类型的对象 ...
- 向量空间(Vector Spaces)
向量空间(Vector Spaces) 向量空间又称线性空间,是线性代数的中心内容和基本概念之一.在解析几何里引入向量的概念后,是许多问题的处理变得更为简洁和清晰,在此基础上的进一步抽象化,形成了与域 ...
- mysql语句中----删除表数据drop、truncate和delete的用法
程度从强到弱 1.drop table tb drop将表格直接删除,没有办法找回 2.truncate (table) tb 删除表中的所有数据,不能与where一起使用 ...
- Dubbo Zookeeper
发布 Service:每个<dubbo:service/>在spring内部都会生成一个ServiceBean实例,ServiceBean的实例化过程中调用export方法来暴露服务 co ...