Oracle 连接查询

简介: 背景: emp表中有14条记录: dept表中4条记录: salgrade表中有5条记录: 一、交叉连接(CROSS JOIN)        交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。        例如:下面的语句1和语句2的结果是相同的(均为56条记录)。        语句1:隐式的交叉连

背景:

emp表中有14条记录:


dept表中4条记录:


salgrade表中有5条记录:

一、交叉连接(CROSS JOIN)

       交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。

       例如:下面的语句1和语句2的结果是相同的(均为56条记录)。

       语句1:隐式的交叉连接,没有CROSS JOIN。

select empno,ename,sal,dname,loc from emp,dept
   语句 2 :显式的交叉连接,使用 CROSS JOIN

select empno,ename,sal,dname,loc from emp CROSS JOIN dept

二、内连接

       内连接是根据指定的连接条件进行连接查询,只有满足连接条件的数据才会出现在结果集中。

       当执行两个表内连接查询的时,首先在第一个表中查找到第一个记录,然后从头开始扫描第二个表,逐一查找满足条件的记录,找到后将其与第一个表中的的第一个记录拼接形成结果集中的第一个记录。当第二个表被扫描一遍后,再从第一个表中查询第二个记录,然后再从头扫描第二个表,逐一查找满足条件的记录,找到后将其与第一个表中的第二个记录拼接形成结果集中的一个记录。重复执行,知道第一个表中的全部记录都处理完毕为止。

1. 相等连接

       通过两个表具有相同意义的列,可以建立相等连接条件。只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。

       例如,查询10号部门员工的员工号、员工名、工资、部门号和部门名:

SELECT empno,ename,sal,emp.deptno FROM EMP
join DEPT on EMP.DEPTNO = DEPT.DEPTNO and EMP.DEPTNO=10
       结果如下图:

2、不相等连接

    如果连接条件中的运算符不是等号而是其他关系的运算符,这成为不相等连接。

    例如,查询10号部门员工的工资等级:

select empno,ename,sal,grade 
from emp 
join salgrade 
on sal>losal and sal<hisal 
and deptno=10

结果如下图:


3、自身连接

       自身连接是指在同一个表或者视图中进行连接,相当于同一个表作为两个或多个表使用。

       例如:查询所有员工的员工号、员工名与该员工领导的员工名、员工号:

select work.empno,work.ename,manager.empno,manager.ename 
from emp work 
join emp manager 
on work.mgr=manager.empno
结果如下图:


三、外连接

       外连接是指在内连接的基础上,将某个连接表中不符合连接条件的记录加入到结果集中。

       在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。

1、  左外连接

       左外连接是指在内连接的基础上,将连接操作符左侧表中不符合连接条件的记录加入到结果集中,与之对应的连接操作符右侧表列用NULL填充。

       例如,查询10号部门的部门名 、员工号、员工名和所有其他部门的名称:

select dname,empno,ename 
from dept 
left join emp 
on dept.deptno=emp.deptno 
and dept.deptno=10;

        在这个例子中,首先要保证的是:我要查出10号部门的部门名称,即使10号部门中一个员工也没有,也要显示10号部门所有的部门名称,而部门名称在dept表中,故dept表放在左侧,有匹配数据的前三行就是用Join时,查出的数据,即满足On条件的数据。

结果如下图:


小注:关于left join的个人理解

        假如说你有两个表,资金结算单据(JSDJXX)、位信息(DWXX)
        一个表用来存放资金结算单据的信息(资金结算单据中肯定有单位嘛,但资金结算单据中得单位信息肯定是编号),另一个表用来存放单位信息(单位表里的数据比如会有:单位编号、单位名称、单位内码等等),现在我要查资金结算单据的信息,同时我又想让资金结算单据中的单位信息不显示编号,而是显示单位名称,这时候,我就需要用left join来关联单位信息表,因为我需要的数据是资金结算单据中的信息,即使在单位信息表表查不到某个单位编号对应的单位名称,这条数据我还是要显示的嘛,所以用left join而不是join。

SELECT JSDJXX_DWBH,DWXX_DWMC  
from  JSDJXX
left JOIN DWXX ON JSDJXX_DWBH = DWXX_DWBH 

        通过执行上面的SQL,获取ds,我就可以在往Gridcontrol上绑定数据的时候,绑定单位名称。

比如:

SELECT JSDJXX_DWBH,DWXX_DWMC as DWMC
from  JSDJXX
left JOIN DWXX ON JSDJXX_DWBH = DWXX_DWBH 
        在Dev  Gridcontrol上绑定列名的时候就可以用DWMC,即可。

2、  右外连接

       右外连接是指在内连接的基础上,将连接操作符右侧表中不符合连接条件的记录加入到结果集中,与之对应的连接操作符左侧表列用NULL填充。

       例如,查询20号部门的部门名称及其员工号、员工名和所有其他部门的员工号、员工名:

select empno ,ename,dname 
from dept 
right join emp 
on dept.deptno=emp.deptno 
and dept.deptno=20;
结果如下图:

3、  全连接

       全外连接是指在内外连接的基础上,将连接操作符两侧表中不符合的记录加入到结果集中

       例如,查询所有的部门名和员工名:

select dname,ename 
from emp 
full join dept 
on emp.deptno=dept.deptno
结果如下图:


小注:

1、左右外连接小结:

      左外连接(LEFT OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表的不匹配行。左外连接实际上可以表示为:
      左外连接 = 内连接 + 左边表中失配的元组
      其中,缺少的右边表中的属性值用NULL表示。
      右外连接(RIGHT OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)右边表的不匹配行。右外连接实际上可以表示为:
      右外连接 = 内连接 + 右边表中失配的元组
      其中,缺少的左边表中的属性值用NULL表示。
      全外连接(FULL OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表和右边表的不匹配行。全外连接实际上可以表示为:
      全外连接 = 内连接 + 左边表中失配的元组 + 右边表中失配的元组。
      其中,缺少的左边表或者右边表中的属性值用NULL表示。

2、类似文章推荐:点击打开链接

3、小结

      下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

  • JOIN: 如果表中有至少一个匹配,则返回行。例子:点击打开链接
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行。例子:点击打开链接
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行。例子:点击打开链接
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行。例子:点击打开链接
相关文章
|
SQL Oracle 关系型数据库
Oracle查询优化-查询只包含数字或字母的数据
【2月更文挑战第4天】【2月更文挑战第10篇】查询只包含数字或字母的数据
1558 1
|
9月前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
8月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的闪回版本查询
本文介绍了Oracle数据库的闪回版本查询(Flashback Version Query)功能,通过示例详细讲解了其使用方法。闪回版本查询可获取指定时间区间内行的不同版本,利用`versions between`子句实现。文中包含视频讲解,并通过创建测试表、插入数据及执行查询等步骤,演示如何获取历史版本信息和伪列详情,帮助用户深入了解该功能的实际应用。
186 13
|
7月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回事务查询
Oracle数据库的闪回事务查询(Flashback Transaction Query)是闪回版本查询的扩充,可用于审计或撤销已提交的事务。通过`flashback_transaction_query`视图,可生成还原特定事务的SQL语句。本文介绍了其基本概念,并通过实战演示如何使用该功能:从授权、开启UNDO数据增强,到创建测试表和事务,最后利用闪回查询撤销已提交的事务,验证数据恢复效果。附带视频讲解,帮助深入理解。
205 3
|
8月前
|
Oracle 关系型数据库 Linux
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
|
8月前
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】oracle dblink varchar类型查询报错记录
这篇文章主要介绍了 Oracle DBLINK 查询崖山 DB 报错的相关内容,包括 ODBC 安装配置、数据源配置、dblink 环境配置、问题原因分析及规避方法。问题原因是 dblink 连接其他数据库时 varchar 类型转换导致的,还介绍了 long 类型限制、char 等类型区别,规避方法是修改参数 MAX_STRING_SIZE 支持 32K。
|
9月前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
|
10月前
|
Oracle 关系型数据库 数据库
【YashanDB知识库】oracle dblink varchar类型查询报错记录
在使用Oracle DBLink查询VARCHAR类型数据时,可能会遇到多种报错。通过了解常见错误原因,采取合适的解决方法,可以有效避免和处理这些错误。希望本文提供的分析和示例能帮助你在实际工作中更好地处理DBLink查询问题。
310 10
|
10月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL Oracle 关系型数据库
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
221 0
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询

推荐镜像

更多