两张表列名不同时WHERE IN语句的运行原理是什么?
WHERE IN 语句在关联列名不一致场景的运行逻辑
该场景下WHERE IN的生效和两张表的关联列名是否一致没有关系,核心逻辑是值匹配,具体运行顺序如下:
- 数据库优先执行括号内的子查询,从
citibike_trips表中筛选出usertype = 'Subscriber'的所有记录,最终返回符合条件的start_station_id值集合这里注意子查询只需返回待匹配的
start_station_id一列即可,不需要额外返回usertype字段,只需要在过滤条件中带上该字段就行 - 外层查询遍历
citibike_stations表的每一行数据,提取当前行的station_id值,去子查询返回的start_station_id值集合中做比对 - 只要
station_id能在值集合中找到完全相等的项,这条站点记录就会被保留到最终结果中
结合参考图的补充说明
- 列名一致时的关联逻辑示意图:和你当前列名不一致的场景运行逻辑完全相同,关联列名只是字段的标识,匹配阶段只会校验值的对应关系,和列名本身没有关联
- 子查询单独运行的结果截图:返回的所有
start_station_id都是订阅用户骑行的起点站点ID,这就是后续外层查询的匹配基准集合 - 完整查询运行结果截图:最终返回的站点,都是
station_id存在于上述基准集合中的记录,自然就是订阅用户使用过的所有站点列表
等价写法参考
你当前的需求可以用简化后的语句实现,和原写法逻辑完全一致:
SELECT name, station_id FROM citibike_stations WHERE station_id IN ( SELECT start_station_id FROM citibike_trips WHERE usertype = 'Subscriber' );
如果需要更高的可读性,也可以用JOIN写法实现完全等价的效果:
SELECT DISTINCT s.name, s.station_id FROM citibike_stations s JOIN citibike_trips t ON s.station_id = t.start_station_id WHERE t.usertype = 'Subscriber';
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

