select * from users left join orders on users.id=orders.user_id where type=1
该SQL中,users表和orderss表都有type字段,where中type没有加表名,正常相当于驱动表的type,如果mysql优化器优化成orders表驱动users表,type受影响吗?
--
select * from users left join orders on users.id=orders.user_id where type=1
该SQL中,users表和orderss表都有type字段,where中type没有加表名,正常相当于驱动表的type,如果mysql优化器优化成orders表驱动users表,type受影响吗?
--
2 回答8k 阅读✓ 已解决
2 回答6.9k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
1 回答5.7k 阅读✓ 已解决
3 回答3.4k 阅读✓ 已解决
1 回答5.4k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
1.SQL 的语义是固定的:where type = 1 中的 type 是基于查询的语法解析阶段确定的,而不是执行阶段的优化结果。解析时,type 默认绑定到 users.type,因为 users 是 FROM 中的主表。
2.优化器不会改变列的含义:优化器只调整执行计划(例如表扫描顺序、连接方式),不会重新解释 where 子句中的列引用。
3.歧义性检查:MySQL 在解析查询时,如果发现 type 是歧义列,会直接报错,而不是在执行时根据驱动表动态决定。
在你的查询中,where type = 1 默认会被解析为 users.type = 1,因为 users 是 LEFT JOIN 的左表(驱动表)。即使 MySQL 优化器将 orders 优化为驱动表,type 的含义不会受影响,仍然是 users.type。为了避免歧义和提高代码可读性,建议在查询中明确指定表名,例如 where users.type = 1。