• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Mysql中where与on的区别及何时使用详析

    之前在写连表查询的时候,老是分不清楚where和on的区别,导致有时写的SQL会出现一点小的问题,这里专门写篇文章做下记录,如果你也分不清,那么请参考

    二者的区别及什么时候使用

    说明:区分on和where首先我们将连接分为内部连接和非内部连接,内部连接时on和where的作用是一样的,通常我们分不清它们的区别说的是非内部连接

    一般on用来连接两个表,只的是连接的条件,在内部连接时,可以省略on,此时它表示的是两个表的笛卡尔积;使用on连接后,mysql会生成一张临时表,而where就是在临时表的基础上,根据where子句来筛选出符合条件的记录,因此where是用来筛选的

    内部连接(inner join)

    说明:join默认为inner join,当为内部连接时,on和where的作用你可以看做是一样的

    非内部连接(left join、right join、full join等)

    一般分不清区别就是在使用非内部连接时,

    实例说明

    下面我们建两张表(每个表中插入4条数据,两个表通过trade_id来关联),来说明它们的区别,此文章的最下面附有SQL脚本,然后我们通过连表查询来说明on和where的区别

    1、inner join 连接两个表(无on和where)

    select * from hopegaming_main.test_1234 join hopegaming_main.test_1235

    等价于

    select * from hopegaming_main.test_1234,hopegaming_main.test_1235

    结果集是两个表的笛卡尔积

    2、inner join 连接两个表(有on)

    select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id 
    
    

    结果集是两个表有相同trade_id的数据

    3、inner join 连接两个表(有where)

    select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 where t1.trade_id = t2.trade_id 
    
    

    结果集是结果集是两个表有相同trade_id的数据

    从2和3的结果中我们可以看出,在使用inner join连接时,on和where的作用相等

    4、left join(下面以left join为例来连接两个表) 连接两个表

    select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id  
    
    

    结果集是以左面的表为基础,直接根据trade_id去右边查询相等的值然后连接,如果右表没有符合的数据,则都显示为null

    5、left join(下面以left join为例来连接两个表) 连接两个表,连接条件中有常量等式

    select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id  and t2.nick_name = 'wangwu'
    
    

    结果集是以左面的表为基础,如果on连接条件最后没有找到匹配的记录,则都显示null

    6、left join(下面以left join为例来连接两个表) 连接两个表,将常量表达式放入where子句中

    select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id    where t2.nick_name = 'wangwu''
    
    

    结果只会显示符合where子句的数据,只要没有符合的都不会显示,因为它是筛选连接后的临时表中的数据,而on
    只是连接,如果右边没有符合的数据,就显示null,而左边的数据都会显示,不会被过滤,这就是where和on最大的区别

    建表和插入数据的脚本:

    CREATE TABLE `hopegaming_main`.`test_1234` (
      `id` varchar(30) NOT NULL COMMENT '身份证号',
      `name` varchar(100) DEFAULT NULL COMMENT '姓名',
      `trade_id` varchar(100) DEFAULT NULL COMMENT '交易id',
      `gender` tinyint(4) DEFAULT NULL COMMENT '性别',
      `birthday` timestamp(6) NOT NULL COMMENT '出生日期',
      PRIMARY KEY (`id`) USING BTREE,
      KEY `idx_trade_id` (`trade_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
    
    INSERT INTO hopegaming_main.test_1234
    (id, name, trade_id, gender, birthday)
    VALUES('1', 'zhangsan', '123', 0, CURRENT_TIMESTAMP(6)),
    ('2', 'zhaosi', '124', 0, CURRENT_TIMESTAMP(6)),
    ('3', 'wangwu', '125', 0, CURRENT_TIMESTAMP(6)),
    ('4', 'maqi', '126', 0, CURRENT_TIMESTAMP(6));
    
    
    CREATE TABLE `hopegaming_main`.`test_1235` (
      `id` varchar(30) NOT NULL COMMENT '身份证号',
      `nick_name` varchar(100) DEFAULT NULL COMMENT '别名',
      `trade_id` varchar(100) DEFAULT NULL COMMENT '交易id',
      `address` varchar(100) DEFAULT NULL COMMENT '地址',
      `email` varchar(6) NOT NULL COMMENT '出生日期',
      PRIMARY KEY (`id`) USING BTREE,
      KEY `idx_trade_id` (`trade_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
    
    INSERT INTO hopegaming_main.test_1235
    (id, nick_name, trade_id, address, email)
    VALUES('1', 'zhangsan', '123', 'beijing', '0000'),
    ('2', 'wangwu', '123', 'tianjin', '1111'),
    ('3', 'maqi', '124', 'shanghai', '2222'),
    ('4', 'yangliu', '127', 'shanxi', '3333');
    
    

    总结

    到此这篇关于Mysql中where与on的区别及何时使用的文章就介绍到这了,更多相关Mysql中where与on区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • MySQL查询条件中放置on和where的区别分析
    • MySQL left join操作中on和where放置条件的区别介绍
    • mysql中left join设置条件在on与where时的用法区别分析
    上一篇:SQL实现LeetCode(178.分数排行)
    下一篇:SQL实现LeetCode(180.连续的数字)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Mysql中where与on的区别及何时使用详析 Mysql,中,where,与,的,区别,