oracle 自带的查询工具(Oracle的高级查询)
oracle 自带的查询工具(Oracle的高级查询)
1. 分组查询1.1 分组函数的概念分组函数作用于一组数据,并对一组数据返回一个值。
1.2 分组函数的使用- 语法
- 示例
- 分组函数与空值
- 分组函数会自动忽略空值,统计非空的行数,例如统计员工的平均奖金时 奖金那列有空值
- nvl函数使分组函数无法忽略空值
- 在分组查询中使用order by子句
- 在select列表中所有未被包含在主函数中的列都应该包含在group by子句中,包括分组函数前面的列,和分组函数后面的列
- 包含在group by子句中的列不必包含在select列表中
- group by语句的增强
- having后面的列必须是已经分组查询出来的列
- 不能在where子句中使用分组函数(重要)
- 可以在having子句中使用分组函数
- 笛卡尔积:拿着左边表的每一条数据跟右边表的所有数据都进行一次连接
- 避免笛卡尔积出现:在进行多表连接时,where连接条件不能少于N(表的数量) - 1
- 连接条件中是一个等号,表示为等值连接
- 第一种方式
- 第二种方式
- 连接条件中不是一个等号,而是除等号外的其他符号
- 第一种方式
- 第二种方式
- 根据列名进行连接,相同就进行连接,不相同则会生成笛卡尔集
- 通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中
- 左外连接表示结果中包含左边表中的全部记录,且如果左表的某行记录在右表中没有匹配项,则在返回结果中右表所对应的列的记录为空
- 第一种方式
- 第二种方式
- 右外链接表示结果中包含右边表中的全部记录,且如果右表的某行记录在左表中没有匹配项,则在返回结果中左表所对应的列的记录为空
- 返回所有匹配成功的记录,并返回左表未匹配成功的记录,也返回右表未匹配成功的记录
- 核心:通过别名,将同一张表看为多张表
- 查询每个员工的姓名和他上司的姓名
- 1)自连接不适合操作大表,因为他操作产生的笛卡尔积的大小至少是一个平方的关系
- 2)解决办法:
- 层次查询:层次查询在某些情况下可以取代自连接查询,本质上是一个单表查询
- 层次查询原理图
- 就是笛卡尔积 cross join。和现实生活中的各种比赛晋级相似
- select * from emp e cross join dept ;
- 问题不能一步解决的情况下,考虑使用子查询
- 放在select语句后面的子查询必须是一个单行子查询
- 查询出部门名称为’SALES‘下面的员工信息(不相关联的子查询)
select * from emp where deptno =
(select deptno from dept where dname ='SALES');
- 查询出部门名称为’SALES‘,'ACCOUNTING'下面的员工信息(不相关联的子查询)
select * from emp where deptno in
(select deptno from dept
where dname in('SALES' 'ACCOUNTING'));
- 查询出所有的员工信息,以及所在部门的名称(相关联的子查询)---可以把主查询中的值作为参数传递给子查询
select e.*
(select dname from dept where deptno = e.deptno ) 部门名称
from emp e;
3.1.3 Oracle中的伪列(rownum)
- 伪列其实就是行号,有以下特点
- 行号永远按照默认顺序生成
- 行号只能使用<、<= ,不能使用>、>=
- 行号不会随排序的结果发生变化
- 在一个子查询中可以有多个子查询
- 单行子查询只返回一条记录,返回多条记录就不是单行子查询了
- 结果为单行子查询时,外查询只能使用单行操作符
- 例如:查询部门名称为'SALES'的部门下的员工信息
- select * frome emp where deptno = (select deptno from dept);
- 多行子查询,子查询返回结果有多行记录
- 多行子查询,在外查询中只能使用多行操作符
- 例如:查询部门名称为'SALES','RESEARCH'的部门下的员工信息
- select * from emp where deptno in (select deptno from dept where deptno in ('SALES' 'RESEARCH'));
- 查询最低工资大于20号部门最低工资的部门号和部门的最低工资
- 查询工资比30号部门任意一个员工高的员工信息(使用any)
- 即表与表之间不连接,例如上面的单行子查询和多行子查询例子都是不相关联子查询
- 外层查询与里层子查询有一个条件关联起来了
- 例如:查询部门名称为'SALES','RESEARCH'的部门下的员工信息
- 查询出所有的员工信息,以及所在部门的名称