当前位置: 首页 > article >正文

oracl:多表查询>>表连接[内连接,外连接,交叉连接,自连接,自然连接,等值连接和不等值连接]

 SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系数据库的标准编程语言。

sql分类: 

数据查询语言(DQL - Data Query Language)

查询的关键词 select

多表查询>>表连接

表连接: 把2个或多张表左右合并为一张表

表连接的方式: 内连接, 外连接, 自连接, 自然连接, 交叉连接

其中外连接分为: 左外连接, 右外连接, 全外连接

连接的关键词: join  on 

连接关键词书写位置: from 之后, where之前

内连接 join  on 

表中的数据,满足关联条件可以关联上的数据才能被保留下来,没有主表从表之分

格式:  表1 join 表2 on 关联条件

示例: 查询员工工资小于3000的部门信息

注意: 对于在2张表都出现的字段,使用前在字段前加上表名以指定字段, 比如e.deptno表示的emp表的deptno字段,d.deptno表示的是dept表中的deptno字段 

确定表

select 后面需要展现的查询结果是:  部门信息>>即dept表的所有字段的信息>>dept表

where 条件过滤中需要用到的字段sal >>  emp表

确定连接方式: 满足条件的数据才出现>>内连接

连接条件的确定

通过查看2张表可以知道列DEPTNO是表EMP的外键(FK_DEPTNO), 也是表DEPT的主键(PK_DEPT), 所以可以使用e.deptno=d.deptno作为2张表的连接条件

确定过滤条件where

 工资大于3000, 即where sal < 3000

表和表之间的关系

没有distinct的查询结果中同样的部门信息会出现多次

查询员工工资大于3000的部门信息, 可知最终查询结果只需要每个部门出现一次即可,所以select 后面加destinct

外连接 

外连接: 左外连接, 右外连接, 全外连接

除了全外连接,左/右外连接需要区分主表和从表, 主表的数据会全部保留, 从表的数据只有符合关联连接的数据才会出现在查询结果中, 主表中, 没有和从表关联上的数据也会出现,但在对应的从表中是空值

连接格式

左外连接: 表1  left   [outer]  join 表2 on 连接条件;      left  jion之前是主表

右外连接: 表1  right   [outer]  join 表2 on 连接条件;   right  join 后面的是主表

全外连接:  表1  full  [outer]  join 表2 on 连接条件    

示例: 查询没有员工的部门信息

分析:

确定表

需要查询的是部门信息>>dept表,

条件是部门里没有员工, 即where emp.empno is null >>emp表

关联条件: emp.deptno=dept.deptno

连接方式: emp表的主键是EMPNO员工编号,"没有员工">> >该部门信息不会在emp表中出现, 即emp表中没有相应的deptno数据 >> 不满足关联条件 emp.deptno=dept.deptno 的部门信息需要出现在结果集中, 使用外/左/右连接

确定主表: 不满足关联条件但是需要出现在结果集中的信息是部门信息>>>主表: dept

条件: where emp.empno is null

>>左连接

>>右连接

>>外连接

示例: 全表连接和左/右表连接的不同

>>全连接

>>左连接 (从表dept中未满足关联条件的数据没有出现)

注意: 表连接是左右拼接为一张表, 当关联条件的字段也在查询结果中出现时,该关联字段出现2次

自然连接

 格式: 表1  natrural   jion  表2

一种特殊的内连接(INNER JOIN),它不需要明确指定连接条件。自然连接会自动使用两个表中具有相同名称的列作为连接条件。这些列的值必须相等,才能将对应的行连接起来。

注意: 不能写on 关联条件, 但是表中必须有可以用于关联的条件列(字段名称和数据类型均相同)

示例

>>自然连接

Oracle不允许在NATURAL JOIN中直接使用带有表别名的列进行过滤,因为NATURAL JOIN隐式地使用两个表中具有相同名称的列作为连接条件,而这些列在连接后会被重复,导致歧义。

解决: 使用内连接或套一个子查询

交叉连接 cross join

将两个表中的每一行与另一个表中的每一行配对,生成笛卡尔积(Cartesian Product)。这意味着结果集中的行数将是两个表行数的乘积。

语法: 表1 cross join 表2 

示例

select * from emp, dept;

查询结果: 先是dept表的第一行数据和emp表的每一行数据都进行连接, 再到dept表的第二行数据和emp表的每一行数据进行连接, 以此类推.所以结果集行数= emp表的行数*dept表的行数

自连接

通过取别名的方式让表自己连接自己, 可以把同一列的数据经过自连接后转到同一行(列转行)

示例: 原表

示例: 自连接>>获取每个城市及其所属省份的关系,从而实现层级结构的数据展示。

通过取别名的方式把areas表变成p表和c表, 再用关联条件把这2张表进行连接

SQL92标准的连接方式

没有join on 关键词,

使用where写连接条件, 连接效果和内连接相同; 连接条件为恒等式(比如1=1)时,形成交叉连接

示例 : 内连接效果

示例: 交叉连接效果 

外连接和内连接

当2张表可以使用内连接时, 意味着使用全/左/右连接都可以,并且不需要关注主表从表, 因为最终满足关联条件的数据都会返回

示例 : 查询员工工资小于3000的部门信息

左连接如下

右连接如下 

全外连接如下

 

连接条件的确定

通常基于两个表中具有关联性的列来确定

注意: 关联条件的字段不一定相同, 但是含义必须相同

等值连接和不等值连接

等值连接: 基于两个表中具有相等值的列来连接表 =

不等值连接/范围连接

1.使用不等运算符(如 <, >, <=, >=, <>!=)来连接两个表的条件。

2. 使用between 值1 and 值 2  ; 值1<值2

3. 使用in / not in 

4.like

where和on的区别

示例


http://www.kler.cn/a/527668.html

相关文章:

  • Docker小游戏 | 使用Docker部署跳一跳经典小游戏
  • 23.Word:小王-制作公司战略规划文档❗【5】
  • Python3 + Qt5:实现AJAX异步更新UI
  • EtherCAT主站IGH-- 25 -- IGH之fsm_slave_scan.h/c文件解析
  • DeepSeek 使用初体验
  • Git的安装步骤详解(复杂的安装界面该如何勾选?)
  • 在线知识库创建与维护提升企业效率与知识共享能力
  • 【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑
  • Linux Vim编辑器:快捷键与高效编辑技巧
  • C语言指针专题一 -- 指针基础原理
  • 【Linux】使用管道实现一个简易版本的进程池
  • Pandas 常用函数
  • 【PLL】杂散生成和调制
  • (动态规划基础 打家劫舍)leetcode 198
  • 简要介绍C++中的 max 和 min 函数以及返回值
  • TensorFlow 简单的二分类神经网络的训练和应用流程
  • Git 常用命令汇总
  • 3.Spring-事务
  • 冯诺依曼结构和进程概念及其相关的内容的简单介绍
  • 99.23 金融难点通俗解释:小卖部经营比喻PPI(生产者物价指数)vsCPI(消费者物价指数)