数据库表的关联、集合操作

ops/2024/10/21 23:02:55/

数据库表的关联、集合操作

join、MySQL、Oracle

什么left right的老是忘,归根到底还是不熟练,记录下来,以后就不用再搜了。

设表A、表B分别包含员工信息和部门信息。

表A包含员工的ID、姓名和部门ID,
表B包含部门ID和部门名称。

(Inner) Join 内连接

返回两个表中满足连接条件的记录。如果两个表中没有匹配的记录,则不会返回任何结果。
inner join 和 join 等价。

sql">SELECT A.ID, A.Name, B.DepartmentName
FROM TableA AINNER JOIN TableB B ON A.DepartmentID = B.DepartmentID;

在两个字段同名的情况下,这个sql可以使用using进一步简化:

sql">SELECT A.ID, A.Name, B.DepartmentName
FROM TableA AINNER JOIN TableB B USING (DepartmentID);

若两表只有一对同名字段,则可以进一步简化(使用自然连接):

sql">SELECT A.ID, A.Name, B.DepartmentName
FROM TableA ANATURAL JOIN TableB B;

返回表A中员工的ID和姓名,以及他们所在的部门名称,只返回满足连接条件的记录。

Left Join 左连接

等效 left outer join ,outer可省略

返回左表中所有的记录,以及与右表中满足连接条件的记录。如果右表中没有匹配的记录,则返回NULL值。

sql">SELECT A.ID, A.Name, B.DepartmentName
FROM TableA ALEFT JOIN TableB B ON A.DepartmentID = B.DepartmentID;

返回表A中员工的ID和姓名,以及他们所在的部门名称,如果有员工所在的部门在表B中没有对应的部门记录,那么部门名称将显示为NULL值。

Right Join 右连接

等效 right outer join ,outer可省略

返回右表中所有的记录,以及与左表中满足连接条件的记录。如果左表中没有匹配的记录,则返回NULL值。

sql">SELECT A.ID, A.Name, B.DepartmentName
FROM TableA ARIGHT JOIN TableB B ON A.DepartmentID = B.DepartmentID;

返回表B中的部门ID和部门名称,以及该部门下的员工信息,如果有部门在表A中没有员工记录,那么员工ID和姓名将显示为NULL值。

全外连接

在 Oracle 中可以使用Full Outer Join,等效full join,outer可省略:

SELECT A.ID, A.Name, B.DepartmentName
FROM TableA AFULL OUTER JOIN TableB B ON A.DepartmentID = B.DepartmentID;

返回所有员工和所有部门信息,员工无部门其部门显示NULL,部门无员工其员工显示NULL

解决MySQL中不支持全外连接的办法:

将左外连接和右外连接中间利用union取并集(去重,执行效率低):

sql">SELECT A.ID, A.Name, B.DepartmentName
FROM TableA ALEFT JOIN TableB B ON A.DepartmentID = B.DepartmentID
UNION 
SELECT A.ID, A.Name, B.DepartmentName
FROM TableA ARIGHT JOIN TableB B ON A.DepartmentID = B.DepartmentID;

或可利用union all取并集(不去重,执行效率高):

sql">SELECT A.ID, A.Name, B.DepartmentName
FROM TableA ALEFT JOIN TableB B ON A.DepartmentID = B.DepartmentID
UNION ALL
SELECT A.ID, A.Name, B.DepartmentName
FROM TableA ARIGHT JOIN TableB B ON A.DepartmentID = B.DepartmentID;

集合操作

MySQL只支持并集,交、差不支持;

Oracle支持并、交、差。

三表查询

自连接查询

以上是99语法

92语法

交叉连接

两表中间使用逗号分隔,表示两表笛卡尔积,然后利用where条件筛选。

  1. 92语法更简单但使用繁琐,无特性关键词(个人感觉可以理解为一种语法糖)
  2. 92语法的 表的连接条件 和 筛选条件 没有分开
  3. 99语法提供了更多查询连接类型,使用和表达上更为简洁,但语法体系更为冗杂

声明:本文使用八爪鱼rpa工具从gitee自动搬运本人原创(或摘录,会备注出处)博客,如版式错乱请评论私信,如情况紧急或久未回复请致邮 xkm.0jiejie0@qq.com 并备注原委;引用本人笔记的链接正常情况下均可访问,如打不开请查看该链接末尾的笔记标题(右击链接文本,点击 复制链接地址,在文本编辑工具粘贴查看,也可在搜索框粘贴后直接编辑然后搜索),在本人博客手动搜索该标题即可;如遇任何问题,或有更佳方案,欢迎与我沟通!


http://www.ppmy.cn/ops/127399.html

相关文章

【专题】数据库编程

1. MySQL编程基础 1.1 常量与变量 字符串常量: 字符串常量指用单引号或双引号括起来的字符序列。 示例:查询表emp中ename值为SCOTT的雇员信息。 SELECT * FROM emp WHERE enameSCOTT; 数值常量: 数值常量可以分为整数常量和小数常量。 示…

pycharm 进行远程开发

配置 应用 配置环境变量 将Python路径输入其中即可 相关问题: 1、运行时报错

uniapp+veu3在vite.config.ts配置代理解决跨域问题

我的本地服务接口地扯是:http://localhost/test/Test.php?user_id1 我的前端访问地扯是:http://localhost:5173/ 前端访问后端服务接口就会跨域,配置代理如下: 配置文件名:vite.config.ts import { defineConfig …

Redis --- 第八讲 --- 关于主从复制哨兵

主从复制的补充问题 从节点和主节点之间断开连接,有两种情况: 1、从节点和主节点断开连接 slaveof no one 命令。这个时候,从节点就能能够晋升成主节点。意味着我们程序员要主动修改redis的组成结构。, 2、主节点挂了 这个时…

使用PHP-Xlswriter导出数据库表至excel

/*** 导出测试* author LWW*/public function export(){$header [[title > 一级表头1,children > [[title > 二级表头1,],[title > 二级表头2,],[title > 二级表头3,],]],[title > 一级表头2],[title > 一级表头3,children > [[title > 二级表头1,…

用户的访问行为是否影响网站在搜索引擎上的排名呢?

用户访问数据是否影响网站在搜索引擎上的排名呢? 大家好,我是SEO专家(林汉文),在搜索引擎优化(SEO)的讨论中,用户访问数据是否会直接影响网站在搜索引擎结果页面(SERP&a…

JVM篇(学习预热 - JVM正式展开 - (实战课程学习总结))(持续更新迭代)

目录 感觉也看了这么多,说一些乱七八糟的内容,完全没有实质的收获,那么现在让我们正式来预热下JVM 吧? 一、程序的执行方式 二、为什么使用 JVM 三、字节码和机器码的区别 四、JDK、JRE与JVM的关系 五、OracleJDK和OpenJDK …

typescript 中封装一个 class 来解析接口响应数据

在TypeScript中,封装一个类来解析接口响应数据是一个常见的做法,它允许你将与接口响应相关的逻辑封装在一个可复用的单元中。下面是一个示例,展示了如何定义一个TypeScript类来解析一个假设的API接口响应数据。 首先,我们定义一个…