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 分别为两表的行数)
使用场景 自我比较、查找相关记录(如"比昨天温度高") 枚举所有组合,如"所有商品和所有客户"
性能 较高(条件过滤优先) 较低(生成全部组合再过滤)
相关推荐
Coder_Boy_1 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy1 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道3 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707533 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha3 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance3 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋3 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.4 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
天天爱吃肉82184 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车