mysql 中 where 与 on 的区别

以前从来没有搞清楚多表连接的时候ON的语法,只知道它后面是多表连接的连接条件。

今天,专门实践了一下,ON 带一个连接条件ON带多个连接条件 以及 ON的条件后面还有WHERE子句对查询结果的影响。

CREATE TABLE `product` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `amount` INT(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MYISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
INSERT INTO product (id,amount) VALUES (1,100),(2,200),(3,300),(4,400);

CREATE TABLE `product_details` (
  `id` INT(10) UNSIGNED NOT NULL,
  `weight` INT(10) UNSIGNED DEFAULT NULL,
  `exist` INT(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=latin1  
INSERT INTO product_details (id,weight,exist) VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);

下面就开始 真正的学习吧!

1、ON带一个连接条件 平常使用的最常用的连接,在 ON 的子句中,有没有括号是一样的,不影响查询效果 
 SELECT * FROM product LEFT JOIN product_details ON (product.id = product_details.id);

查询结果如图所示:

2、 ON带多个连接条件 

SELECT * FROM product LEFT JOIN product_details
ON product.id = product_details.id AND product_details.id=2;

SELECT * FROM product LEFT JOIN product_details
ON product.id = product_details.id AND product.amount=300;

SELECT * FROM product LEFT JOIN product_details
ON product.id = product_details.id AND product.amount=400;

查询结果一:

查询结果二:

查询结果三:

 从这3个查询结果可以看出,实际上on的子句的作用是 筛选 连接表(product_details )要显示的内容,并不影响查询结果的条数

3、ON的连接条件后还有WHERE子句 
SELECT * FROM product LEFT JOIN product_details 
ON product.id = product_details.id WHERE product_details.id=2;

 查询结果:

从这个查询结果可以看出,ON后的WHERE子句的实际作用是 对多表连接的结果进行筛选,满足条件的记录才能被留下,所以他会影响 最终的查询记录数

通过以上案例的实践,最终了解了ON子句和WHERE子句的区别,下面就来验证一下刚刚学习到的两个知识点是否理解正确吧!

SELECT * FROM product a LEFT JOIN product_details b
ON a.id=b.id AND b.weight!=44 AND b.exist=0   WHERE b.id IS NULL;
       
SELECT * FROM product a LEFT JOIN product_details b
ON a.id=b.id AND b.weight!=44 AND b.exist=1 WHERE b.id IS NULL;
       
SELECT * FROM product a LEFT JOIN product_details b
ON a.id=b.id WHERE b.id IS NULL OR b.weight=44 OR b.exist=1;

文章写得再好也需要你亲自去验证一下哦!

本博文借鉴于:https://www.cnblogs.com/zjfjava/p/6041445.html

如果文章对你有帮助,麻烦帮忙点个赞哦!嘿嘿!做一个靠谱的技术博主!

原文地址:https://www.cnblogs.com/CatcherLJ/p/10606824.html