全部博文(2065)
分类: Mysql/postgreSQL
2010-06-01 15:43:11
MYSQL一个查询语句引起的
情况是这样的。我有一个表A字段如下:
ID 编号 IP
记录示例
1 SN00001
2 SN00001 192.365.336.33
含义就表示:一台服务器定义了两个IP值
现在我的另外一个表里面的保存的是这台服务器的性能数据B表。
记录示例
1 SN00001
其中这个IP值是随机的一个IP(即有可能是外网IP也有可能是内网IP)
查询的时候的SQL语句:
select distinct c.* from B c,A a
where a.ip = c.server_ip and a.server_ip = '124.222.222.222'
这样查询的话我们可以这样来理解这句SQL语句的含义
这个SQL语句分析从右边往左边来分析。
第一步:a.server_ip = '124.222.222.222'
提取A表里面符合条件的记录。这样的话就是全部的外网IP记录了。
第二步:定义a.ip = c.server_ip
其实这个时候的server_ip已经是外网IP了。所以在我们的B表肯定是找不到记录了。
进一步:
select distinct c.* from B c,A a,A b
where a.ip = c.server_ip and a.id=b.id
and a.server_ip =
'124.222.222.222'
这样就可以。为什么呢?解释一下
第1步:依据a.server_ip = '124.222.222.222'
提取这一步。会返回一个小的结果集。这个结果集其实是
相当于做了这样的一个SQL:
Select * from A a,A b
where a.ip = ‘’
这个其实是相当于是A*A做了笛卡尔积处理。返回的是:
1 SN00001
2 SN00001 192.365.336.33
即这两个IP还是会提取出来。
有了这个结果集之后再进一步查询a.ip = c.server_ip
会将那个数据集进一步分割过滤。
即进一步做笛卡尔积处理