Oracle学习笔记(七)
九、高级查询(分组,子查询)
查询升级版:
需要用到三张表
员工表:
desc emp
EMPNO 员工号
ENAME 员工姓名
JOB 员工职位
MGR 老板员工号
HIREDATE 员工入职日期
SAL 员工月薪
COMM 员工奖金
DEPTNO 员工所在部门部门号
查看当前用户:
show users;
select * from emp;
部门表:
desc dept
deptno 部门号
dname 部门名称
LoC 部门地点
select * from dept;
工资级别表:
desc salgrade
GRADE 级别
LOSAL 级别最低薪水
HISAL 级别最高薪水
select * from salgrade;
十、分组查询
1、分组函数的概念
分组函数作用于一组数据,并对一组数据返回一个值
2、分组函数的使用
常用的分组函数:AVG、SUM、MIN、MAX、COUNT、WM_CONCAT(行转列)
(1)求出员工的平均工资和工资总额
select avg(SAL) as 平均工资,sum(SAL) as 工资总额 from emp;
(2)求出员工工资的最大值和最小值
select max(SAL) as 工资的最大值,min(SAL) as 工资的最小值 from emp;
(3)求出员工的总人数
select COUNT(*) as 总人数 from emp;
(4)查询部门数(去除重复)
select COUNT(distinct deptno) as 部门数 from emp;
(5)行转列
设置行宽
set linesize 200
col 部门中员工的姓名 for a60
select deptno as 部门号,wm_concat(ename) as 部门中员工的姓名 from emp group by deptno;
(6)分组函数与空值
a、统计员工的平均工资(三种方法统计薪水)
select sum(sal)/count(*) 一,sum(sal)/count(sal) 二, avg(sal) 三 from emp;
b、统计员工的平均奖金(三个值不相同)
select sum(comm)/count(*) 一,sum(comm)/count(comm) 二, avg(comm) 三 from emp;
注意:
分组函数会自动忽略空值
(7)在分组函数中使用NVl函数
注意:NVL函数使分组函数无法忽略空值
改写b
所有员工都统计
select sum(comm)/count(*) 一,sum(comm)/count(nvl(comm,0)) 二, avg(nvl(comm,0)) 三 from emp;
非空员工的统计
select sum(comm)/count(comm) 二, avg(comm) 三 from emp;
3、使用GROUP BY 子句数据分组
(1)求出employee表中各部门的平均工资,并按照部门号分组
select deptno 部门号,avg(sal) 平均工资 from emp group by deptno;
注意:
在select列表中所有未包含在组函数中的列都应该包含在group by子句中
就是select 列名一,列名二 from emp group by 列名一;
因为列名一不是列名二的内容,所有要加在group by 后面
(2)求每个部门的平均工资,要求显示:部门的平均工资
select avg(sal) 平均工资 from emp group by deptno;
注意:
包含在group by 子句中的列不必包含在select列表中
(3)使用多个列分组
查询员工的薪水总额
select deptno 员工号,job 工作,sum(sal) 总薪水 from emp group by deptno,job order by deptno;
修改语句:
edit
编辑后保存
执行语句:
/
(4)非法使用组函数
所包含与select列表中,而未包含于组函数中的列都必须包含于group by 子句中
经典错误
select deptno,count(ename) from emp;
正确形式:
select deptno,count(ename) from emp group by deptno;
4、使用HAVING子句过滤分组结果集
(1)求平均工资大于2000的部门
select deptno 部门号,avg(sal) 平均工资 from emp group by deptno having avg(sal)>2000;
where与having的区别
a、不能在where子句中使用组函数
b、可以在having子句中使用组函数
(2)查询10号部门的平均工资(where和having可以通用的情况)
select deptno 部门号,avg(sal) 平均工资 from emp group by deptno having deptno=10;
select deptno 部门号,avg(sal) 平均工资 from emp where deptno=10 group by deptno;
注意:
从SQL优化的角度看,尽量使用where,where使得分组记录数大大降低,从而提高效率
5、在分组查询中使用order by子句
(1)求每个部门的平均工资,要求显示:部门号,部门的平均工资,并且按照工资升序排列(可以按照:列、别名、表达式、序号进行排序)
select deptno 部门号,avg(sal) 平均工资 from emp group by deptno order by avg(sal);
写法二:
select deptno 部门号,avg(sal) 平均工资 from emp group by deptno order by 2;
追加降序命令:
a(后接两个或以上空格)
a desc
/
select deptno 部门号,avg(sal) 平均工资 from emp group by deptno order by 2 desc;
(2)分组函数的嵌套
求部门平均工资的最大值
思路:(a)通过avg函数求出每个部门的平均工资
(b)嵌套max函数求出部门平均工资的最大值
select max(avg(sal)) 平均工资 from emp group by deptno;
6、group by语句的增强
(1)按部门、不同的职位、统计工资总额,
按部门,统计工资总额
统计工资总额
select deptno 员工号,job 工作,sum(sal) 总薪水 from emp group by deptno,job order by deptno;
select deptno 员工号 sum(sal) 总薪水 from emp group by deptno
select sum(sal) 总薪水 from emp
上三句相加得下边一句话
break on deptno skip 2
set pagesize 30
select deptno,job,sum(sal) from emp group by rollup(deptno,job);(不可设置别名)
7、SQL*PLus的报表功能
报表包括:标题/页码/别名等
ttitle col 15 '我的报表' col 35 sql.pno 空15个列显示我的报表这个标题,空35个列
col deptno heading 部门号 标题设置为不猛号
col job heading 职位
col sum(sal) heading 工资总额
break on deptno skip 1
select deptno,job,sum(sal) from emp group by rollup(deptno,job);
保存一个目录中,get 文件路径
@路径执行
8、多表查询
(1)什么是多表查询?
从多个表中获取数据,就是多表查询
(2)迪卡尔集
例子演示:
create table dept_disk(
deptno number(5,0) primary key,
dname varchar2(20)
);
insert into dept_disk values(1,'开发部');
insert into dept_disk values(2,'行政部');
create table emp_disk(
emptno number(5,0),
ename varchar2(20),
sal number(5,0),
deptno number(5,0)
);
insert into emp_disk values(1,'开发部');
insert into emp_disk values(2,'行政部');
两包张表按照如下规则合并成一张表,叫做迪卡尔集表
(1)迪卡尔集表的列数,等于每张表的列数相加,迪卡尔集表的行数,等于每张表的行数相乘.得到笛卡尔全集
(2)多表查询的核心是连接条件.连接条件的个数,表的个数减一,两张表至少有一个连接条件.
注意:
(a)为了避免迪卡尔集,可以在where加入有效的连接条件.
(b)在实际运行环境下,应避免使用笛卡尔全集.
连接类型:
(3)等值连接
连接条件是个等号,就是等值连接
例子:查询员工信息,要求显示:员工号,姓名,月薪,部门名称
select e.empno as 员工号,e.ename as 姓名,e.sal as 月薪,d.dname as 部门名称 from emp e, dept d where e.deptno=d.deptno;
(4)不等值连接
例子:查询员工信息,要求显示:员工号,姓名,月薪,薪水等级(用between...and需要小值在前,大值在后)
select e.empno as 员工号,e.ename as 姓名,e.sal as 月薪, s.grade as 薪水等级 from emp e,salgrade s where e.sal between s.losal and s.hisal;
(5)外连接
例子:按部门统计员工人数,要求显示:部门号,部门名称,人数
select d.deptno as 部门号,d.dname as 部门名称,count(e.empno) as 人数 from dept d, emp e where e.deptno(+)=d.deptno group by d.deptno,d.dname;
注意:
(a)核心:通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中
(b)左外连接:当条件不成立的时候,等号左边的表仍然被包含(等号右边加(+))
(c)右外连接:当连接条件不成立的时候,等号右边的表仍然被包含(等号左边加(+))
(6)自连接
例子:查询员工姓名和员工的老板姓名
连接条件员工的老板号等于老板的员工号
select e.ename as 员工姓名,b.ename as 老板姓名 from emp e,emp b where e.mgr=b.empno;
注意:
(a)核心:通过别名,将同一张表视为多张表
自连接存在的问题:
(1)自连接不做任何操作,得到的就是笛卡尔乘积
select count(*) from emp e,emp b;
(a)问题一:自连接不是和操作大表(因为自乘会有很大的数据)
解决方法:层次查询
说明:某些情况下,可以替代自连接,本质上是一个单表查询
(7)层次查询
原理:关系成成树状图
select level as 层次,empno as 员工号,ename as 员工姓名,sal as 月薪,mgr as 老板号 from emp connect by prior empno=mgr start with mgr is null order by 1;
优点:单表查询
缺点:没有自连接直观
Oracle学习笔记(七)的更多相关文章
- Oracle学习笔记七 锁
锁的概念 锁是数据库用来控制共享资源并发访问的机制. 锁用于保护正在被修改的数据 直到提交或回滚了事务之后,其他用户才可以更新数据 对数据的并发控制,保证一致性.完整性.
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- oracle学习笔记第一天
oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字 1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- Oracle学习笔记——点滴汇总
Oracle学习笔记——点滴汇总 http://www.botangdb.com/ Oracle GI = Grid Infrastructure = ASM + Cluster
随机推荐
- Oracle VM VirtualBox安裝Windows 2000失败
问题: VirtualBox下安装Windows2000,设置网络后进入最后一步,复制组件……然后就是重启:再试还是重启! 解决: 在Oracle网站上查了一下资料:http://www.virt ...
- Codeforces Round #474-B(贪心)
一.题目链接 http://codeforces.com/contest/960/problem/B 二.题意 给定三个数字$N, k1, k2$,接下来给出两组数$a[]$和$b[]$,每组数$N$ ...
- aix操作系统的版本中TL SP 含义
AIX 分为四个主要的操作系统级别:版本.发行版.技术级 (TL) 和服务包 (SP).版本和发行版通常指的是 AIX 的名称,例如AIX 7.1.TL 是包含重大更新的操作系统的发行版,而 SP 包 ...
- 关于Selenium HTMLTestRunner 无法生成测试报告
解决方法 1: filename = ‘E:\testresult.html’,如果是在windows环境,文件名要使用以下几种格式. ①filename = 'E:\\testresult.html ...
- POI 3.17
发现与之前使用的有些不同 参考:https://www.cnblogs.com/h--d/p/6735110.html
- mock 的独立使用
public class Air21QueryMileStoneJobTest{ @InjectMocks Air21QueryMileStoneJob air21QueryMileStoneJob ...
- 「小程序JAVA实战」小程序的个人信息作品,收藏,关注(66)
转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudegerenxinxizuopinshoucangguanzhu65 ...
- cas-client登录后报INVALID_PROXY_CALLBACK
服务器部署cas,登录后页面提示INVALID_PROXY_CALLBACK 然后查看cas的日志,日志报以下错误: 2018-06-29 11:36:06,251 ERROR [org.jasig. ...
- istview android:cacheColorHint,android:listSelector属性作用(转)
原文ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉, 原因是,滚动时,列表里面的view重绘时,用 ...
- C++实现:把一个文件夹里的冗余文件(.txt)删除
代码很简单,调用了MFC里的几个函数.这里的冗余判断,是要遍历文件内容,进行两两比较. 需要注意的地方有两点: 1.源文件里头文件<afx.h>必须放在最前面.这里是为了避免nafxcwd ...