zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    mysql表结构同步
    关于Java8中lambda约简函数reduce的一个计算问题
    激烈的歌曲有助于编程
    今天刷了数据解构与算法这门课 感觉略有收获
    我有一个好朋友 他的名字叫刘洋 他的ID是北极的大企鹅 他的技术不错 他渴望成为架构师 猎头们路过可以去他的博客看看
    缓存雪崩,缓存击穿,缓存穿透
    celery
    Redis
    django 缓存的使用
    base64 加密
  • 原文地址:https://www.cnblogs.com/CatcherLJ/p/10606824.html
Copyright © 2011-2022 走看看