结论:
通过多表联查查询数据时,数据库会产生一个中间临时表,然后将临时表返回给用户。
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
查询结果:
后跟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
查询结果:
后跟WHERE结果.jpg
【注意】left join会以左表(主表)的基准数据,凡左表出现的数据均会被查询出来,然后join右表(从表),只要关联上的就需要查出来,如果相应的字段没有值或不符合条件的话就置为NULL。
网友评论