我mysql有三张表,三表的count条数分别为2224,175,7.为什么我把他们连起来查的话查出来的条数是这三个表各自条数的乘积?
SELECt COUNT(*) FROM aaa (2224条)
SELECt COUNT(*) FROM bbb (175条)
SELECt COUNT(*) FROM ccc (7条)
SELECt COUNT(*) FROM aaa,bbb,ccc (2724400条)
能否告诉我为什么连起来查出来的是前边三个数的乘积呢? 我这种查法是不是关联查询呢?
sql 问题,大神来帮忙。 我mysql有三张表,三表的count条数分别为2224,.....
答案:2 悬赏:80 手机版
解决时间 2021-02-07 07:39
- 提问者网友:我是我
- 2021-02-07 02:43
最佳答案
- 五星知识达人网友:走死在岁月里
- 2021-02-07 03:38
必须是乘积啊,因为你得到了笛卡尔积,笛卡尔积是什么呢?就是所有行的无条件匹配。
假如你是aaa和bbb这样来一下,我们看这个select出来的是什么。
首先aaa的第一行,右边join bbb的第一行,完了吗?没有,接下来还有bbb的第二行,第三行……直到最后一行,所以先是得到了aaa的第一行和bbb的所有行的连接,然后还有aaa的第二行……直到最后一行,那么最后就得到了aaa和bbb的全连接,记录数自然是行数相乘(注意实际上不一定是按照单独查询aaa的行号来匹配,数据库按照自己的方法来全连接)。
那么很显然,你3个表全连接就是行数之积了。
你在你的最后一句select里面,加上where条件,比如aaa的某字段=bbb的某字段,bbb的某字段=ccc的某字段,就相当于从这个全连接里过滤出你要的组合了。
一般情况下要注意避免这样的全连接,要有目的的使用left join或者right join,因为系统可能先生成笛卡尔积,这样会大大占用系统资源,当此临时结果过大,会将临时表写入磁盘而不是内存(因为装不下),就会极大影响查询效率。
假如你是aaa和bbb这样来一下,我们看这个select出来的是什么。
首先aaa的第一行,右边join bbb的第一行,完了吗?没有,接下来还有bbb的第二行,第三行……直到最后一行,所以先是得到了aaa的第一行和bbb的所有行的连接,然后还有aaa的第二行……直到最后一行,那么最后就得到了aaa和bbb的全连接,记录数自然是行数相乘(注意实际上不一定是按照单独查询aaa的行号来匹配,数据库按照自己的方法来全连接)。
那么很显然,你3个表全连接就是行数之积了。
你在你的最后一句select里面,加上where条件,比如aaa的某字段=bbb的某字段,bbb的某字段=ccc的某字段,就相当于从这个全连接里过滤出你要的组合了。
一般情况下要注意避免这样的全连接,要有目的的使用left join或者right join,因为系统可能先生成笛卡尔积,这样会大大占用系统资源,当此临时结果过大,会将临时表写入磁盘而不是内存(因为装不下),就会极大影响查询效率。
全部回答
- 1楼网友:街头电车
- 2021-02-07 05:01
我。。知。。道
加。。我。。私。。聊
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯