mysql中join查询效率问题_mysql where和 join on 哪个效率高

展开全部

关于 “A LEFT JOIN B ON 条件636f707962616964757a686964616f31333363373666表达式” 的一点提醒

ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行,即使on中包含有A表中的列的限制条件,也不会过滤A的任何数据(A的数据只会通过where过滤)。

如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据

在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。

让我们看一个 LFET JOIN 示例:

01

mysql> CREATE TABLE `product`

(

02

`id` int(10)

unsigned NOT NULL auto_increment,

03

`amount` int(10)

unsigned default NULL,

04

PRIMARY KEY (`id`)

05

)

ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

06

07

mysql> CREATE TABLE `product_details`

(

08

`id` int(10)

unsigned NOT NULL,

09

`weight` int(10)

unsigned default NULL,

10

`exist` int(10)

unsigned default NULL,

11

PRIMARY KEY (`id`)

12

)

ENGINE=MyISAM DEFAULT CHARSET=latin1

13

14

mysql> INSERT INTO product

(id,amount)

15

VALUES (1,100),(2,200),(3,300),(4,400);

16

Query

OK, 4 rows affected

(0.00 sec)

17

Records:

4 Duplicates: 0 Warnings: 0

18

19

mysql> INSERT INTO product_details

(id,weight,exist)

20

VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);

21

Query

OK, 4 rows affected

(0.00 sec)

22

Records:

4 Duplicates: 0 Warnings: 0

23

24

mysql> SELECT * FROM product;

25

+----+--------+

26

|

id | amount |

27

+----+--------+

28

|

1 | 100 |

29

|

2 | 200 |

30

|

3 | 300 |

31

|

4 | 400 |

32

+----+--------+

33

4 rows in set (0.00

sec)

34

35

mysql> SELECT * FROM product_details;

36

+----+--------+-------+

37

|

id | weight | exist |

38

+----+--------+-------+

39

|

2 | 22 | 0 |

40

|

4 | 44 | 1 |

41

|

5 | 55 | 0 |

42

|

6 | 66 | 1 |

43

+----+--------+-------+

44

4 rows in set (0.00

sec)

45

46

mysql> SELECT * FROM product LEFT JOIN product_details

47

ON (product.id

= product_details.id);

48

+----+--------+------+--------+-------+

49

|

id | amount | id | weight | exist |

50

+----+--------+------+--------+-------+

51

|

1 | 100 | NULL | NULL | NULL |

52

|

2 | 200 | 2 | 22 | 0 |

53

|

3 | 300 | NULL | NULL | NULL |

54

|

4 | 400 | 4 | 44 | 1 |

55

+----+--------+------+--------+-------+

56

4 rows in set (0.00

sec)

ON 子句和 WHERE 子句有什么不同?

一个问题:下面两个查询的结果集有什么不同么?

1

1. SELECT * FROM product LEFT JOIN product_details

2

ON (product.id

= product_details.id)

3

AND product_details.id=2;

4

2. SELECT * FROM product LEFT JOIN product_details

5

ON (product.id

= product_details.id)

6

WHERE product_details.id=2;

用例子来理解最好不过了:

01

mysql> SELECT * FROM product LEFT JOIN product_details

02

ON (product.id

= product_details.id)

03

AND product_details.id=2;

04

+----+--------+------+--------+-------+

05

|

id | amount | id | weight | exist |

06

+----+--------+------+--------+-------+

07

|

1 | 100 | NULL | NULL | NULL |

08

|

2 | 200 | 2 | 22 | 0 |

09

|

3 | 300 | NULL | NULL | NULL |

10

|

4 | 400 | NULL | NULL | NULL |

11

+----+--------+------+--------+-------+

12

4 rows in set (0.00

sec)

13

14

mysql> SELECT * FROM product LEFT JOIN product_details

15

ON (product.id

= product_details.id)

16

WHERE product_details.id=2;

17

+----+--------+----+--------+-------+

18

|

id | amount | id | weight | exist |

本回答由提问者推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值