• 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

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

  • 相关阅读:
    泛型
    多播委托
    匿名方法
    委托
    正则表达式
    压缩和解压,文件读取练习
    Vue样式绑定
    Vue跑马灯
    Vue中的v-for遍历循环
    Vue框架
  • 原文地址:https://www.cnblogs.com/CatcherLJ/p/10606824.html
Copyright © 2020-2023  润新知