示例
示例
SELECT *
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);| 语义 | 左表行在子查询中存在即保留,每行至多出现一次 |
|---|---|
| 优化 | MySQL 8 半连接/物化;PostgreSQL 哈希半连接 |
| 对比 | JOIN 会输出两表列并按匹配行数放大 |
IN 子查询表达“存在于另一张表”:只要找到匹配就返回该行,不放大行数;优化器通常把它改写为半连接。
SELECT *
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);| 语义 | 左表行在子查询中存在即保留,每行至多出现一次 |
|---|---|
| 优化 | MySQL 8 半连接/物化;PostgreSQL 哈希半连接 |
| 对比 | JOIN 会输出两表列并按匹配行数放大 |