对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等联表查询,有没什么内在联系呢?
请大虾指教。。

解决方案 »

  1.   

    补 充一下,在实际应用中,我用了多个表别名查询,但由于这个问题,造成一个很困惑的问题,
    因为,我后面接的where 条件中,并不是每个表查询都涉及到的,要看具体用户查询什么,动态的添加条件,
    当然,有时候每个表都会用到,这时,如果有一个表没用到,并且,刚才那个表数据为空,这个时候,整个查询结果都变成空的了,这显然不是我想要的。
    我想要的是:不管你from 后面加多少个别名表,只要查询条件where 后,跟这些表没关系,就能忽略不计,如何实现呢?
      

  2.   

    select a.id from T1 a,T2 b;
    产生笛卡尔积,有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方面的基础知识