对mysql没什么研究,也是属于现学现用的那种,今天用表别名查询,发现一个奇怪的问题:
先看一个语句:
select a.id from T1 a,T2 b;再看另一个语句:
select a.id from T1 a;之前总想当然的认为,这两个查询语句结果应该是一样的,因为,都是查T1表的嘛,
似乎无关T2表,但测试结果,很宁我意外,如果T2表为空,那么,第一个语句,根本就查不到东东,
当T2表有一条记录时,则查询结果正常,即可以把T1表中的id字段全部查出来(无重复)当T2表有两条记录,发现,查询得到的数量是1条记录的两倍,同理,当T2表有N条记录时,查到的记录数是:
N倍。
这到底是什么原因呢?为什么会这样,感觉T1表不应该受到T2表的影响啊,因为,我后面根本没加where a.id=b.id之类的条件啊?
最后一个问题是,表别名,跟left outer join等联表查询,有没什么内在联系呢?
请大虾指教。。
先看一个语句:
select a.id from T1 a,T2 b;再看另一个语句:
select a.id from T1 a;之前总想当然的认为,这两个查询语句结果应该是一样的,因为,都是查T1表的嘛,
似乎无关T2表,但测试结果,很宁我意外,如果T2表为空,那么,第一个语句,根本就查不到东东,
当T2表有一条记录时,则查询结果正常,即可以把T1表中的id字段全部查出来(无重复)当T2表有两条记录,发现,查询得到的数量是1条记录的两倍,同理,当T2表有N条记录时,查到的记录数是:
N倍。
这到底是什么原因呢?为什么会这样,感觉T1表不应该受到T2表的影响啊,因为,我后面根本没加where a.id=b.id之类的条件啊?
最后一个问题是,表别名,跟left outer join等联表查询,有没什么内在联系呢?
请大虾指教。。
因为,我后面接的where 条件中,并不是每个表查询都涉及到的,要看具体用户查询什么,动态的添加条件,
当然,有时候每个表都会用到,这时,如果有一个表没用到,并且,刚才那个表数据为空,这个时候,整个查询结果都变成空的了,这显然不是我想要的。
我想要的是:不管你from 后面加多少个别名表,只要查询条件where 后,跟这些表没关系,就能忽略不计,如何实现呢?
产生笛卡尔积,有A*B条记录,如果B记录数为0,则有0条记录
t1 t2
2 3
1
结果:
2 3
1 3t1 t2
2 3
1 4
结果:
2 3
2 4
1 3
1 4最后一个问题是,表别名,跟left outer join等联表查询,有没什么内在联系呢?
没有,只是缩短表名而已,直接使用别名我想要的是:不管你from 后面加多少个别名表,只要查询条件where 后,跟这些表没关系,就能忽略不计,如何实现呢?
不能,至少要产生笛卡尔积,除非设定条件建议看看有效SQL方面的基础知识