SQL:SELF JOIN(自连接)与CROSS JOIN(交叉连接)

目录

[SELF JOIN(自连接)](#SELF JOIN(自连接))

[CROSS JOIN(交叉连接 / 笛卡尔积)](#CROSS JOIN(交叉连接 / 笛卡尔积))

示例:

[SELF JOIN](#SELF JOIN)

[CROSS JOIN](#CROSS JOIN)

[如果没有 DATEDIFF() 函数怎么办?](#如果没有 DATEDIFF() 函数怎么办?)

[🔍 SELF JOIN vs CROSS JOIN 对比总结](#🔍 SELF JOIN vs CROSS JOIN 对比总结)


SELF JOIN(自连接)

📌1. SELF JOIN 是什么?

SELF JOIN(自连接) 是一种让同一张表自己连接自己的一种 JOIN 操作。

我们可以把同一张表"复制"两份,然后像普通 JOIN 一样连接。

📌 2. SELF JOIN 的语法:

sql 复制代码
SELECT ...
FROM 表名 AS A
JOIN 表名 AS B
  ON A.某列 = B.某列
WHERE ...

这里的 AB 都是同一张表的"别名",用于区分连接的两份数据。

📌3. SELF JOIN 的典型使用场景:

  • 比较不同行之间的关系,比如"比昨天高"

  • 计算相邻记录之间的差值

  • 在同一个表中查找有逻辑关系的记录,比如"员工和上级在一个表中"

CROSS JOIN(交叉连接 / 笛卡尔积)

📌 1. CROSS JOIN 是什么?

CROSS JOIN(交叉连接) 是一种连接方式,它会将两个表的所有记录两两组合,形成笛卡尔积。

例如:

表 A 有 2 行,表 B 有 3 行,

那么 A CROSS JOIN B 会得到 2×3=6 行记录。

📌 2. CROSS JOIN 的语法:

sql 复制代码
SELECT ...
FROM 表1
CROSS JOIN 表2

也可以写成不带 ON 的普通 JOIN,效果一样:

sql 复制代码
SELECT ...
FROM 表1, 表2

注意:没有连接条件! 全部组合!

📌 3. CROSS JOIN 的使用场景:

  • 枚举所有可能的组合(如所有商品和所有顾客)

  • 一般会配合 WHERE 条件进行过滤,否则生成的结果会很大


示例:

表: Weather

sql 复制代码
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| recordDate    | date    |
| temperature   | int     |
+---------------+---------+

id 是该表具有唯一值的列。

没有具有相同 recordDate 的不同行。

该表包含特定日期的温度信息

编写解决方案,找出与之前(昨天的)日期相比温度更高的所有日期的 id 。

(来源:Leecode)

SELF JOIN

sql 复制代码
SELECT w1.id
FROM Weather w1
JOIN Weather w2
  ON DATEDIFF(w1.recordDate, w2.recordDate) = 1
WHERE w1.temperature > w2.temperature;
  • Weather w1 JOIN Weather w2:自己连接自己,w1 是今天,w2 是昨天

  • DATEDIFF(w1.recordDate, w2.recordDate) = 1:表示 w1 是 w2 的第二天

  • w1.temperature > w2.temperature:当天温度高于昨天

CROSS JOIN

sql 复制代码
SELECT w1.id
FROM Weather w1
CROSS JOIN Weather w2
WHERE DATEDIFF(w1.recordDate, w2.recordDate) = 1
  AND w1.temperature > w2.temperature;
  • CROSS JOIN:生成所有日期组合

  • WHERE DATEDIFF(...) = 1:筛选出"今天-昨天=1天"的组合

  • w1.temperature > w2.temperature:筛选出当天温度更高的组合

如果没有 DATEDIFF() 函数怎么办?

可以用日期减一的方式:

sql 复制代码
SELECT w1.id
FROM Weather w1
JOIN Weather w2
  ON w1.recordDate = DATE_ADD(w2.recordDate, INTERVAL 1 DAY)
WHERE w1.temperature > w2.temperature;

⚠️ 注意性能:

CROSS JOIN 会先生成 全部组合,再用 WHERE 过滤,效率远低于 JOIN ... ON 的方式。

所以在实际中不推荐用 CROSS JOIN 写这个题,主要用于教学理解。

🔍 SELF JOIN vs CROSS JOIN 对比总结

比较项 SELF JOIN CROSS JOIN
含义 表与自身连接,按条件匹配不同记录 两表的所有记录两两组合
结果行数 根据 JOIN 条件过滤后生成的匹配行 m × n 行(m,n 分别为两表的行数)
使用场景 自我比较、查找相关记录(如"比昨天温度高") 枚举所有组合,如"所有商品和所有客户"
性能 较高(条件过滤优先) 较低(生成全部组合再过滤)
相关推荐
是2的10次方啊7 分钟前
MySQL索引设计原则:明明建了索引为什么还是慢?7条实战原则帮你避坑
mysql
('-')17 分钟前
《从根上理解MySQL是怎样运行的》第十二章学习笔记
笔记·学习·mysql
Boop_wu32 分钟前
[Java EE] 多线程编程进阶
java·数据库·java-ee
深瞳智检1 小时前
学习应用 第001期-Windows 10 用 CMD 安装 MySQL 全流程解析(免安装版)
数据库·windows·mysql·压缩包·环境安装
正在走向自律1 小时前
金仓数据库在发电行业的创新应用与实战案例
数据库·国产数据库·电力·kingbasees·电科金仓
华纳云IDC服务商1 小时前
MySQL数据库如何防止SQL注入攻击
数据库·sql·mysql
合作小小程序员小小店1 小时前
桌面开发,在线%物品代送,代接管理%系统,基于vs2022,c#,winform,sql server数据。
开发语言·数据库·sql·microsoft·c#
疏狂难除2 小时前
尝试rust与python的混合编程(二)
数据库·python·rust
h***59332 小时前
使用Canal将MySQL数据同步到ES(Linux)
linux·mysql·elasticsearch