此问题已经在这里有了答案:
我在编写查询时犯了一个错误,我试图理解为什么这个查询甚至可以运行。这是查询:
select * from user
where user_id in (select user_id from admin);
在此查询中,user_id
表中没有字段admin
,但查询仍在运行,最后返回意外结果。 user_id
表中有一个user
。
当我将字段更改为主表中不存在的内容时,查询将不会运行。
select * from user
where user_id in (select test_id from admin);
我还尝试使用不存在的表运行它,该表也没有运行。
select * from user
where user_id in (select user_id from blah);
有人可以解释为什么第一个查询有效吗?有没有更好的方式编写这些查询,从而可以更容易发现错误?
Always限定您的列引用。您认为第一个查询是:
select u.*
from user u
where u.user_id in (select a.user_id from admin a);
因为a.user_id
不存在,它解释为:
select u.*
from user u
where u.user_id in (select u.user_id from admin a);
这正在测试您可能不关心的两件事:
u.user_id
不为空admin
至少有一行