【重学 MySQL】二十七、七种 join 连接

server/2024/9/22 11:45:41/

【重学 MySQL】二十七、七种 join 连接

  • `union` 的使用
    • UNION 的基本用法
    • 示例
    • UNION ALL 的用法
  • 七种 `join` 连接
    • 代码实现
    • 语法格式小结

在这里插入图片描述

union 的使用

UNION 在 SQL 中用于合并两个或多个 SELECT 语句的结果集,并默认去除重复的行。如果希望包含重复行,可以使用 UNION ALL

UNION 的基本用法

当你想要将两个或多个 SELECT 语句的结果合并成一个结果集时,可以使用 UNION。每个 SELECT 语句必须拥有相同数量的列,并且对应列的数据类型也需要兼容。

语法

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
  • 默认情况下,UNION 会从结果集中删除重复的行。
  • 如果要包含所有重复行,请使用 UNION ALL

示例

假设我们有两个表,employees_usaemployees_europe,它们都有 employee_idemployee_name 这两列。

employees_usa 表

employee_idemployee_name
1John Doe
2Jane Smith

employees_europe 表

employee_idemployee_name
3Peter Brown
2Jane Smith

如果我们想要合并这两个表的结果,但不包含重复的行,我们可以这样做:

SELECT employee_id, employee_name FROM employees_usa
UNION
SELECT employee_id, employee_name FROM employees_europe;

这将返回:

employee_idemployee_name
1John Doe
2Jane Smith
3Peter Brown

注意,尽管 Jane Smith 在两个表中都出现,但在结果集中只出现了一次,因为 UNION 默认去除了重复的行。

UNION ALL 的用法

如果你想要包含所有重复的行,可以使用 UNION ALL

语法

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

使用 UNION ALL 重复上面的例子:

SELECT employee_id, employee_name FROM employees_usa
UNION ALL
SELECT employee_id, employee_name FROM employees_europe;

这将返回:

employee_idemployee_name
1John Doe
2Jane Smith
3Peter Brown
2Jane Smith

现在,Jane Smith 出现了两次,因为 UNION ALL 保留了所有行,包括重复的行。

七种 join 连接

在这里插入图片描述

代码实现

#中图:内连接 A∩B
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;
#左上图:左外连接
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
#右上图:右外连接
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
#左中图:A - A∩B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
#右中图:B-A∩B
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL
#左下图:满外连接
# 左中图 + 右上图  A∪B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL  #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
#右下图
#左中图 + 右中图  A ∪B- A∩B 或者 (A -  A∩B) ∪ (B - A∩B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL

语法格式小结

  • 左中图
#实现A -  A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;
  • 右中图
#实现B -  A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;
  • 左下图
#实现查询结果是A∪B
#用左外的A,union 右外的B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句union select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;
  • 右下图
#实现A∪B -  A∩B  或   (A -  A∩B) ∪ (B - A∩B)
#使用左外的 (A -  A∩B)  union 右外的(B - A∩B)
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句unionselect 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

http://www.ppmy.cn/server/118363.html

相关文章

MySQL——数据类型(二)

目录 一、日期与时间类型 1.1 date 1.2 datetime 1.3 timestamp 二、枚举和联合 2.1 enum 2.2 set 2.2.1 set 的插入 2.2.2 set 的查找 思维导图可以参考如下链接: 数据类型.xmind 夜夜亮晶晶/MySQL - Gitee.com 一、日期与时间类型 1.1 date 日期 yyy…

HTTP 协议的基本格式

HTTP协议("超文本传输协议"),是一个被广泛使用应用层协议,自1991年正式发布HTTP协议以来,HTTP协议就一直在更新,目前已经更新到3.0版本,但是目前主流的依旧是1.1版本,但依旧是一个最主流使用的应…

用Blender来烘培模型材质

通常我们在做三维设计,游戏开发的时候,经常需要从网上下载一些3D模型,这些模型采用的材质分辨率通常都不一样,而我们从性能考虑,需要对材质进行统一的处理,例如把材质都统一为2K的分辨率。 我们可以在Blen…

React两种路由模式的实现原理

React 中常用的两种路由模式是 HashRouter 和 BrowserRouter。它们分别使用不同的方式来管理和监听 URL 变化。以下是这两种路由模式的实现原理。 1. HashRouter HashRouter 使用 URL 的哈希部分(即 # 后面的部分)来保持 UI 和 URL 的同步。哈希部分不…

Kubernetes 网络

Kubernetes 网络详解与常见问题探讨 Kubernetes 是一种广泛使用的容器编排平台,其网络架构是保证集群内外通信顺畅的重要基础。Kubernetes 网络旨在为容器提供灵活、可扩展且隔离的通信机制。在实际的 Kubernetes 集群部署和使用过程中,网络相关的问题常…

基于微信小程序的宿舍报修系统的设计与实现

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宿…

构建有温度的用户关系:开源 AI 智能名片、链动 2+1 模式与 S2B2C 商城小程序的作用

摘要:本文探讨了在当今商业环境中,不能仅仅依靠产品打造连接,而应通过有温度的营销构建用户关系。引入开源 AI 智能名片、链动 21 模式及 S2B2C 商城小程序等创新元素,阐述它们在营销连接中的作用,强调只有通过营销连接…

外网(公网)访问VMware workstation 虚拟机内web网站的配置方法---端口转发总是不成功的原因

问题背景:客户提供的服务器操作系统配置web程序时,总是显示莫名其妙的问题,发现是高版本操作系统的.net库已经对低版本.net库进行了大范围修订,导致在安全检测上、软件代码规范上更加苛刻,最终导致部署不成功。于是想到…