Oracle中的分组查询、子查询、多表连接

简介: Oracle中的分组查询、子查询、多表连接

一、什么是分组查询?


对表中的数据使用特定的列进行分组,对分组后的各组数据分别使用组函数处理。

分组后,select后不能直接跟非分组依据列还有单行函数。


还用昨天的两个表,employee员工表和department部门表来做测试:


先来看一个需求: 【查询各个部门的最高薪资 】

显然这是要进行分组来统计计算的,要根据department_id分组,然后再使用max函数统计每个分组中的薪资最大值。查询代码如下:

  select department_id,max(salary)
  from employees
  group by department_id;

分组需要注意的地方是:

1,分组后的数据,以组为单位进行操作,所以后select可以跟组函数

2,分组后,每一组数据得出一个结果

3,select后跟分组依据,每一组的分组依据值一定相同,返回一个既可以,所以可以跟分组依据。

4,select后不能跟非分组依据列,每一组的非分组依据列的值未必相同,返回哪一行都不合适,所以不能跟在select后面

5,select后不能直接跟单行函数,单行函数对每一组的数据进行处理,该组内有几行,就返回几条数据,对一组处理后返回哪一条数据都不合适,所以select后不能直接跟单行函数。


对了,再补充一下什么是组函数:

数据被分到几个组里面,查询结果就会有几行数据。

一般情况下组函数是跟分组查询结合在一块使用的。

二、Having子句

关于何时用where何时用having

  1. 没有分组,一定用where
  2. 使用组函数进行条件判断一定用having
  3. 如果既可以使用where又可以使用having,优先使用where

三、Oracle独有的伪列:

伪列:不需要程序员手动创建,由Oracle为每一张表自动分配。

伪列的值如果不手动查询,默认隐藏。

  1. rowid 表示数据的物理地址。

  1. rownum 尝试给每一行满足条件的数据,进行编号,
    编号从1开始。
    Rownum赋值时机:在进行条件判断过程中,为满足条件的行赋值。
    当rownum参与条件判断时,不能使用> >= != = 可以使用< <=

Rownum:表示行号,行号的值做比较时不能大于一个值,只能小于一个值。

select * from departments where rownum<=10----正常运行

select * from departments where rownum<=10 and rownum>=6—查询不出来数据。


总结:

定义顺序    执行顺序
 Select           5
 From             1
 Where            2
 group by         3
 Having            4
 order by          6

四.子查询

一个查询SQL的条件依赖另外一个查询SQL的结果,可以在一个SQL中嵌套另外一个SQL。

  1. where单值子查询
    被嵌套的SQL返回一行一列的结果。

  2. where多值子查询:被嵌套的SQL返回结果是多行一列的数据。

3.from子查询:被嵌套的sql返回多行多列的数据
如果一个sql返回的结果是多行多列的,可以把返回结果当做一张新表看待。

分页查询:

五.表连接

当需要的信息来源于多张表时,可以将多张表连接起来,当做一张表看待。

  1. 内连接
    语法:select 列
    from 表1 inner join 表2
    on 连接条件;
  2. 左外连接(经常用)
    语法:select 列
    from 左表 left outer join 右表
    on 连接条件;

3.右外连接

语法: select 列

from 左表 right outer join 右表

on 连接条件;

4.全外连接

语法: select 列

from 左表 full outer join 右表

on 连接条件;

5.多表连接

6,自连接

不是技术上的分类,而是业务上的分类。自己连接自己。左表和右表都是一张表。

Sql:
Select s1.name,s2.name
From student s1 left join student s2
On s1.boss_id = s2.id
统计每个员工的姓名和领导的姓名。
Sql:
Select e1.first_name,e1.last_name,e2.first_name,e2.last_name
From employees e1 left join employees e2
On e1.manager_id=e2.employee_id

连接查询的关注点:

1.from后面跟哪些表

2.连接条件

3.我们使用哪种连接

四种连接的区别。左外链接把左表当成主表,右外连接把右表当成主表,完整外链接两张表都是主表,内连接两张表都是从表。

注意:inner 和 outer 可以省略

目录
打赏
0
0
0
0
64
分享
相关文章
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
【YashanDB知识库】oracle dblink varchar类型查询报错记录
在使用Oracle DBLink查询VARCHAR类型数据时,可能会遇到多种报错。通过了解常见错误原因,采取合适的解决方法,可以有效避免和处理这些错误。希望本文提供的分析和示例能帮助你在实际工作中更好地处理DBLink查询问题。
66 10
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
Navicat 连接Oracle ORA-28547: connection to server failed, probable Oracle Net admin error
Navicat 连接Oracle ORA-28547: connection to server failed, probable Oracle Net admin error
159 0

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等