数据库中半连接运算具体是怎样的操作?
- 内容介绍
- 文章标签
- 相关推荐
在处理大数据量的业务查询时你是否常常被笛卡尔积导致的慢查询折磨?半连接提供了一种高效的方法,帮助你在不返回完整联接结果的前提下快速过滤出需要的数据。
半连接是一种只返回“存在”信息的连接方式:当左表中的某行在右表中至少有一条匹配记录时A 的那行会被保留;如果没有匹配,则该行被丢弃。其实,与全连接不同的是结果中不包含右表的列。
1.1 主要类型
- 左半连接: 只保留左表满足条件的行。
- 右半连接: 只保留右表满足条件的行。
2. 半连接的实现方式
数据库厂商通常把半连接作为调整器内部的一步实现,但从 SQL 角度可以用三种写法:
2.1 使用 IN 子查询
SELECT *
FROM TableA A
WHERE A.id IN;
2.2 使用 EXISTS 子查询
SELECT *
FROM TableA A
WHERE EXISTS (
SELECT 1
FROM TableB B
WHERE B.id = A.id AND B.status = 'active'
);
2.3 使用 JOIN 并去掉右表字段
SELECT DISTINCT A.*
FROM TableA A
JOIN TableB B ON A.id = B.id
WHERE B.status = 'active';
这三种写法在大多数 RDBMS 中都能被识别为半连接,而且往往会生成相同或相似的执行计划。
在处理大数据量的业务查询时你是否常常被笛卡尔积导致的慢查询折磨?半连接提供了一种高效的方法,帮助你在不返回完整联接结果的前提下快速过滤出需要的数据。
半连接是一种只返回“存在”信息的连接方式:当左表中的某行在右表中至少有一条匹配记录时A 的那行会被保留;如果没有匹配,则该行被丢弃。其实,与全连接不同的是结果中不包含右表的列。
1.1 主要类型
- 左半连接: 只保留左表满足条件的行。
- 右半连接: 只保留右表满足条件的行。
2. 半连接的实现方式
数据库厂商通常把半连接作为调整器内部的一步实现,但从 SQL 角度可以用三种写法:
2.1 使用 IN 子查询
SELECT *
FROM TableA A
WHERE A.id IN;
2.2 使用 EXISTS 子查询
SELECT *
FROM TableA A
WHERE EXISTS (
SELECT 1
FROM TableB B
WHERE B.id = A.id AND B.status = 'active'
);
2.3 使用 JOIN 并去掉右表字段
SELECT DISTINCT A.*
FROM TableA A
JOIN TableB B ON A.id = B.id
WHERE B.status = 'active';
这三种写法在大多数 RDBMS 中都能被识别为半连接,而且往往会生成相同或相似的执行计划。

