left join on XXX and XXX 和 left join on XXX where XXX 的区别

结论:

通过多表联查查询数据时,数据库会产生一个中间临时表,然后将临时表返回给用户。
1、ON条件是在生成临时表时使用的条件,它不管ON中的条件是否为真,都会返回左边表中的记录;
2、WHERE条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有LEFT JOIN的含义(必须 返回左边表的记录)了,条件不为真的就全部过滤掉;
3、AND 是过滤之后再连接,WHERE是连接之后再过滤。

一、应用场景

1> SELECT 
         A.*,  B.* 
   FROM 
         Table A LEFT JOIN Table B ON  ***  AND  ***

2> SELECT 
         A.*,  B.* 
   FROM 
         Table A LEFT JOIN Table B ON  ***  WHERE  ***

二、示例

表结构及数据:
CREATE TABLE product (
  id int(11) unsigned NOT NULL COMMENT 'ID',
  name varchar(32) NOT NULL DEFAULT '' COMMENT '物品名称',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE price (
  id int(11) unsigned NOT NULL COMMENT ID,
  price int(11) unsigned NOT NULL DEFAULT '0' COMMENT '物品价格',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO product (id, name) VALUES ('1', 'A');
INSERT INTO product (id, name) VALUES ('2', 'B');
INSERT INTO product (id, name) VALUES ('3', 'C');

INSERT INTO price (id, price) VALUES ('1', '100');
INSERT INTO price (id, price) VALUES ('2', '200');
(1) left join on 后跟AND查询
SELECT
    A.id productId,
    A.name name,
    B.id priceId,
    B.price price
FROM
    product A
LEFT JOIN price B ON A.id = B.id
AND B.price = 100

查询结果:

《left join on XXX and XXX 和 left join on XXX where XXX 的区别》 后跟AND结果.jpg

(2) left join on 后跟WHERE查询
SELECT
    A.id productId,
    A.name name 
    B.id priceId,
    B.price price
FROM
    product A
LEFT JOIN price B ON A.id = B.id
WHERE B.price = 100

查询结果:

《left join on XXX and XXX 和 left join on XXX where XXX 的区别》 后跟WHERE结果.jpg

【注意】left join会以左表(主表)的基准数据,凡左表出现的数据均会被查询出来,然后join右表(从表),只要关联上的就需要查出来,如果相应的字段没有值或不符合条件的话就置为NULL。

    原文作者:michael_wlq
    原文地址: https://www.jianshu.com/p/653ac94a0098
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞