WHERE子句中双SELECT子查询用法的疑问
为什么WHERE子句中可以使用这类SELECT语句
你看到的括号里的SELECT ...是子查询(也叫嵌套查询),SQL语法本身就允许在WHERE子句的条件表达式中使用这类子查询,核心原因在于子查询可以作为合法的表达式参与条件判断,只要其返回结果符合对应逻辑的要求:
1. 子查询的类型匹配规则
- 当使用
(SELECT ...) IN (SELECT ...)时,左边的子查询必须是标量子查询——也就是它只能返回单行单列的结果。比如(SELECT username FROM users WHERE user_id = 123),如果这个子查询只会输出一个值,那它就可以像普通字段或常量一样,参与IN的匹配逻辑。 - 右边的子查询则需要返回单列的数据集(可以是多行),这和你熟悉的
yyy IN (SELECT ...)写法里的子查询要求完全一致。
2. 本质是表达式的等价替换
SQL的WHERE子句本质是判断布尔表达式的真假。你熟悉的yyy IN (...)中,yyy是一个返回单个值的表达式(比如字段名、常量计算),而标量子查询只要能返回单个值,就完全可以替换yyy的位置——逻辑上等价于把子查询的结果提取出来,再和右边子查询的数据集做IN匹配。
举个实际例子:
假设你有orders订单表和vip_users会员表,要筛选出会员用户的订单:
- 你熟悉的写法:
SELECT order_no FROM orders WHERE user_id IN (SELECT id FROM vip_users) - 换成子查询在左侧的写法:
SELECT order_no FROM orders WHERE (SELECT user_id FROM orders o WHERE o.order_no = orders.order_no) IN (SELECT id FROM vip_users)
这里左侧的子查询只是取出当前订单对应的user_id,和直接写user_id的效果完全一致,只是用子查询的方式获取了这个值。
3. SQL标准的支持范围
SQL标准明确允许将标量子查询作为表达式使用,不止是IN判断,像=、>这类比较运算符也能搭配使用,比如WHERE (SELECT max(price) FROM goods) > 200,本质都是用子查询的结果作为普通值参与条件判断。
内容的提问来源于stack exchange,提问作者Richard Hartman
相关产品推荐
相关产品推荐

