手机版

分析mysql左(右)连接中on和where过滤器之间的区别

时间:2021-11-19 来源:互联网 编辑:宝哥软件园 浏览:

有这样一个问题,mysql在on和where上使用mysql中的左(右)join filter查询的数据是否有区别。可能光看两个关键词看不出什么问题。让我们用实际的例子来说明是否有区别。例如,有两种表结构。表结构1的复制代码如下: drop table if EXISTS A;创建表A(标识int(1)不为空,主键(标识) )引擎=MyISAM默认字符集=latin1表2的复制代码如下: drop table if EXISTS B;创建表B(标识int(1)不为空,主键(标识) )引擎=MyISAM默认字符集=latin1表插入数据的复制代码如下:插入A值(1);插入A值(2);插入A值(3);插入A值(4);插入A值(5);插入A值(6);表2插入数据的复制代码如下:插入B值(1);插入B值(2);插入B值(3);完成A表和B表后,数据如下:

语句1的复制代码如下:从a. id=b. id上的左联接b选择A.ID作为AID,b. id作为bid,其中b. ID3。语句2的复制代码如下:选择a. id为aid,B. id为bid从a. id=b.id和b.id3上的一个左联接b判断上述两个语句的查询结果是否一致。反正我没注意到这两个查询有什么区别[我以前没写过这样的sql。让我们看看实际结果语句1 的查询结果。

语句2的查询结果为:

发现两个查询之间存在差异。为什么会有差异与查询的顺序有关。我们知道标准查询关键词的执行顺序是从哪里开始分组按有顺序按【我记不太清楚】。]左联接在from range类中,因此先打开条件筛选表,然后这两个表左联接。对于where,左侧的连接结果将再次被过滤。第一条sql语句的查询过程等效如下:1:第一个左联接复制代码如下:选择a. id为aid,b. id为bid从a. id=b上的一个左联接b开始,id查询结果如下

2:在查询结果中过滤掉B.ID,BID2。这就是我们在上面看到的。第二条sql语句的查询过程相当于如下:1。根据on条件刷表相当于先筛选B表:

2:查询结果与表a保持连接,这就是为什么我们看到第二个查询的sql将保留表a.使用ON的时候和在哪里,一定要注意的地方:(1):ON后的过滤条件主要是针对关联表的【但不是针对主表的刷机条件】。例如,复制代码如下:从a.id=b.id和a.id=3上的左联接b选择a.id作为辅助,b.id作为出价。查询结果为

这很令人惊讶,不是吗?和我们预期的结果不一样,筛选出AID=3的数据。但是我们也发现,2中AID 1对应的AID的值为NULL,关联表只取符合表A筛选刷牙条件的值.即主表条件开启后,附表只取符合主表帅选条件的值,而主表仍然是整表。(2):主表的过滤条件应该放在where之后,而不是on之后(3):我们应该区别对待相关的表。如果要在条件查询后连接,应该把查询片放在ON之后。如果要在连接完成后进行筛选,应该把条件放在where (4)之后:对于关联的表,我们实际上可以先做子查询,再进行联接,所以第二个sql相当于复制了如下代码:选择a. id作为aid,b1。id作为左连接的出价(从b中选择b. id,其中b. id为3) b1on a. id=b1。id以上都是在mysql5.1上测试的。

版权声明:分析mysql左(右)连接中on和where过滤器之间的区别是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。