快捷搜索:  汽车  科技

oracle 自带的查询工具(Oracle的高级查询)

oracle 自带的查询工具(Oracle的高级查询)

1. 分组查询1.1 分组函数的概念

分组函数作用于一组数据,并对一组数据返回一个值。

1.2 分组函数的使用
  • 语法

oracle 自带的查询工具(Oracle的高级查询)(1)

  • 示例

oracle 自带的查询工具(Oracle的高级查询)(2)

oracle 自带的查询工具(Oracle的高级查询)(3)

  • 分组函数与空值
    • 分组函数会自动忽略空值,统计非空的行数,例如统计员工的平均奖金时 奖金那列有空值
    • nvl函数使分组函数无法忽略空值
1.3 使用GROUP BY子句进行数据分组
  • 在分组查询中使用order by子句
    • 在select列表中所有未被包含在主函数中的列都应该包含在group by子句中,包括分组函数前面的列,和分组函数后面的列
    • 包含在group by子句中的列不必包含在select列表中

oracle 自带的查询工具(Oracle的高级查询)(4)

  • group by语句的增强
1.4 使用having 字句过滤分组结果
  • having后面的列必须是已经分组查询出来的列
1.4.1 举例

oracle 自带的查询工具(Oracle的高级查询)(5)

1.4.2 where和having的区别
  • 不能在where子句中使用分组函数(重要)
  • 可以在having子句中使用分组函数
2. 多表连接查询

oracle 自带的查询工具(Oracle的高级查询)(6)

2.1 笛卡尔集
  • 笛卡尔积:拿着左边表的每一条数据跟右边表的所有数据都进行一次连接
  • 避免笛卡尔积出现:在进行多表连接时,where连接条件不能少于N(表的数量) - 1

oracle 自带的查询工具(Oracle的高级查询)(7)

2.2 内连接2.2.1 等值连接
  • 连接条件中是一个等号,表示为等值连接
  • 第一种方式

oracle 自带的查询工具(Oracle的高级查询)(8)

  • 第二种方式

oracle 自带的查询工具(Oracle的高级查询)(9)

2.2.2 不等值连接
  • 连接条件中不是一个等号,而是除等号外的其他符号
  • 第一种方式

oracle 自带的查询工具(Oracle的高级查询)(10)

  • 第二种方式

oracle 自带的查询工具(Oracle的高级查询)(11)

2.2.3 自然连接
  • 根据列名进行连接,相同就进行连接,不相同则会生成笛卡尔集
2.3 外连接
  • 通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中
2.3.1 左外连接
  • 左外连接表示结果中包含左边表中的全部记录,且如果左表的某行记录在右表中没有匹配项,则在返回结果中右表所对应的列的记录为空
  • 第一种方式

oracle 自带的查询工具(Oracle的高级查询)(12)

  • 第二种方式

oracle 自带的查询工具(Oracle的高级查询)(13)

2.3.2 右外连接
  • 右外链接表示结果中包含右边表中的全部记录,且如果右表的某行记录在左表中没有匹配项,则在返回结果中左表所对应的列的记录为空
2.3.3 全外连接
  • 返回所有匹配成功的记录,并返回左表未匹配成功的记录,也返回右表未匹配成功的记录
2.4 自连接2.4.1 自连接举例
  • 核心:通过别名,将同一张表看为多张表
  • 查询每个员工的姓名和他上司的姓名

oracle 自带的查询工具(Oracle的高级查询)(14)

2.4.2 自连接存在的问题和解决办法
  • 1)自连接不适合操作大表,因为他操作产生的笛卡尔积的大小至少是一个平方的关系
  • 2)解决办法:
    • 层次查询:层次查询在某些情况下可以取代自连接查询,本质上是一个单表查询
    • 层次查询原理图

oracle 自带的查询工具(Oracle的高级查询)(15)

oracle 自带的查询工具(Oracle的高级查询)(16)

2.5 交叉连接
  • 就是笛卡尔积 cross join。和现实生活中的各种比赛晋级相似
  • select * from emp e cross join dept ;
3. 子查询
  • 问题不能一步解决的情况下,考虑使用子查询
3.1 子查询的使用

oracle 自带的查询工具(Oracle的高级查询)(17)

3.1.1 子查询需要注意的问题

oracle 自带的查询工具(Oracle的高级查询)(18)

oracle 自带的查询工具(Oracle的高级查询)(19)

  • 放在select语句后面的子查询必须是一个单行子查询
3.1.2 子查询例子
  • 查询出部门名称为’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)

  • 伪列其实就是行号,有以下特点
    • 行号永远按照默认顺序生成
    • 行号只能使用<、<= ,不能使用>、>=
    • 行号不会随排序的结果发生变化

oracle 自带的查询工具(Oracle的高级查询)(20)

3.2 子查询的类型
  • 在一个子查询中可以有多个子查询
3.2.1 单行子查询
  • 单行子查询只返回一条记录,返回多条记录就不是单行子查询了
  • 结果为单行子查询时,外查询只能使用单行操作符

oracle 自带的查询工具(Oracle的高级查询)(21)

  • 例如:查询部门名称为'SALES'的部门下的员工信息
  • select * frome emp where deptno = (select deptno from dept);

oracle 自带的查询工具(Oracle的高级查询)(22)

3.2.2 多行子查询
  • 多行子查询,子查询返回结果有多行记录
  • 多行子查询,在外查询中只能使用多行操作符

oracle 自带的查询工具(Oracle的高级查询)(23)

  • 例如:查询部门名称为'SALES','RESEARCH'的部门下的员工信息
  • select * from emp where deptno in (select deptno from dept where deptno in ('SALES' 'RESEARCH'));

oracle 自带的查询工具(Oracle的高级查询)(24)

  • 查询最低工资大于20号部门最低工资的部门号和部门的最低工资

oracle 自带的查询工具(Oracle的高级查询)(25)

  • 查询工资比30号部门任意一个员工高的员工信息(使用any)

oracle 自带的查询工具(Oracle的高级查询)(26)

3.3.3 不相关联子查询
  • 即表与表之间不连接,例如上面的单行子查询和多行子查询例子都是不相关联子查询
3.3.4 相关联子查询
  • 外层查询与里层子查询有一个条件关联起来了
  • 例如:查询部门名称为'SALES','RESEARCH'的部门下的员工信息

oracle 自带的查询工具(Oracle的高级查询)(27)

  • 查询出所有的员工信息,以及所在部门的名称

oracle 自带的查询工具(Oracle的高级查询)(28)

猜您喜欢: