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

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

目录

SELF JOIN(自连接)

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

 示例:

SELF JOIN 

 CROSS JOIN

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

🔍 SELF JOIN vs CROSS JOIN 对比总结


SELF JOIN(自连接)

📌1. SELF JOIN 是什么?

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

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

📌 2. SELF JOIN 的语法:

SELECT ...
FROM 表名 AS A
JOIN 表名 AS BON 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 的语法:

SELECT ...
FROM 表1
CROSS JOIN 表2

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

SELECT ...
FROM 表1, 表2

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

📌 3. CROSS JOIN 的使用场景:

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

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


 

 示例:

表: Weather 

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| recordDate    | date    |
| temperature   | int     |
+---------------+---------+

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

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

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

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

 (来源:Leecode)

SELF JOIN 

SELECT w1.id
FROM Weather w1
JOIN Weather w2ON 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

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

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

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

 

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

可以用日期减一的方式:

SELECT w1.id
FROM Weather w1
JOIN Weather w2ON 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 JOINCROSS JOIN
含义表与自身连接,按条件匹配不同记录两表的所有记录两两组合
结果行数根据 JOIN 条件过滤后生成的匹配行m × n 行(m,n 分别为两表的行数)
使用场景自我比较、查找相关记录(如“比昨天温度高”)枚举所有组合,如“所有商品和所有客户”
性能较高(条件过滤优先)较低(生成全部组合再过滤)

相关文章:

  • 码蹄集——中庸之道(三个数比较)
  • Git标签
  • 第二十一周:项目开发中遇到的相关问题(二)
  • “frame stacking”---帮助强化学习稳定提升和收敛技巧
  • 【KEIL】更新AC6编译器
  • 685SJBH计量管理系统
  • TAPIP3D:持久3D几何中跟踪任意点
  • postgresql主从一键安装脚本分享
  • 解决VirtualBox中虚拟机(ubuntu)与主机(windows)之间互相复制粘贴(文本)
  • 思维链是仅仅通过提示词实现的吗
  • Kafka topic 中的 partition 数据倾斜问题
  • Spark任务调度流程详解
  • 代码随想录算法训练营第六十天| 图论7—卡码网53. 寻宝
  • 【大模型】AI智能体Coze 知识库从使用到实战详解
  • Windows使用虚拟环境执行sh脚本
  • git 报错:错误:RPC 失败。curl 28 Failed to connect to github.com port 443 after 75000
  • 48.辐射发射RE和传导发射CE测试方法分析
  • C++八股——函数对象
  • 基于大模型研究报告清单
  • 【软件测试】基于项目驱动的功能测试报告
  • 费高云不再担任安徽省人民政府副省长
  • 法治日报整版聚焦:儿童能否成为短视频主角?该如何监管?
  • 明查|印度空军“又有一架战机被巴基斯坦击落,飞行员被俘”?
  • 印称印巴军事行动总指挥同意将局势降级
  • 权益类基金发行回暖,这些老将挂帅新基,谁值得买?
  • 干部任职公示:陕西宁强、镇安两县县长拟进一步使用