对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等联表查询,有没什么内在联系呢?
请大虾指教。。
解决方案 »
- mysql导入数据库问题
- mysql还原数据库问题,还原文件格式为gzip
- 指纹图片信息管理系统
- 帮帮我,windows下安装PostgreSQL最后老是出现这样的警告!
- 存储过程 mysql 没分了
- 多表联合查询问题
- 请问MySQL的C API怎么用啊,有没有什么建议阿,例子更好,谢谢了!
- 建表错误:MySQL said: You have an error in your SQL syntax near '( agegrp smallint(5) DEFAULT '0' NOT NULL, sex char(20) DEFAULT
- 为何不能实现想要的结果呢?(调试) 在线等待
- 高手看过来!!!! 高分求查询语句!!!!! 分不够可再加!!! 走过路过不要错过!!!!
- ubuntu下启动mysql
- 求SQL能够查询当前MYSQL性能的SQL语句
因为,我后面接的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方面的基础知识